数组笔试题目和解析

文章详细解释了C语言中数组名、sizeof运算符、指针在不同情况下的使用,涉及数组大小、首元素地址、解引用以及字符串和二维数组的实例分析。
摘要由CSDN通过智能技术生成

数组相关的笔试题目及解析

  • 首先我们需要知道一个知识点:数组名在绝大多数情况下表示数组首元素的地址,两种情况例外。
  • 1.sizeof(数组名),此时数组名表示的是整个数组,该表达式是用来计算整个数组的大小,单位是字节。
  • 2.&数组名,此时数组名表示的是整个数组
#include <stdio.h>

int main()
{
	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));
	return 0;
}

1.a直接放在sizeof里面,表示的是整个数组,sizeof(a)求的是数组a的大小,4个整型, 一个整型4个字节,一共16个字节。
2.a没有直接放在sizeof里面,也没有放在&后面,所以数组名表示的是首元素的地址,所以a+0表示的也是数组首元素的地址,是地址就是4个或8个字节
3.a表示数组首元素地址,解引用找到数组首元素,sizeof(*a)即求数组首元素所占的空间大小,为4个字节。
4.a是数组首元素的地址,a + 1 是跳过一个元素,是第二个元素的地址,是地址就是4个或8个字节。
5.a[1]是数组第二个元素,大小为4个字节。
6.数组名a放在&后面,表示整个数组,&a取出的是整个数组的地址,是地址就是4个或8个字节。
7.取出数组的地址又解引用,相当于得到数组名,所以求的是整个数组的大小,16个字节。
8.a放在&后面,取出的是整的数组的地址,+1跳过一个数组,是地址就是4或8个字节。
9.a[0]是数组第一个元素,&a[0]取出第一个元素的地址,是地址就是4或8个字节。
10.&a[0]是第一个元素的地址, + 1是第二个元素的地址,是地址就是4个或8个字节。

char arr[] = {'a','b','c','d','e','f'};
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+1));
printf("%d\n", sizeof(&arr[0]+1));
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

1.arr直接放在sizeof里面,表示整个数组,sizeof(arr)求的是整个数组的大小,单位是字节,应该为6.
2.arr数组名,表示数组首元素的地址,+0不移动,是地址就是4个或8个字节。
3.arr是数组名首元素地址,*arr是数组首元素,大小为1个字节。
4.arr[1]是数组第二个元素,大小为1个字节。
5.&arr取出的是整个数组的地址,是地址就是4个或8个字节。
6.&arr是整个数组的地址,+1跳过整个数组,还是地址,是4个或8个字节。
7.&arr[0]是数组首元素的地址,+1是数组第二个元素的地址,是4个或8个字节。
8.strlen(arr)求的是字符串的长度,由于没有‘\0’,所以求出的是随机值。
9.arr是数组首元素地址,+0不移动,strlen从首元素向后读取,到’\0’停止,由于没有给出’\0’,所以结果是随机值。
10.arr是数组首元素的地址,*arr是数组首元素,strlen的参数应该是一个指针,把首元素当做地址传过去,会报错。
11.arr[1]是数组第二个元素,同上一题。
12.&arr是整个数组的地址,由于不知道’\0’在哪,所以也是随机值。
13.&arr取得是整个数组的地址,+1跳过整个数组,‘\0’位置未知,长度为随机值。
14.&arr[0]是首元素的地址,+ 1是第二个元素的地址,’\0’位置未知,长度为随机值。

char arr[] = "abcdef";
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+1));
printf("%d\n", sizeof(&arr[0]+1));
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

1.arr直接放在sizeof里面,表示整个数组,求的是整个数组大小,因为字符串结尾默认有个’\0’,所以大小为7个字节。
2.arr是数组首元素的地址,+0不移动,是地址就是4个或8个字节。
3.arr是数组首元素地址,*arr是数组首元素,大小是1个字节。
4.arr[1]是数组第二个元素,大小为1个字节。
5.&arr是整个数组的地址,大小为4个或8个字节。
6.&arr + 1仍然是一个地址,大小为4个或8个字节。
7.&arr[0] + 1是第二个元素的地址,大小为4或8个字节。
8.arr是数组首元素的地址,strlen求出从arr到’\0’的长度('\0’不算在内),即字符串的长度,大小为6。
9.arr + 0不移动,大小仍为6。
10.*arr找到字符串第一个元素,将其视为地址传给strlen,会报错。
11.arr[1]是字符串第二个元素,视作地址传给strlen会报错。
12.&arr取出的是数组的地址,数值上和数组首元素的地址相同,所以大小为字符串的大小,为6.
13.&arr + 1跳过一个数组,由于’\0’的位置未知,所以大小为随机值。
14.&arr[0] + 1是字符串第二个元素的地址,往后计算长度,大小为5.

char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

1.p是一个字符指针,存的是字符串首元素的地址,是地址大小就是4或8个字节。
2.p + 1是第二个字符的地址,大小为4或8个字节。
3.p是字符串首元素的地址,*p是首元素,大小为1个字节。
4.p存的是字符串首元素的地址,p[0]是字符串首元素,大小为1个字节。
5.p是字符串首元素地址,&p是一级指针的地址,大小为4或8个字节。
6.&p + 1是一个地址,大小为4或8个字节。
7.&p[0] + 1是字符串第二个元素的地址,大小为4或8个字节。
8.p是首元素的地址,strlen§计算的是字符串的长度,大小为6。
9.p + 1是第二个元素的地址,从第二个元素向后寻找’\0’,大小为5。
10.*p是第一个元素,把第一个元素作为地址传给strlen,会报错。
11.p[0]是第一个元素,作为地址传给strlen,会报错。
12.p是首元素的地址,&p是一级指针的地址,由于’\0’的位置未知,所以大小是随机值。
13.&p是一级指针的地址, + 1还是一个地址,由于’\0’的位置未知,所以大小是随机值。
14.&p[0] + 1是字符串第二个元素的地址,大小为5。

//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));

1.数组名a直接放在sizeof里面,表示整个数组,大小为48个字节。
2.a[0][0]是二维数组第一行第一个元素,大小为4个字节。
3.a[0]是二维数组第一行的一维数组的数组名,直接放在sizeof里面,表示第一行的一维数组,大小为16个字节。
4.a[0]是第一行的数组名,表示第一行首元素的地址,+ 1跳过一个元素,指向第一行的第二个元素,是地址大小为4个或8个字节。
5.a[0] + 1是二维数组第一行第二个元素的地址,*(a[0] + 1)是第一行第二个元素,大小为4个字节。
6.a 二维数组的数组名,表示首元素的地址,二维数组的首元素是第一行的一维数组,所以a是第一行的地址,+ 1跳过一行,指向第二行,是地址就是4或8个字节。
7. a + 1是二维数组第二行的地址, *(a + 1)找到第二行,即第二行的数组名,第二行的数组大小为16个字节。
8.a[0]是第一行的数组名,&a[0]是第一行的地址,+1是第二行数组的地址,大小为4或8个字节。
9.&a[0] + 1是第二行的地址,解引用找到第二行的数组,大小为16个字节。
10.数组名a表示二维数组首元素的地址,即第一行数组的地址,解引用找到第一行的数组,大小为16个字节。
11.sizeof并不会计算括号内的内容,所以a[3]和a[0],a[1]……一样,表示一个一维数组,大小为16个字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝壳cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值