C进阶 :征服指针之指针与数组强化笔试题练习(1)(上)

简介: C进阶 :征服指针之指针与数组强化笔试题练习(1)

一.彻底明白 sizeof 操作符 ,数组名,strlen 函数

1.数组名的意义

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

2.&数组名 ,取出的是整个数组的地址,虽然与数组首元素地址的值相同,但意义却完全不同;

3.除此之外的其他所有情况数组名都表示数组首元素的地址。


2. sizeof 详解

1. sizeof 计算的是操作数的类型长度,单位是字节;

2. sizeof 返回的是无符号整型;

3. sizeof 计算的是操作数的类属性,而不是值属性,即 sizeof 内部的表达式不进行计算;


3.strlen详解

1.描述:

2.参数:

3.返回值:

4.所以 strlen 函数计算的是一个字符串的长度,不可以把参数写成字符或是其他的,且 strlen 遇到 '\0' 就结束了。


补充1:

表达式有两种属性:

1.值属性

2.类属性

补充2:

只要是地址, sizeof 计算时:

1. 32 位机器是4个字节;

2. 64 位机器是8个字节。


例:

 


3.数组名意义详细图解演示

二.关于 sizeof 的指针和数组笔试题讲解

T1.

1. //一维数组
2. int a[] = {1,2,3,4};
3. 1.    printf("%d\n",sizeof(a));
4. 2.    printf("%d\n",sizeof(a+0));
5. 3.    printf("%d\n",sizeof(*a));
6. 4.    printf("%d\n",sizeof(a+1));
7. 5.    printf("%d\n",sizeof(a[1]));
8. 6.    printf("%d\n",sizeof(&a));
9. 7.    printf("%d\n",sizeof(*&a));
10. 8.    printf("%d\n",sizeof(&a+1));
11. 9.    printf("%d\n",sizeof(&a[0]));
12. 10.   printf("%d\n",sizeof(&a[0]+1));

Q1:

sizeof 里只有单独一个数组名,所以 sizeof 计算的就是整个数组的大小,该数组有4个元素,每个元素的类型是 int ,所以整个数组的大小就是 16;

答案:16

Q2:

sizeof 里不是单独的数组名了,也不是&数组名,那么此时的数组名就表示数组首元素的地址,加上0,表示跳过0个字节,所以 a+0 表示的依然是首元素的地址,是地址那么如果是32位机器就是4,64位机器就是8;

答案:4/8

Q3:

sizeof  内部不是单独的数组名,也不是&数组名,那么此时的数组名就表示数组首元素的地址,对其解引用,就是数组首元素 1 ,类型是 int 所以答案是4;

答案 :4

Q4:

与上同理,此时的数组名表示的依然是数组首元素的地址,+1 表示下标为1的元素的地址,所以不是4就是8;

答案:4/8

Q5:

a[ 1 ]表示下标为1的元素,该数组元素类型为 int ,所以答案是4;

答案:4

Q6:

sizeof 内部是&a,表示的是整个数组的地址,是地址那么答案不是4就是8;

答案:4/8

Q7:

&a 取出了整个数组的地址,对其解引用就找到了整个数组,就相当于 *  和  &  相互抵消了,就相当于sizeof 内部只有一个单独的数组名,那么答案就是16;

答案:16

Q8 ,Q9 , Q10:

很明显,这三题 sizeof 内部的表达式都表达的是一个地址,那么答案为4或8;

Q8, Q9, Q10答案:4/8

32位机器打印结果:

T2.

1. //字符数组
2. char arr[] = {'a','b','c','d','e','f'};
3. 1.    printf("%d\n", sizeof(arr));
4. 2.    printf("%d\n", sizeof(arr+0));
5. 3.    printf("%d\n", sizeof(*arr));
6. 4.    printf("%d\n", sizeof(arr[1]));
7. 5.    printf("%d\n", sizeof(&arr));
8. 6.    printf("%d\n", sizeof(&arr+1));
9. 7.    printf("%d\n", sizeof(&arr[0]+1));

有了上题的基础,这题做起来就很简单了。

Q1:

sizeof 内部只有单独一个数组名,即此时计算的是整个数组的大小;

注意:数组里的元素不是字符串,所以只存了 6 个元素,并没有 \0 存在

答案:6

Q2:

可以看出,sizeof 内部表示的是一个地址

答案:4/8

Q3:

此时数组名是数组首元素的地址,解引用即为数组的首元素,类型为 char

答案:1

Q4:

表示数组下标为1的元素,类型为 char

答案:1

Q5:

&arr 是一个地址,这就不用多说了

答案:4/8

Q6:

同样是地址,不过这表示的是:

答案:4/8

Q7:

仍然是一个地址,不过和上题的表示的意义不同:


目录
相关文章
|
16天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
30 3
|
15天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
28 2
|
24天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
28 1
|
1月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
1月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
1月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
魔法指针 之 二级指针 指针数组
魔法指针 之 二级指针 指针数组
19 1
|
1月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
24 0
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
3月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)