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

简介: 【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

目录
相关文章
|
17天前
|
安全 C语言
【C语言】如何规避野指针
【C语言】如何规避野指针
20 0
|
19天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
7天前
|
C语言
c语言指针总结
c语言指针总结
13 1
|
13天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
14天前
|
算法 搜索推荐 程序员
C语言中的函数指针和回调函数
C语言中的函数指针和回调函数
10 2
|
17天前
|
存储 编译器 C语言
【C语言】初步解决指针疑惑
【C语言】初步解决指针疑惑
7 0
|
18天前
|
存储 C语言
指针深入解析(C语言基础)带你走进指针,了解指针
指针深入解析(C语言基础)带你走进指针,了解指针
|
19天前
|
C语言 C++
C语言:指针运算笔试题解析(包括令人费解的指针题目)
C语言:指针运算笔试题解析(包括令人费解的指针题目)
|
20天前
|
存储 安全 编译器
C语言怎样定义指针变量
C语言怎样定义指针变量
7 0
|
1月前
|
存储 程序员 编译器
爱上C语言:指针很难?来来来,看看这篇(基础篇)
爱上C语言:指针很难?来来来,看看这篇(基础篇)