C语言指针指针和数组笔试题(必看)

前言:

前面介绍了指针的大体内容,如果接下来能够把这些代码的含义搞得清清楚楚,那么你就是代码king!

一维数组:

cpp 复制代码
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(arr)可以计算arr整个数组的大小!!

1、不必多说答案是16(一个整型数据占4个字节)

2、sizeof(a+0)这里表示的是第一个元素的地址的大小为4

3、sizeof(*a),a是一个指针,里面放的是一个地址(首元素的),解引用就相当于第一个元素,所以这里相当于计算一个元素大小为4个字节。

4、sizeof(a+1)表示首元素地址加一,也就是相当于第二个元素的地址,大小为4个字节。

5、sizeof(a[1])表示第2个元素的大小,大小是4个字节

6、sizeof(&a)表示取出a整个数组的地址,但是在a中保存的是首元素的地址,只有加减的时候才会跳过整个数组的大小,大小为4个字节。(不要被迷惑)

7、sizeof(*&a)表示整个数组的地址放在指针中,也是一个整形指针大小为4个字节。

8、sizeof(&a+1)表示取出a整个数组的大小,然后向后跳过整个数组的大小,指向的是第a+4个元素的地址,大小是4个字节。

9、sizeof(&a[0])表示的是a[0]的地址,大小是4个字节。

10、sizoef(&a[0]+1)表示的是a[0]的地址,向后访问一个整型的大小地址,大小为4个字节。

字符数组:

cpp 复制代码
	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));

直接开始分析!

注:strlen计算的是数组里面元素的个数!!

1、sizeof(arr)直接计算的是整个数组的大小,大小为6个字节

2、sizeof(arr+0)表示的是第1个元素的地址,地址的话是4个字节(千万注意表示的不是第1个字符)

3、sizeof(*arr)表示的是一个字符指针,里面放的是第一个字符的地址并且解引用,就是第一个字符,大小为1个字节。

4、sizeof(arr[1])表示的是第二个字符,大小为1个字节。

5、sizeof(&arr)表示的是取出整个数组的地址,大小为4个字节。

6、sizeof(&arr+1)表示的是向后跳过整个数组的大小(6个字节)后的地址,大小为4个字节。

7、sizeof(&arr[0]+1)表示的是第二个元素的地址,大小为4个字节。

8、strlen(arr)表示的是计算整个字符串数组的长度,大小为随机值(注意里面没有\0,strlen读取到\0才终止)

9、strlen(arr+0)表示的是从第一个字符开始往后读取,直到遇到\0停止,大小为随机值。

10、strlen(*arr),相当于strlen('a')。大小为随机值。

11、strlen(arr[1]),相当于strlen('a'),大小同样为随价值。

12、strlen(&arr)相当于&arr是取出整个数组的地址,但是里面存的还是首元素的地址,所以还是从首元素开始往后读,直到遇到\0停止,还是随机值。

13、strlen(&arr+1)表示的是跳过整个数组大小的长度,开始往后读遇到'\0'停止,还是随机值。

14、strlen(&arr[0]+1)表示的是从第二个字符开始往后读,遇到'\0'停止。

字符串:

cpp 复制代码
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、sizeof(arr) 整个数组的大小,结果为7。(注意字符串中结尾自带'\0')。

2、sizeof(arr+0) 首元素的地址,结果为4。

3、sizeof(*arr)首元素,大小为1。

4、sizeof(arr[1])第二个元素,大小为1。

5、sizeof(&arr)整个数组是地址,大小为4.

6、sizeof(&arr+1)跳过整个数组后的地址,大小为4

7、sizeof(&arr[0]+1)第二个元素的地址,大小为4.

8、strlen(arr),从第一个元素开始往后读,直到遇到'\0'停止,结果为6.

9、strlen(arr+0),和上一个一样的,大小为6。

10、strlen(*arr),相当于strlen(arr[0]),大小为随机值。

11、strlen(arr[1]),大小为随机值。

12、strlen(&arr),大小为6。

13、strlen(&arr+1),结果为随机值。

14、strlen(&arr[0]+1),是从第二个元素开始访问,直到遇到'\0'停止,结果为5。

熏帝们,到这还没有结束,等下期继续!!

相关推荐
shaoing3 分钟前
MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
java·开发语言·数据库
march_birds14 分钟前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构
小麦嵌入式41 分钟前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
The Future is mine44 分钟前
Python计算经纬度两点之间距离
开发语言·python
Enti7c44 分钟前
HTML5和CSS3的一些特性
开发语言·css3
斯汤雷1 小时前
Matlab绘图案例,设置图片大小,坐标轴比例为黄金比
数据库·人工智能·算法·matlab·信息可视化
爱吃巧克力的程序媛1 小时前
在 Qt 创建项目时,Qt Quick Application (Compat) 和 Qt Quick Application
开发语言·qt
云 无 心 以 出 岫1 小时前
贪心算法QwQ
数据结构·c++·算法·贪心算法
俏布斯2 小时前
算法日常记录
java·算法·leetcode
独好紫罗兰2 小时前
洛谷题单3-P5719 【深基4.例3】分类平均-python-流程图重构
开发语言·python·算法