指针与数组名的见怪不怪的用法

通过指针引用数组的见怪不怪的用法:

代码如下:

#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,而不是数组本身的容量大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值