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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【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

目录
相关文章
|
2月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
50 0
|
2天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
18 2
|
2月前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
2月前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
2月前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
2月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
2月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
2月前
|
C语言
C语言指针(3)
C语言指针(3)
14 1
|
2月前
|
编译器 C语言
【c语言】指针就该这么学(2)
本文详细介绍了指针与数组的关系,包括指针访问数组、一维数组传参、二级指针、指针数组和数组指针等内容。通过具体代码示例,解释了数组名作为首元素地址的用法,以及如何使用指针数组模拟二维数组和传递二维数组。文章还强调了数组指针与指针数组的区别,并通过调试窗口展示了不同类型指针的差异。最后,总结了指针在数组操作中的重要性和应用场景。
19 0