我有一些代码(下面),我将整数数组的地址分配给指针。我以两种方式分配并期望两种不同的输出,但在两种情况下输出都是相同的。
main()
{
int a[]={11,2,3};
int *p=&a;
printf("%d",*(p+1));
}
它应该给我一些垃圾值,因为p
指向下一个1D数组
main()
{
int a[]={11,2,3};
int *p=a;
printf("%d",*(p+1));
}
这应打印2
。
然而,这些功能同时打印2
。
这不是我的预期。谁能解释发生了什么?
任何人都可以告诉我如何使指针指向整个数组而不是单个元素。
答案 0 :(得分:3)
这是因为在这种情况下,裸数组标识符会衰减为类型为int *
的指针。
&a
计算指向整个数组(类型为int (*)[3]
)的指针,尽管它的类型不同,但它与第一个元素的地址是相同的地址。
答案 1 :(得分:3)
如果您编译第一个程序,您将收到编译器警告:
warning: initialization from incompatible pointer type
因为p
的类型是指向整数的指针,但&a
的类型是pointer to array of integer. Compiling the second program is fine, because again
p has type
int * and
a has type
int []`(即整数数组)但在C中,你可以传递/分配一个整数数组到一个整数指针就好了。指针的值被赋予数组的起始地址。
在C中定义带方括号的数组时,数组会立即放在堆栈或数据部分中,因此数组的起始地址与数组变量本身的地址相同!这与使用malloc
创建的数组不同。
这对您意味着什么:假设变量a
分配在地址4e78ccba。这意味着&a
是4e78ccba。但是在C中,a
在传递/分配给指针时的值是定义为数组开头的地址,所以这也是 4e78ccba。
同样,如果你用malloc设置东西会有所不同。 (尝试!!)顺便说一下,注意警告。 :)这是一个有趣的问题,因为C类型很弱,它只在第一种情况下给你一个警告。一个stronly类型的语言不会喜欢整数指针与整数数组指针的混合。
<强>附录强>
以下是一些代码,展示了如何实际区分指向第一个元素的指针和指向整个数组的指针:
#include <stdio.h>
int main() {
/* a is an array of ints, but can be used as a pointer to int */
int a[] = {11, 2, 3};
/* Using a as an int pointer */
int* p = a;
printf("%d\n", *(p+1));
/* Now here is how to make a pointer to the array itself! */
int (*q)[] = &a;
printf("%d\n", (*q)[2]);
return 0;
}
该程序输出
2
3
答案 2 :(得分:1)
两次都是一个指向int的指针,无论指针实际来自何处,p + 1只会以int的大小前进。