目录
#这里分析一些关于指针的题,能够帮助我们更好理解指针,适合新手入门,有助于我们在写代码时避免写出更多错误。
//一维数组
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a+0));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a+1));
printf("%d\n", sizeof(a[1]));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(*&a));
printf("%d\n", sizeof(&a+1));
printf("%d\n", sizeof(&a[0]));
printf("%d\n", sizeof(&a[0]+1));
//字符数组
char arr[] = { 'a','b','c','d','e','f' };//6
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(*&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
请思考结果;
下面开始分析:(分析中4/8表示32位和64位环境中分别占用4字节和8字节)
一维数组
printf("%d\n", sizeof(a));
结果为20;
a是整型数组名,表示首元素地址,但是有两个特例:
sizeof(数组名)表示数组大小;
(&数组名)表示整个数组地址;
例:
int ax[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d", *((int*)(&ax+1)-1));
sizeof(ax);
结果为:10,40;
(1)&ax为整个二维数组地址,以40个字节进行加减,转化为(int*)后以4个字节加减,(int*)(&ax+1)-1)指向ax[1][5],值为10;
(2)ax是二维数组名sizeof(ax)表示二维数组大小;(ax表示首元素地址,即指向第一行的指针,是个数组指针,所以二维数组可以用数组指针来接受)
int ax[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
print_(ax);
return 0;
}
void print_(int(*p)[5])
{
for (int i = 0; i < 2; i++)
{
printf("\n\n\n%d %d %d %d %d", *(p[i]+0), *(p[i] + 1), *(p[i] + 2), *(p[i] + 3), *(p[i] + 4));
}
}
printf("%d\n", sizeof(a+0));
a为首元素地址,a基类型为int,加减一个int类型4个字节,a+0指向a[0],但是sizeof是计算数据类型大小,由于是指针(地址)类型,不论是什么类型指针,在同一个环境中大小都是4/8Byte,所以结果为4/8
printf("%d\n", sizeof(*a));
*a解引用值为a[0]=1,结果为4,一个整型大小;
printf("%d\n", sizeof(a+1));
结果为4/8,指向a[1];
printf("%d\n", sizeof(a[1]));
*(p+i)和p[i]等价,所以解引用后a[1]值为2,为整型类型,结果4;
printf("%d\n", sizeof(&a));
&数组名,计算数组地址大小,结果为4/8;
printf("%d\n", sizeof(*&a));
*&a访问一个数组大小,或者sizeof(*&a)等价于sizeof(a),结果为20;
printf("%d\n", sizeof(&a+1));
结果为4/8,指向的值未知;
printf("%d\n", sizeof(&a[0]));
取出首元素地址,计算首元素地址大小,结果为4/8;
printf("%d\n", sizeof(&a[0]+1));
取出首元素地址,+1是第二个元素地址,结果为4/8;
字符数组
char arr[] = { 'a','b','c','d','e','f' };//6
字符数组包含6个字符,不含'\0';
printf("%d\n", sizeof(arr));
这个同样也很简单,计算数组大小,结果为6;
printf("%d\n", sizeof(arr+0));
结果为4/8;
printf("%d\n", sizeof(*arr));
arr只有sizeof(arr)形式时才时整个数组,*arr是首元素的值,结果为1;
printf("%d\n", sizeof(arr[1]));
计算第二个元素的大小,结果为1;
printf("%d\n", sizeof(&arr));
很简单,&arr是整个数组地址,计算结果为4/8;
printf("%d\n", sizeof(*&arr));
*&arr计算数组大小,结果为6;
printf("%d\n", sizeof(&arr+1));
计算的是地址,但指向的值未知,结果为4/8;
printf("%d\n", sizeof(&arr[0]+1));
&arr[0]解引用加减以一个字节为单位,&arr[0]+1为第二个元素地址,结果为4/8;
验证: