让
int*p ,b = 5;
p = &b;
表示ONE DIMENSIONAL数组,然后是以下语句
给出的输出printf("%d",p);
是地址吗?如果它是一个地址然后告诉我它属于哪个元素,请清楚解释
答案 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 ++滚动数组