数组笔试题解析

指针和数组笔试题解析

1、一维数组

int a[] = {1, 2, 3, 4};
printf("%d\n",sizeof(a));		//16,整个数组,大小为16个字节
printf("%d\n",sizeof(a+0));		//4,首元素的地址,地址即指针,指针大小为4个字节
printf("%d\n",sizeof(*a));		//4,首元素,为int类型,大小为4个字节
printf("%d\n",sizeof(a+1));		//4,第二个元素的地址
printf("%d\n",sizeof(a[1]));	//4,第二个元素的地址
printf("%d\n",sizeof(&a));		//4,整个数组的地址
printf("%d\n",sizeof(*&a));		//16,整个数组的内容
printf("%d\n",sizeof(&a+1));	//4,下一个数组的地址
printf("%d\n",sizeof(&a[0]));	//4,首元素的地址
printf("%d\n",sizeof(&a[0]+1));	//4,第二个元素的地址

2、字符数组

char arr[] = {'a','b','c','d','e','f'};
//字符数组初始化时为写入'\0',所以不包括'\0'
printf("%d\n", sizeof(arr));		//6,整个数组
printf("%d\n", sizeof(arr+0));		//4,首元素的地址
printf("%d\n", sizeof(*arr));		//1,首元素
printf("%d\n", sizeof(arr[1]));		//1,第二个元素
printf("%d\n", sizeof(&arr));		//4,整个数组的地址
printf("%d\n", sizeof(&arr+1));		//4,下一个数组的地址
printf("%d\n", sizeof(&arr[0]+1));	//4,第二个元素的地址

//strlen() 直到遇到'\0'停止,所求字符串长度不包括'\0'
//strlen(const char*)
printf("%d\n", strlen(arr));		//随机值,设为10
printf("%d\n", strlen(arr+0));		//随机值10
printf("%d\n", strlen(*arr));		//ERROR,类型不匹配
printf("%d\n", strlen(arr[1]));		//ERROR,类型不匹配
printf("%d\n", strlen(&arr));		//随机值10,Warning(此处为数组指针类型)
printf("%d\n", strlen(&arr+1));		//随机值4
printf("%d\n", strlen(&arr[0]+1));	//随机值9


char arr[] = "abcdef";
//字符串在字符常量区自动写入'\0'
printf("%d\n", sizeof(arr));		//7
printf("%d\n", sizeof(arr+0));		//4
printf("%d\n", sizeof(*arr));		//1
printf("%d\n", sizeof(arr[1]));		//1
printf("%d\n", sizeof(&arr));		//4
printf("%d\n", sizeof(&arr+1));		//4
printf("%d\n", sizeof(&arr[0]+1));	//4

printf("%d\n", strlen(arr));		//6
printf("%d\n", strlen(arr+0));		//6
printf("%d\n", strlen(*arr));		//ERROR
printf("%d\n", strlen(arr[1]));		//ERROR
printf("%d\n", strlen(&arr));		//6,Warning
printf("%d\n", strlen(&arr+1));		//随机值
printf("%d\n", strlen(&arr[0]+1));	//5


char *p = "abcdef";
printf("%d\n", sizeof(p));			//4
printf("%d\n", sizeof(p+1));		//4
printf("%d\n", sizeof(*p));			//1
printf("%d\n", sizeof(p[0]));		//4
printf("%d\n", sizeof(&p));			//4,p变量的地址
printf("%d\n", sizeof(&p+1));		//4,下一个指针的地址
printf("%d\n", sizeof(&p[0]+1));	//4

printf("%d\n", strlen(p));			//6
printf("%d\n", strlen(p+1));		//5
printf("%d\n", strlen(*p));			//ERROR
printf("%d\n", strlen(p[0]));		//ERROR
printf("%d\n", strlen(&p));			//ERROR,p的地址,为二级指针
printf("%d\n", strlen(&p+1));		//ERROR,下一个指针的地址,为二级指针
printf("%d\n", strlen(&p[0]+1));	//5

3、二维数组

int a[3][4] = {0};
printf("%d\n",sizeof(a));			//48
printf("%d\n",sizeof(a[0][0]));		//4,第一个int类型的变量
printf("%d\n",sizeof(a[0]));		//16,可将a[0]类似看作数组名,a[0]中包括4个int类型的变量
printf("%d\n",sizeof(a[0]+1));		//4,a[0][1]的地址
printf("%d\n",sizeof(*(a[0]+1)));	//4,a[0][1]的内容
printf("%d\n",sizeof(a+1));			//4,类似于a[1][0]的地址
printf("%d\n",sizeof(*(a+1)));		/16,a[1]的内容
printf("%d\n",sizeof(&a[0]+1));		//4,&a[0]为数组指针,加1为a[1]的地址
printf("%d\n",sizeof(*(&a[0]+1)));	//16,a[1]的内容
printf("%d\n",sizeof(*a));			//16,a[0]的内容
printf("%d\n",sizeof(a[3]));		//16,虽然数组下标越界,但不会报错。
									//允许读取超出范围的下一个元素,但不允许写入。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值