-5

如果我定义一个数组arr[]并定义一个指向它的指针:

int *p=arr;

如果arr(就地址而言)的值为0x1234. 的价值是p多少?会一样吗?

4

7 回答 7

3

是的。值是一样的。要检查这一点,只需尝试

printf("arr=%p p=%p\n", arr, p);
于 2014-08-19T07:16:25.887 回答
0

的值p将与 的值相同arr

原因:数组的名称代表基地址,您将其分配给指针p

于 2014-08-19T07:21:27.377 回答
0

您可以使用 printf 函数或 gdb调试器轻松检查变量值等内容。

以下是使用 gdb 解决问题的方法:

gdb a.out //you must have compile with -g
b main.c:10 //place a breakpoint at the 10th line of main.c, in this case 10 is arbitrary it just need to be after your variable assignement
r //run
p &arr //print the address of arr
p p //print the value of p
p p == &arr //print 1 if p == &arr
于 2014-08-19T09:13:18.433 回答
0

p 的值将是相同的。如果我们假设如您所说的 arr 的值为0x1234,则指针 p 将采用相同的值。这是因为指针 p 有足够的空间来保存 arr 数组的地址...

于 2014-08-19T09:25:43.930 回答
0
int arr[] = {1, 2, 3, 4, 5, 6, 7};
int *p = arr;

arr和的值p相同。

但是值只是变量的一部分。变量由值和类型组成。的种类arrp种类不同。

您可能想阅读comp.lang.c FAQ的第 6 部分。

于 2014-08-19T09:28:40.597 回答
0

“值arr”不是地址。arr是数组类型的变量,它的“值”是一个数组,即int元素的序列。“值”仅在类型的上下文中才有意义。

在需要指针类型的上下文中,数组类型的表达式(例如arr)可以隐式转换为指针类型的右值表达式(其值是数组的第一个元素的地址)。int *p=arr;就是这样一个语境。

于 2014-08-19T21:30:03.753 回答
-2

数组名是指向它的第一个元素的指针。例如:

int a[5];

然后,

一个

是一个 int *,它指向元素 a[0]。如果 arr 的值为

0x1234

p 的值将是相同的。但要小心使用 p 访问数组(应考虑数组范围)。

于 2014-08-19T07:32:52.450 回答