指针&数组冲突

时间:2011-04-12 16:41:51

标签: pointers

int*p ,b = 5;
p = &b;

表示ONE DIMENSIONAL数组,然后是以下语句

给出的输出
printf("%d",p);

是地址吗?如果它是一个地址然后告诉我它属于哪个元素,请清楚解释

4 个答案:

答案 0 :(得分:1)

p = &b

表示数组!正如我解释here,他们不是一回事。 b只是一个整数值。如果您将b声明为int b[] = {1, 2, 3};,则p将指向b的第一个元素。

printf("%d",p);

这将打印p的值,由于p是指针并指向b,因此会打印b的地址。 printf("%d", &b);会得到相同的结果 顺便说一句,如果b是一个数组,b[5]将被翻译成*(p + 5),所以你可以通过在数组的开头添加元素的数量来读取(和写入)值。并且b[5] == p[5] == *(b + 5) == *(p + 5) !!!但不是因为数组和指针是相同的,只是因为数组的名称转换为它的第一个元素的地址。
作为旁注,编译器在编译到汇编时总是使用指针表示法(*(base + offset))。

答案 1 :(得分:0)

p指针表示一维数组。它只是一个指向整数的指针。它可能指向数组的第一个元素,就像你执行int* p = new int[6]时那样,但这是完全不同的东西;在这种情况下,您为一个包含六个整数的新数组分配空间,并在p中存储第一个(或数组的开头)的地址。

如果您打印p,它将打印它存储的内存地址。如果p“表示数组”(强调引号),那么您将打印数组的第一个元素的地址。

答案 2 :(得分:0)

int*p ,b = 5;
p = &b;

完全等同于:

int b = 5;
int *p = &b;

p最终成为指向int的指针。现在确实这个代码对p中的内容有很大的影响(尽管b有一个完全不同的类型和值):

int b[1] = {5};
int *p = b; // or int *p = &b[0];

当然,在任何一种情况下,p都指向一个int,你可以将其视为一个简单的int,或者作为一个一维数组中的第一个(也是唯一的)元素。因此,接下来是合法的,并在两种情况下都给出了有意义的结果:

printf("%d is stored at %p\n", *p, p);
printf("%d\n",p[0]);

但这就是相似性结束的地方。

答案 3 :(得分:-1)

数组的第一个元素的地址。 (如果b是一个数组) 使用p ++滚动数组