【C生万物】 指针和数组笔试题汇总 (上)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 【C生万物】 指针和数组笔试题汇总 (上)

370e28d82132798f78a90e533d2c4256_e6510fde102248338c249440750db93e.png


前言:

在学习完初级和进级的指针之后,为了检验掌握程度,这里出一期指针和数组的笔试题,看看你掌握的怎么样吧!


目录

Part1:数组笔试题

1.做题

1.1一维数组

1.2字符数组

1.3二维数组

2.总结



Part1:数组笔试题


1.做题


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


这里可以暂停,自己做一下。


答案及解析:

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));        16 -- 整个数组的大小 4*4 == 16
printf("%d\n",sizeof(a+0));      8  -- + 0这个动作表明是指针 64位下指针大小固定为 8
printf("%d\n",sizeof(*a));       4  -- 首元素地址解引用得到首元素1,一个整型大小为4
printf("%d\n",sizeof(a+1));      8  -- 指针大小
printf("%d\n",sizeof(a[1]));     4  -- 元素2的大小
printf("%d\n",sizeof(&a));       8  -- &a代表指向数组a的指针
printf("%d\n",sizeof(*&a));      16 -- 承上,解引用后表示整个数组
printf("%d\n",sizeof(&a+1));     8  -- 指针+1,表示步长,即指针大小
printf("%d\n",sizeof(&a[0]));    8  -- 首元素地址,指针大小
printf("%d\n",sizeof(&a[0]+1));  8  -- 步长,即指针大小


1.2字符数组


计算大小:


第一部分

char arr[] = { 'a','b','c','d','e','f' }; // 没有\0
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));


答案及解析:

char arr[] = { 'a','b','c','d','e','f' };  // 没有\0
printf("%d\n", sizeof(arr));          6 -- 所有字符的总大小,一个字符一字节,共6字节
printf("%d\n", sizeof(arr + 0));      8 -- 表示指针,8字节
printf("%d\n", sizeof(*arr));         1 -- 首元素地址解引用得到首元素,大小为1
printf("%d\n", sizeof(arr[1]));       1 -- 元素b的大小
printf("%d\n", sizeof(&arr));         8 -- 指向整个数组的指针大小
printf("%d\n", sizeof(&arr + 1));     8 -- 指针步长
printf("%d\n", sizeof(&arr[0] + 1));  8 -- 指向首元素指针的步长


第二部分

char arr[] = { 'a','b','c','d','e','f' };  // 没有\0
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));


答案及解析:

char arr[] = { 'a','b','c','d','e','f' };  // 没有\0
printf("%d\n", strlen(arr));         随机值 -- arr表示首元素地址,但不知道\0在哪,不知道停止
printf("%d\n", strlen(arr + 0));     随机值 -- 同上,表示地址
printf("%d\n", strlen(*arr));        报错 -- ==strlen('a'),非法访问
printf("%d\n", strlen(arr[1]));      报错 -- ==strlen('b'),非法访问
printf("%d\n", strlen(&arr));        随机值 -- 从整个数组开始,向后寻找\0停止
printf("%d\n", strlen(&arr + 1));    随机值 -- 从跳过整个数组开始,向后寻找\0停止
printf("%d\n", strlen(&arr[0] + 1)); 随机值 -- 从'b'的地址开始,向后寻找\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));


答案及解析:

char arr[] = "abcdef";  // 末尾有\0
printf("%d\n", sizeof(arr));       7 -- 包含\0在内   
printf("%d\n", sizeof(arr+0));     8 -- 指针大小
printf("%d\n", sizeof(*arr));      1 -- a的大小
printf("%d\n", sizeof(arr[1]));    1 -- b的大小
printf("%d\n", sizeof(&arr));      8 -- 字符串指针的大小
printf("%d\n", sizeof(&arr+1));    8 -- 字符串指针的步长大小
printf("%d\n", sizeof(&arr[0]+1)); 8 -- 首元素指针的步长大小


第四部分

char arr[] = "abcdef";  // 末尾有\0
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));


答案及解析:

char arr[] = "abcdef";  // 末尾有\0
printf("%d\n", strlen(arr));       6 -- 计算\0之前的大小
printf("%d\n", strlen(arr+0));     6 -- 同上
printf("%d\n", strlen(*arr));      报错 -- 给strlen传递'a'
printf("%d\n", strlen(arr[1]));    报错 -- 给strlen传递'b'
printf("%d\n", strlen(&arr));      6 -- 取出起始位置的地址
printf("%d\n", strlen(&arr+1));    随机值 -- 跳过整个数组(包含\0)
printf("%d\n", strlen(&arr[0]+1)); 5 -- 从b开机计算大小,到\0之前


第五部分

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


答案及解析:

char *p = "abcdef";
printf("%d\n", sizeof(p));       8 -- p是指针变量,即指针大小
printf("%d\n", sizeof(p+1));     8 -- p+1是指针变量
printf("%d\n", sizeof(*p));      1 -- 即a的大小
printf("%d\n", sizeof(p[0]));    1 -- 即a的大小
printf("%d\n", sizeof(&p));      8 -- 二级指针大小
printf("%d\n", sizeof(&p+1));    8 -- 指向整个字符串的指针步长
printf("%d\n", sizeof(&p[0]+1)); 8 -- 指向b的指针的大小


第六部分

char *p = "abcdef";
printf("%d\n", sizeof(p));       8 -- p是指针变量,即指针大小
printf("%d\n", sizeof(p+1));     8 -- p+1是指针变量
printf("%d\n", sizeof(*p));      1 -- 即a的大小
printf("%d\n", sizeof(p[0]));    1 -- 即a的大小
printf("%d\n", sizeof(&p));      8 -- 二级指针大小
printf("%d\n", sizeof(&p+1));    8 -- 指向整个字符串的指针步长
printf("%d\n", sizeof(&p[0]+1)); 8 -- 指向b的指针的大小


答案及解析:

char* p = "abcdef";                
printf("%d\n", strlen(p));         6 -- 标准求字符串长度
printf("%d\n", strlen(p + 1));     5 -- 从b开始求字符串长度
printf("%d\n", strlen(*p));        报错 -- strlen(a)
printf("%d\n", strlen(p[0]));      报错 -- 同上
printf("%d\n", strlen(&p));        随机值 -- 指向p的指针,另起
printf("%d\n", strlen(&p + 1));    随机值 -- 跳过指向p的指针
printf("%d\n", strlen(&p[0] + 1)); 5 -- 从b开始求字符串长度


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


答案及解析:

因为是二维数组,这里画个图会好理解些:

bba226494a3ad6f84aaebb7ca36b20c1_e0d4f782ed654932969bc8367555d389.png

注意:可以先这样理解,实际内存中是连续存储的。

int a[3][4] = {0};                 
printf("%d\n",sizeof(a));           48 -- 整个二位数组的大小 3*4*4
printf("%d\n",sizeof(a[0][0]));      4 -- 下标为0,0,即第一个元素的大小
printf("%d\n",sizeof(a[0]));        16 -- a[0]作为第一行的数组名,单独放在sizeof内部,计算的是数组第一行的大小
printf("%d\n",sizeof(a[0]+1));       8 --a[0]作为第一行的数组名,没有单独放在sizeof内部,没有取地址,表示的就是数组首元素的地址,即a[0][0]的地址,再+1就是a[0][1]的地址,是地址就是指针,指针大小
printf("%d\n",sizeof(*(a[0]+1)));    4 -- 第一行第二个元素的大小
printf("%d\n",sizeof(a+1));          8 -- a是二维数组的数组名,数组名表示首元素的地址,就是第一行的地址,a+1就是第二行的地址,是地址就是指针,指针大小
printf("%d\n",sizeof(*(a+1)));       16 -- 第二行的大小
printf("%d\n",sizeof(&a[0]+1));       8 -- &a[0]是第一行的地址,&a[0]+1就是第二行的地址,地址的大小指针大小
printf("%d\n",sizeof(*(&a[0]+1)));   16 -- 第二行的大小
printf("%d\n",sizeof(*a));           16 -- a表示首元素的地址,就是第一行的地址,*a就是第一行,计算的就是第一行的大小
printf("%d\n",sizeof(a[3]));         16 -- 如果数组存在第四行,a[3]就是第四行的数组名,数组名单独放在sizeof内部,计算的是第四行的大小


2.总结

数组名的意义:

• sizeof( 数组名 ) ,这里的数组名表示整个数组,计算的是整个数组的大小;

• &数组名,这里的数组名表示整个数组,取出的是整个数组的地址;

• 除此之外所有的数组名都表示首元素的地址。


总结:

这篇博客带大家做了些关于数组和指针的笔试题,基本上汇总了全部类型,其实到这里还没完,那么下篇再带大家继续指针的练习。


码文不易

如果你觉得这篇文章还不错并且对你有帮助,不妨支持一波哦  💗💗💗


目录
相关文章
|
2月前
|
搜索推荐 C语言
指针与数组
指针与数组
51 9
|
2月前
|
算法 Java
双指针在数组遍历中的应用
文章深入探讨了双指针技术在数组遍历中的应用,通过实战例子详细解释了快慢指针和首尾指针的不同用法,并提供了解决LeetCode相关问题的Java代码实现。
|
2月前
|
存储 程序员 C语言
指针的高级应用:指针数组、数组指针、函数指针等。
指针的高级应用:指针数组、数组指针、函数指针等。
81 0
|
3月前
|
运维
开发与运维数组问题之指针的加减法意义如何解决
开发与运维数组问题之指针的加减法意义如何解决
38 7
|
3月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
22 6
|
3月前
|
存储 C++ 运维
开发与运维数组问题之指针的定义语法如何解决
开发与运维数组问题之指针的定义语法如何解决
27 6
|
4月前
|
存储 C++
有关【指针运算】的经典笔试题
有关【指针运算】的经典笔试题
26 4
|
4月前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)
|
4月前
|
C语言
【C语言】:详解函数指针变量,函数指针数组及转移表
【C语言】:详解函数指针变量,函数指针数组及转移表
50 2
|
4月前
|
存储 C语言
C语言中的多级指针、指针数组与数组指针
C语言中的多级指针、指针数组与数组指针