C语言——深入理解指针

时间:2024-04-13 21:30:51

1.数组名的理解

实数组名就是数组⾸元素(第⼀个元素)的地址,但是有两个例外:
sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,单位是字节

&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)。

除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。

2.使用指针访问数组

数组元素的访问在编译器处理的时候,也是转换成⾸元素的地址+偏移量求出元素的地址,然后解引⽤来访问的。

3.一维数组传参的本质

数组传参的本质是传递数组首元素的地址,所以形参访问的数组和实参是同一个数组。

形参的数组是不会单独再申请数组空间的,所以形参的数组是可以省略掉数组大小的。

4.二级指针

以此类推,三级指针的表示方法为int ** * p...

5.指针数组(是数组)

指针数组模拟二维数组:

上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。

6.字符指针变量

     

 

常量数据放在代码段中,不可更改。

这⾥str3和str4指向的是⼀个同⼀个常量字符串。C/C++会把常量字符串存储到单独的⼀个内存区域,当⼏个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。

7.数组指针变量(是指针)

去掉名字,剩下的就是指针类型

[ ]的优先级高于{ }

字符指针变量:char* p 存放的是字符变量的地址,能够指向字符数据的指针。

整形指针变量:int* p 存放的是整形变量的地址,能够指向整形数据的指针。

浮点型指针变量:float* p存放的是浮点型变量的地址,能够指向浮点型数据的指针。

...

数组指针变量:存放的是数组的地址,能够指向数组的指针

            

8.二维数组传参本质

⼆维数组起始可以看做是每个元素是⼀维数组的数组,也就是⼆维数组的每个元素是⼀个⼀维数组。那么⼆维数组的⾸元素就是第⼀⾏,是个⼀维数组。

二维数组的首元素地址就是第一行地址,第一行地址就是一维数组整个数组的地址,类型是数组指针类型。

⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址,

9.函数指针变量

代码分析:

typedef关键字

typedef 是⽤来类型重命名的,可以将复杂的类型,简单化。
typedef 与 define 的区别:

10.函数指针数组(函数指针类型的数组)

把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组。