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:

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


目录
相关文章
|
12天前
|
C语言
指针进阶(C语言终)
指针进阶(C语言终)
|
12天前
|
C语言
指针进阶(回调函数)(C语言)
指针进阶(回调函数)(C语言)
|
12天前
|
存储 C语言 C++
指针进阶(函数指针)(C语言)
指针进阶(函数指针)(C语言)
|
14天前
|
存储 C++
有关【指针运算】的经典笔试题
有关【指针运算】的经典笔试题
14 4
|
12天前
|
编译器 C语言
指针进阶(数组指针 )(C语言)
指针进阶(数组指针 )(C语言)
|
14天前
|
C语言
【C语言】:详解函数指针变量,函数指针数组及转移表
【C语言】:详解函数指针变量,函数指针数组及转移表
17 2
|
14天前
|
C语言
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
【C语言】:详解指针数组,数组指针及(二维)数组传参(2)
11 1
|
10天前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
14 0
|
11天前
|
存储 C语言
C语言中的多级指针、指针数组与数组指针
C语言中的多级指针、指针数组与数组指针
8 0
|
11天前
|
存储 C语言
C语言数组指针详解与应用
C语言数组指针详解与应用
14 0