【C语言】经典指针笔试题(深度解剖)(上)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【C语言】经典指针笔试题(深度解剖)(上)

文章介绍:

大多数人学习【C语言】指针时多多少少会出现一些比较复杂的指针类型,大多数人一遇到复杂的指针就可能头痛,所以这一章我们探讨指针的经典笔试题,让大家更加深刻了解指针,从而也拿下【C语言】几道经典指针笔试题!


1:所需知识储备



  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。
  4. 地址是4/8个字节,在32位(x86)平台下是4个字节,在64位(x64)平台下是8个字节


  1. sizeof计算的是占用内存空间的大小,单位是字节,不关注内存中到底存放的是什么。
  2. sizeof不是函数,是操作符
  3. strlen是函数
  4. strlen是针对字符串的,求的是字符串的长度本质上统计的是\0之前出现的字符个数。


2:笔试题解析



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

数组名代表首元素地址,但数组名单独放在sizeof内部,计算的是整个数组的大小单位是字节,答案是-> 16


printf(“%d\n”,sizeof(a+0));

数组名代表首元素地址,首元素地址+0 还是首元素的地址, 地址就是4/8个字节,答案是->4 / 8


printf(“%d\n”,sizeof(*a));

数组名代表首元素地址,首元素地址解引用就是数组a[0]第一个元素1,1是int类型占4个字节,答案是->4

(*a == *&a[0] == a[0])


printf(“%d\n”,sizeof(a+1));

数组名代表首元素,首元素地址+1就是数组第二个元素地址,地址就是4/8个字节,答案是->4 / 8


printf(“%d\n”,sizeof(a[1]));

这个比较简单,就是a数组第二个元素 2,2是int类型占4个字节,答案是->4


printf(“%d\n”,sizeof(&a));

&数组名,取出的是整个数组的地址,但是数组的地址也是地址呀。地址就是4/8个字节,答案是->4 / 8

(int(*)[4] = &a)


printf(“%d\n”,sizeof(*&a));

&a取出a整个数组的地址,数组的地址解引用访问整个数组,sizeof计算的就是数组的大小单位是字节,答案是->16 (其实这里可以看作 * &相互抵消,剩下sizeof(a)同样也是16个字节)


printf(“%d\n”,sizeof(&a+1));

&a取出a整个数组的地址,,&a+1虽然地址跳过整个数组,但还是地址,地址还是是4/8个字节,答案->4 / 8

(&a = int (*)[4] ) ( &a+1 跳过一个数组)


printf(“%d\n”,sizeof(&a[0]));

这里取出数组第一个元素的地址a[0] 元素1的地址,地址就是4/8个字节,答案是->4 / 8


printf(“%d\n”,sizeof(&a[0]+1));

&a[0]+1 是第二个元素的地址,地址就是4/8个字节,答案是->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));


解析:char arr[] = {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};

printf(“%d\n”, sizeof(arr));

数组名单独放在sizeof内部,计算的是整个数组的大小单位是字节,答案是->6


printf(“%d\n”, sizeof(arr+0));

首元素地址加0还是首元素地址,地址就是4/8个字节,答案是->4 / 8


printf(“%d\n”, sizeof(*arr));

数组名代表首元素地址,首元素地址解引用就是数组第一个元素arr[0]->a,答案是->1


printf(“%d\n”, sizeof(arr[1]));

arr[1]就是第二个元素->b 答案是->1


printf(“%d\n”, sizeof(&arr));

&arr取出整个数组的地址,但还是地址,地址还是是4/8个字节,答案是->4/8个字节


printf(“%d\n”, sizeof(&arr+1));

&arr取出整个数组的地址,+1跳过一个数组的地址,地址 4/8 个字节,答案是->4/8个字节


printf(“%d\n”, sizeof(&arr[0]+1));

&arr[0] 取出第一个元素的地址,+1跳过一个元素地址arr[1]的地址,地址 4/8个字节,答案是->4/8个字节


char arr[] = {'a','b','c','d','e','f'};
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’};

注意审题哦! 这里是strlen了


printf(“%d\n”, strlen(arr));

strlen遇到 \0 才会停止,但arr数组并没有存放\0进去,因为不知道\0的位置,所以是随机值 答案->随机值


printf(“%d\n”, strlen(arr+0));

arr+0,从第一个元素地址开始找 \0 ,不知道\0的位置,所以也是随机值 答案->随机值


printf(“%d\n”, strlen(*arr));

strlen函数的参数应该是指针类型的不能接引用 ,只能计算指针或者地址,所以我们解引用 *arr相当于把字符’a’ASCll当成地址了,这个时候程序会崩溃的,代码会报错的 答案是->(代码错误error)

6b65ee36a0904f4d874179bb6f18bc0b.png


printf(“%d\n”, strlen(arr[1]));

该题和上题一样,arr[1]把字符’b’ASCll当成地址了,解引用程序会崩溃的,代码会报错的 答案是->(代码错误error)


printf(“%d\n”, strlen(&arr));

&arr,从第一个元素地址开始找 \0, ,因为不知道\0的位置,所以是随机值 答案->随机值

63da2f7c2f2b4760929b18c263e6a744.png


printf(“%d\n”, strlen(&arr+1));

&arr是指向第一个元素地址位置,&arr+1跳过一个arr数组大小,指向了f后面那个元素,因为也不知道\0的位置,所以是随机值 答案->随机值.(其实也可以说是随机值-6,因为arr+1已结跳过了6个元素)

339216086cff463d9a4046da7ab3cece.png


printf(“%d\n”, strlen(&arr[0]+1));

&arr[0]第一个·元素地址,第二个元素地址,也不知道\0的位置 答案->随机值. (也可以说是随机值-1,因为&arr【0】+1已结跳过了1个元素)


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

注意!现在arr是一个字符串,后面默认放着一个\0的相当于是[ abcdef\0 ]


printf(“%d\n”, sizeof(arr));

sizeof计算的是占用内存空间的大小,单位是字节,不关注内存中到底存放的是什么,所以也会把\0算上 答案是->7个字节


printf(“%d\n”, sizeof(arr+0));

首元素地址加0号是首元素地址,地址大小是4/8个字节 答案是->4/8


printf(“%d\n”, sizeof(*arr));

数组名代码首元素地址,首元素地址解引用a[0]->a, 答案是->1


printf(“%d\n”, sizeof(arr[1]));

arr[1]数组第二个元素b 答案是->1


printf(“%d\n”, sizeof(&arr));

&arr取出整个数组的地址,但还是地址,地址大小是4/8个字节,答案是-> 4 / 8


printf(“%d\n”, sizeof(&arr+1));

&arr+1是跳过整个数组后的地址,地址大小是4/8个字节,答案是-> 4/8


printf(“%d\n”, sizeof(&arr[0]+1));

&arr[e]+1 第二个元素的地址,地址大小是4/8个字节,答案是-> 4/8

目录
相关文章
|
1月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
92 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
1月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
59 9
|
1月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
46 7
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
169 13
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
145 3
|
2月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
2月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
45 1
|
2月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
2月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。