C语言数组笔试题

一、数组
1、一维数组

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));

在这里插入图片描述
我们知道sizeof是求数据所占内存的大小,那么,我们来看一下这几个输出。
printf(“%d\n”,sizeof(a));//是整个数组所占字节的大小,因为它是Int类型的数组,一个int占4个字节,数组有4个元素, 所以应该是4*4=16个字节。
printf(“%d\n”,sizeof(a+0));//这里指的是首元素的地址,因为它是地址,地址是指针,所以也是4个字节。
printf(“%d\n”,sizeof( * a));//对首元素地址的解引用,就是首元素,因为首元素是int类型,所以是4个字节。
printf(“%d\n”,sizeof(a+1));//第二个元素的地址,地址是指针,所以是4个字节。
printf(“%d\n”,sizeof(a[1]));//第二个元素,因为是int类型,所以是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、字符数组
(1)

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));

在这里插入图片描述
先看一下上半部分的输出。
printf(“%d\n”, sizeof(arr));//这里输出的是整个数组的大小,因为一个char一个字节,数组一共有6个元素,所以是6乘1等于6,是6个字节。
printf(“%d\n”, sizeof(arr+0));//这里代表的是首元素的地址,因为地址是指针,所以是4个字节。
printf(“%d\n”, sizeof( * arr)); //首元素地址的解引用,是首元素,因为是char类型,所以是1个字节。
printf(“%d\n”, sizeof(arr[1]));//首元素,因为是char类型,所以是1个字节。
printf(“%d\n”, sizeof(&arr)); //取整个数组的地址,因为地址是指针,所以是4个字节。
printf(“%d\n”, sizeof(&arr+1)); //取整个数组地址加1,是下个数组的地址,又因为地址是指针,所以是4个字节。
printf(“%d\n”, sizeof(&arr[0]+1));//取首元素地址加1,是第二个元素的地址,又因为地址是指针,所以是4个字节。

再看下半部分的输出前,先解释以下strlen,strlen这个函数是用来求字符个数的,将‘\0’作为结束标志,返回的是’\0’前面出现字符的个数,并且strlen函数形参类型是指针类型。其次,我们看一下这个字符数组,它的结尾并没有’\0’,也就是说,strlen并不会结束。
在这里插入图片描述
printf(“%d\n”, strlen(arr)); //首元素的地址,由于没有’\0’,所以输出是随机值,但是因为数组本身有6个元素,所以至少是6个字节。
printf(“%d\n”, strlen(arr+0));//首元素的地址,由于没有’\0’,所以输出是随机值,但是因为数组本身有6个元素,所以至少是6个字节。
printf(“%d\n”, strlen( * arr)); //这里是对首元素的地址解引用,是char类型,和strlen函数参数要求不一致,所以报错,图片中就省略了它的显示。
printf(“%d\n”, strlen(arr[1]));//同上。
printf(“%d\n”, strlen(&arr)); //这里是取得整个数组的地址,但是它的数值和首元素地址的数值一样,由于没有’\0’,所以输出是随机值,但是因为数组本身有6个元素,所以至少是6个字节。而且会至少有一个告警,因为&arr的类型是数组指针,而strlen要求的参数类型是指针。
printf(“%d\n”, strlen(&arr+1)); //这里取整个数组的地址加1,是下个数组的地址,所以也是随机值,不过要减去这个数组的元素大小,也就是减6。也会至少有一个告警,因为&arr+1的类型是数组指针,而strlen要求的参数类型是指针。
printf(“%d\n”, strlen(&arr[0]+1));//取首元素的地址加1是第二个元素的地址,由于没有’\0’,所以输出是随机值,但是因为指到了第2个元素,所以至少是5个字节。
(2)

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));

在看输出之前,我们看这个数组,这个数组后面就有了’\0’,也就是说strlen这个函数可以结束,并且返回一个正确的值了。
我们先看上半部分的输出。
在这里插入图片描述
printf(“%d\n”, sizeof(arr));//这里是求数组的大小,因为含有六个元素,每个元素是char类型,并且结尾还有一个’\0’,所以是6乘1加1等于7个字节。
printf(“%d\n”, sizeof(arr+0));//这里是首元素的地址,因为地址是指针,所以是4个字节。
printf(“%d\n”, sizeof( * arr)); //这里是对首元素地址的解引用,也就是第一个元素,因为是char类型,所以是1个字节。
printf(“%d\n”, sizeof(arr[1]));//这里是首元素,因为是char类型,所以是1个字节。
printf(“%d\n”, sizeof(&arr)); //这里取整个数组地址,因为地址是指针,所以是4个字节。
printf(“%d\n”, sizeof(&arr+1)); 这里取整个数组地址加1,因为地址是指针,所以是4个字节。
printf(“%d\n”, sizeof(&arr[0]+1));这里取首元素地址加1,是第二个元素的地址,又因为地址是指针,所以是4个字节。

我们再看下半部分的输出。
在这里插入图片描述
printf(“%d\n”, strlen(arr)); //这里是strlen函数求字符个数,因为此时有了’\0’,所以可以得出是6个字节。
printf(“%d\n”, strlen(arr+0));//这是首元素的地址,也是strlen求字符个数,因为此时有了’\0’,所以可以得出是6个字节。
printf(“%d\n”, strlen( * arr));//这里是对首元素的地址解引用,是char类型,和strlen函数的参数类型不一致,所以会报错,图片就省略了它的输出。
printf(“%d\n”, strlen(arr[1]));// 这里是首元素,是char类型,和strlen函数的参数类型不一致,所以会报错,图片就省略了它的输出。
printf(“%d\n”, strlen(&arr)); //这里是取整个数组的地址,因为整个数组的地址的数值和首元素地址的数值大小是一样的,所以strlen函数求字符个数,是6。由于&arr是字符指针类型,和strlen函数参数不一致,所以至少会有一个报警。
printf(“%d\n”, strlen(&arr+1));//这里是取整个数组地址加1,那么就是下个数组的地址,但是下个数组的’\0’不确定,所以输出是随机值。由于&arr+1是字符指针类型,和strlen函数参数不一致,所以至少会有一个报警。
printf(“%d\n”, strlen(&arr[0]+1));//这里是首元素地址加1,也就是第二个元素的地址,从第二个元素开始计算,那么就有5个字符,所以输出5。
(3)

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));

这里,我们用char类型的指针定义了一个字符串。此时,p是字符串的首地址。
我们看上半部分的输出。
在这里插入图片描述
printf(“%d\n”, sizeof§);//因为p是指针,所以是4个字节。
printf(“%d\n”, sizeof(p+1));//第二个元素的地址,因为地址是指针,所以是4个字节。
printf(“%d\n”, sizeof( * p));//对p解引用,是首元素,又因为是cha类型,所以是1个字节。
printf(“%d\n”, sizeof(p[0]));//首元素,因为是char类型,所以是1个字节。
printf(“%d\n”, sizeof(&p));//取整个字符串的地址,因为地址是指针,所以是4个字节。
printf(“%d\n”, sizeof(&p+1));//取整个字符串的地址加1,下个字符串的地址,又因为地址是指针,所以是4个字节。
printf(“%d\n”, sizeof(&p[0]+1));//取首元素的地址加1,是第二个元素的地址,又因为地址是指针,所以是4个字节。

来看下半部分的输出。
在这里插入图片描述
printf(“%d\n”, strlen§);//strlen求字符个数,是6。
printf(“%d\n”, strlen(p+1));//取第二个地址,从第二个元素开始算,字符个数是5。
printf(“%d\n”, strlen( * p));//首元素地址解引用,类型是char,和strlen函数的参数要求不一致,错误。上图就省略了它的显示。
printf(“%d\n”, strlen(p[0]));//首元素,类型是char,和strlen函数的参数要求不一致,错误。上图就省略了它的显示。
printf(“%d\n”, strlen(&p));//取p的地址,是二级指针,所以是随机值。
printf(“%d\n”, strlen(&p+1));//同上,也是二级指针,不过位置向后移动了,所以也是随机值。
printf(“%d\n”, strlen(&p[0]+1));//首元素地址加1,是第二个元素地址,从第二个元素开始算,字符个数是5。

3、二维数组

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]));

在这里插入图片描述
printf(“%d\n”,sizeof(a)); //这里求整个数组的大小,因为有12个元素,每个元素都是Int类型,所以是12乘4,也就是48个字节。
printf(“%d\n”,sizeof(a [ 0 ] [ 0 ] )); //首元素,因为是Int类型,所以是4个字节。
printf(“%d\n”,sizeof(a[0])); //第一行元素,因为第一行元素有4个,每个元素都是int类型,所以4乘4,也就是16个字节。
printf(“%d\n”,sizeof(a [ 0 ] +1)); //第一行元素的第二个元素的地址,也就是a [ 0 ] [ 1 ]的地址,因为地址是指针,所以是4个字节。
printf(“%d\n”,sizeof( * (a [ 0 ] +1))); //a [ 0 ] [ 1 ] 地址的解引用,也就是a [ 0 ] [ 1 ] ,因为是Int类型,所以是4个字节。
printf(“%d\n”,sizeof(a+1));//第二行元素的地址,也就是a[1]的地址,因为地址是指针,所以是4个字节。
printf(“%d\n”,sizeof( * (a+1)));//第二行元素地址的解引用,所以是第二行元素,也就是4乘4,16个字节。
printf(“%d\n”,sizeof(&a[0]+1)); //取第一行地址加1,是第二行地址,地址是指针,所以是4个字节。
printf(“%d\n”,sizeof( * (&a[0]+1)));//第二行地址的解引用,第二行元素,也就是4乘4,16个字节。
printf(“%d\n”,sizeof( * a));//首元素地址的解引用,第一行元素,也就是4乘4,16个字节。
printf(“%d\n”,sizeof(a[3]));//第四行元素,也就是4乘4,16个字节。

总结:数组名的意义
1、sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2、&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3、除此之外所有的数组名都表示首元素的地址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值