15.2 C语言指针 有关sizeof 的数组和指针笔试题解析

❗注意:地址内存大小在x64环境下是8个字节,在x86环境下是4个字节
不同的环境对类型的大小无影响
1.一维数组

#include<stdio.h>

int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n",sizeof(a));
	//16  //整个数组的内存大小

	printf("%d\n",sizeof(a+0));
	//4或8 //a表示数组首元素地址,则计算首元素地址内存大小  a+0==&a[0]

	printf("%d\n",sizeof(*a));
	//4   //*a==a[0]  第一个元素内存大小

	printf("%d\n",sizeof(a+1));
	//4或8 //第二个元素地址内存大小  a+1==&a[1]

	printf("%d\n",sizeof(a[1]));
	//4  //第2个元素内存大小

	printf("%d\n",sizeof(&a));
	//4或8 //&a整个数组地址 计算整个数组地址内存大小

	printf("%d\n",sizeof(*&a));
	//16  //整个数组内存大小

	printf("%d\n",sizeof(&a+1));
	//4或8 //跳过整个数组后的地址内存大小

	printf("%d\n",sizeof(&a[0]));
	//4或8 //首元素地址内存大小

	printf("%d\n",sizeof(&a[0]+1));
	//4或8 //跳过第一个元素地址内存大小==第二个元素地址内存大小
	return 0;
}

2.字符数组

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n",sizeof(arr));
	//6    //整个数组内存大小 

	printf("%d\n", sizeof(arr + 0));
	//4或8 //arr是首元素地址  计算的是首元素地址内存大小

	printf("%d\n",sizeof(*arr));
	//1    //*arr==arr[0] 计算的是首元素内存大小

	printf("%d\n",sizeof(arr[1]));
	//1   //计算第二个元素内存大小

	printf("%d\n",sizeof(&arr));
	//4或8 //计算整个数组地址内存大小

	printf("%d\n",sizeof(&arr+1));
	//4或8 //跳过整个数组后的地址内存大小

	printf("%d\n",sizeof(&arr[0]+1));
	//4或8 //跳过第一个数组后的地址内存大小==第二个数组地址内存大小


	return 0;
}
int main()
{
	char arr[] = "abcdef";
	printf("%d\n",sizeof(arr));
	//7  //整个数组内存大小
	
	printf("%d\n",sizeof(arr+0));
	//4或8 //首元素地址内存大小

	printf("%d\n",sizeof(*arr));
	//1    //*arr==arr[0] 第一个元素内存大小

	printf("%d\n",sizeof(arr[1]));
	//1    //第二个元素内存大小

	printf("%d\n",sizeof(&arr));
	//4或8 //整个数组地址内存大小

	printf("%d\n",sizeof(&arr+1));
    //4或8 //跳过整个数组的地址内存大小

	printf("%d\n",sizeof(&arr[0]+1));
	//4或8 //跳过第一个数组的地址内存大小==第二个数组地址内存大小

	return 0;
}
int main()
{
	char* p = "abcdef";//p存放a的地址,指向a
	printf("%d\n",sizeof(p));
	//4 或 8//a的地址内存大小

	printf("%d\n",sizeof(p+1));
	//4 或 8//跳过a的地址内存大小==b的地址内存大小

	printf("%d\n",sizeof(*p));
	//1     //*p==a  计算a的内存大小

	printf("%d\n",sizeof(p[0]));
	//1    //a的内存大小

	printf("%d\n",sizeof(&p));
	//4 或 8//p的地址内存大小

	printf("%d\n",sizeof(&p+1));
	//4 或 8//跳过p后的地址内存大小

	printf("%d\n",sizeof(&p[0]+1));
	//4 或 8//跳过a后的地址内存大小
	return 0;
}

3.二维数组

int main()
{
	int a[3][4] = { 0 };
	printf("%d\n",sizeof(a));
	//48  //整个数组内存大小3*4*4=48

	printf("%d\n",sizeof(a[0][0]));
	//4   //第一个元素内存大小

	printf("%d\n",sizeof(a[0]));
	//16  //第一行数组内存大小  4*4=16
	//a[0]是第一行数组名

	printf("%d\n",sizeof(a[0]+0));
	//4或8  //第一行第一个a[0][0]的地址内存大小
	//a[0]是第一行数组名,没有单独放在sizeof内部
	//所以该数组名表示数组首元素的地址

	printf("%d\n",sizeof(*(a[0]+1)));
	//4   //第一行第二个元素的内存大小

	printf("%d\n",sizeof(a+1));
	//4或8  //跳过第一行元素的地址内存大小==第二行元素地址内存大小
	
	printf("%d\n",sizeof(*(a+1)));
	//16 //跳过第一行的内存大小==第二行内存大小4*4

	printf("%d\n",sizeof(&a[0]+1));
   //4或8	//跳过第一行元素的地址内存大小==第二行元素地址内存大小
   //a[0]是第一行数组名,&a[0]是第一行地址,&a[0]+1是第二行地址

	printf("%d\n",sizeof(*(&a[0]+1)));
	//16	//跳过第一行的元素内存大小==第二行元素内存大小
	 
	printf("%d\n", sizeof(*a));
	//16//第一行元素内存大小
	//a是数组首元素的地址,也就是第一行地址

	printf("%d\n", sizeof(a[3]));
	//16//第四行元素内存大小 
	return 0;
}

❗易模糊点:
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值