如果我定义一个数组arr[]
并定义一个指向它的指针:
int *p=arr;
如果arr
(就地址而言)的值为0x1234
。 p
的价值是多少?它会是一样的吗?
答案 0 :(得分:3)
是。价值是一样的。 要检查这一点,请尝试
printf("arr=%p p=%p\n", arr, p);
答案 1 :(得分:0)
p
的值与arr
的值相同。
原因:数组的名称表示基址,您将其分配给指针p
。
答案 2 :(得分: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
答案 3 :(得分:0)
p的值将是相同的。 如果我们假设arr的值是 0x1234 ,则指针p将采用相同的值。这是因为指针p有足够的空间来保存arr数组的地址......
答案 4 :(得分:0)
int arr[] = {1, 2, 3, 4, 5, 6, 7};
int *p = arr;
arr
和p
的值相同。
但价值只是变量的一部分。变量由值和类型组成。 arr
和p
的类型不同。
您可能希望阅读comp.lang.c FAQ的第6部分。
答案 5 :(得分:0)
“arr
”的值不是地址。 arr
是数组类型的变量,其“value”是一个数组,即int
个元素的序列。 “值”仅在类型的上下文中有意义。
在需要指针类型的上下文中,可以将数组类型的表达式(例如arr
)隐式转换为指针类型的rvalue表达式(值为数组的第一个元素的地址)。 int *p=arr;
就是这样的背景。
答案 6 :(得分:-2)
数组名称是指向它的第一个元素的指针。例如:
int a[5];
然后,
一
是一个指向元素a [0]的int *。如果arr的值是
0×1234
p的值将是相同的。但要小心使用p访问数组(应该考虑数组范围)。