通过指针引用数组的见怪不怪的用法:
代码如下:
#include<stdio.h>
//数组与指针见怪不怪的用法(重要面试)
int main()
{
int arr[3]={1,2,3};
int *p=arr;
printf("sizeof arr is:%d\n",sizeof(arr));//3*4=12
printf("sizeof arr is:%d\n",sizeof(p));//操作系统中用8个字节表示一个地址
printf("sizeof int is:%d\n",sizeof(int ));//一个整型占4个字节
printf("sizeof pointer is:%d\n",sizeof(int *));//操作系统中用8个字节表示一个地址
printf("sizeof pointer is:%d\n",sizeof(char *));//操作系统中用8个字节表示一个地址
printf("sizeof pointer is:%d\n",sizeof(float *));//操作系统中用8个字节表示一个地址
printf("%d\n",*p);
printf("%d\n",*arr);
printf("%d\n",p[2]);
printf("%d\n",arr[2]);
for(int i=0;i<3;i++)
{
printf("%d ",p[i]);
}
putchar('\n');
for(int i=0;i<3;i++)
{
printf("%d ",*(arr+i));
}
/*
for(int i=0;i<3;i++)
{
printf("%d ",*arr++);//这种写法不对,指针作为一个地址变量,可以自增,而数组名代表数组首地址作为一个
} */ //地址常量不可以自增
return 0;
}
运行结果如下:
如上面代码所示:
1、printf(“%d\n”,*p);
printf(“%d\n”,*arr);
printf(“%d\n”,p[2]);
printf(“%d\n”,arr[2]);
for(int i=0;i<3;i++)
{
printf("%d ",p[i]);
}
putchar(‘\n’);
for(int i=0;i<3;i++)
{
printf("%d ",*(arr+i));
}
因为指针p和数组名都是表示一个数组的首地址,相当于&arr[0],然后在一般情况下,指针p和数组名有相同的使用方式
2、
for(int i=0;i<3;i++)
{
printf("%d ",*arr++);
}
当这种自增或自减的情况只有指针可以,而用数组名就不对了,因为这种写法不对,编译时会报错,因为指针作为一个地址变量,可以自增,而数组名代表数组首地址作为一个地址常量不可以自增
3、在使用sizeof关键字的时候:
printf(“sizeof arr is:%d\n”,sizeof(arr));//3*4=12
printf(“sizeof arr is:%d\n”,sizeof§);//操作系统中用8个字节表示一个地址 printf(“sizeof int is:%d\n”,sizeof(int ));//一个整型占4个字
printf(“sizeof pointer is:%d\n”,sizeof(int *));//操作系统中用8个字节表示一个地址
printf(“sizeof pointer is:%d\n”,sizeof(char *));//操作系统中用8个字节表示一个地址
printf(“sizeof pointer is:%d\n”,sizeof(float *));//操作系统中用8个字节表示一个地址
当使用sizeof关键字来计算数组容量时,如果使用指针替换数组名,则算出的容量和数组本身的容量对不上,如上所示,此时的数组大小为12,而用指针代替数组名算出来的是8,因为此时sizeof计算的是指针变量的容量,在64位的机器中,表示一个地址要用8个字节,因此不管你用哪种类型的指针去传给sizeof,算出来的都是8,而不是数组本身的容量大小