2011-04-12 84 views
0

指针与数组冲突

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

表示一个维数组,那么什么是输出由下面的语句

printf("%d",p); 

是它的一个地址给?如果它是一个地址,那么告诉我它属于哪个元素,请详细解释

+0

这里没有阵列。 – 2011-04-12 16:45:32

+0

这些不是您正在寻找的阵列? – MJB 2011-04-12 16:54:01

+0

@JAMES @ MJB在数组的情况下,数组的名字将会给我第一个元素的地址,然后如果是指针,它将会使我反弹的东西,即语句printf(“%d” ,p); – nobalG 2011-04-12 16:59:27

回答

1
p = &b 

表示阵列!正如我解释here,他们不是一回事。 b只是一个整数值。如果您声明bint 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))。

+0

是的,我知道了,thankeww – nobalG 2011-04-12 17:10:03

+0

你能告诉我,我们只能使用%u打印元素的地址,或者%d,%f ,,,可以在各种编译器中正常工作 – nobalG 2011-04-12 17:13:31

+0

@Alfred Nobel :你应该使用打印指针值的%p – BlackBear 2011-04-12 17:16:24

-1

该数组的第一个元素的地址。 (如果B为一个数组) 使用的p ++通过阵列滚动

+0

'p ++'不会帮助您滚动数组,它只会将指针的值增加1(与增加整数的方式大致相同)。您应该使用'[]'运算符来访问数组的元素。 – 2011-04-12 16:58:23

+0

我的意思是p ++会给你下一个数组元素的地址。 – anon 2011-04-12 18:00:25

0

指针而不是表示一维数组。它只是一个指向整数的指针。它可能指向数组的第一个元素,例如当你做int* p = new int[6]时,但这是完全不同的;在这种情况下,您将为六个整数的新数组分配空间,并将第一个数组的地址(或数组的开头)存储在p中。

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

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,或者作为大小为1的一维数组中的第一个(也是唯一)元素。那么,接踵而来的是合法的,并给出在这两种情况下有意义的结果:

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

但是这几乎是其中的相似之处。