int*p ,b = 5;
p = &b;
表示一个维数组,那么什么是输出由下面的语句
printf("%d",p);
是它的一个地址给?如果它是一个地址,那么告诉我它属于哪个元素,请详细解释
int*p ,b = 5;
p = &b;
表示一个维数组,那么什么是输出由下面的语句
printf("%d",p);
是它的一个地址给?如果它是一个地址,那么告诉我它属于哪个元素,请详细解释
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)
)。
该数组的第一个元素的地址。 (如果B为一个数组) 使用的p ++通过阵列滚动
'p ++'不会帮助您滚动数组,它只会将指针的值增加1(与增加整数的方式大致相同)。您应该使用'[]'运算符来访问数组的元素。 – 2011-04-12 16:58:23
我的意思是p ++会给你下一个数组元素的地址。 – anon 2011-04-12 18:00:25
指针而不是表示一维数组。它只是一个指向整数的指针。它可能指向数组的第一个元素,例如当你做int* p = new int[6]
时,但这是完全不同的;在这种情况下,您将为六个整数的新数组分配空间,并将第一个数组的地址(或数组的开头)存储在p
中。
如果您打印p
它将打印它存储的内存地址。如果p
“表示数组”(强调引号),那么您将打印该数组的第一个元素的地址。
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,或者作为大小为1的一维数组中的第一个(也是唯一)元素。那么,接踵而来的是合法的,并给出在这两种情况下有意义的结果:
printf("%d is stored at %p\n", *p, p);
printf("%d\n",p[0]);
但是这几乎是其中的相似之处。
这里没有阵列。 – 2011-04-12 16:45:32
这些不是您正在寻找的阵列? – MJB 2011-04-12 16:54:01
@JAMES @ MJB在数组的情况下,数组的名字将会给我第一个元素的地址,然后如果是指针,它将会使我反弹的东西,即语句printf(“%d” ,p); – nobalG 2011-04-12 16:59:27