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。

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

相关推荐
让我们一起加油好吗10 分钟前
【数学】数论干货(疑似密码学基础)
c语言·visualstudio·密码学
终极定律12 分钟前
qt:输入控件操作
开发语言·qt
JenKinJia27 分钟前
Windows10配置C++版本的Kafka,并进行发布和订阅测试
开发语言·c++
煤炭里de黑猫30 分钟前
Lua C API :lua_insert 函数详解
开发语言·lua
笨鸟笃行31 分钟前
爬虫第七篇数据爬取及解析
开发语言·爬虫·python
编程乐趣32 分钟前
一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略来了!
开发语言·c#
java1234_小锋37 分钟前
一周学会Flask3 Python Web开发-response响应格式
开发语言·python·flask·flask3
Jelena1577958579238 分钟前
使用Java爬虫获取1688 item_get_company 接口的公司档案信息
java·开发语言·爬虫
java1234_小锋39 分钟前
一周学会Flask3 Python Web开发-flask3模块化blueprint配置
开发语言·python·flask·flask3
wen__xvn1 小时前
每日一题洛谷P1914 小书童——凯撒密码c++
数据结构·c++·算法