C语言的指针
C语言是汇编之上最靠近硬件操作的语言,其中最重要的一点便是指针,指针是C语言操作内存的利器,学好指针对理解其它语言的机制也有帮助,比如Java语言的this vs super C++中的应用、move。
变量与内存的相关操作
数组变量与非数组变量
分配、读写、释放,在C语言中分配一段内存的方法一般有2种,1.变量的声明(局部变量、全局变量)2.使用malloc分配,无论哪种方法,内存分配的过程都是一样的,区别是释放内存的不同需求
在C语言中,声明一个变量具有两个基本要素:
1.变量类型–约定了这段内存的类型和大小
2.变量名称–这块内存的别名,用于识别这块内存,给写代码的人看的,汇编完成变量名就不存在了
-
变量类型进一步可以分为:
1.非数组变量类型
包括 int short long float double char 结构体/联合体,指针变量类型等
2.数组变量类型
数组变量类型是一种构造类型,是由多个同样的变量类型(包括数组变量类型和非数组变量类型)组成或者说构造成的一种一维构造类型包含两个要素:元素个数和元素的变量类型,数组变量类型的元素可以是非数组变量类型,任何数组变量类型分配的内存也可以通过sizeof这个操作符来获取
例如:int a[2] 变量类型是int[2] 变量名是a 其大小为sizeof(int[2]),或者sizeof(a),对于int[2]其大小就是int*2的大小
float[2][3] 数组变量类型,包含两个元素,每个元素的类型是float[3]
double[3][4][5]数组变量类型,包含3个元素,每个元素的类型是double[4][5]
仍然可以通过sizeof这个操作符获取其大小,sizeof(float[2][3]),sizeof(double[3][4][5])
float[2][3]的大小为 float*2*3,double[3][4][5]的大小为 double*3*4*5
C语言中所有的数组在存储上都是一维的
数组类型的声明方式:
变量类型为float[2][3],变量名b 则 float b[2][3]
变量类型为double[3][4][5],变量名c 则 double c[3][4][5]
要能正确的识别出数组变量声明中的变量类型和变量名,这是指针理解的基础 -
任何变量类型分配的内存大小可以通过sizeof这个操作符来获取,sizeof(类型名),例如:sizeof(int),此指令在汇编阶段起作用,即汇编完成这个值就计算出来了
指针变量类型
指针变量类型是一个非数组变量类型
-
任何一种变量类型(数组与非数组),都有指向其的一个指针变量类型,反之亦然
例如:指向int变量类型的指针变量类型是int*, 指向int[2]变量类型的指针变量类型是int(*)[2] -
指针变量类型是一个非数组变量类型 因此指针变量类型也有相应的指向其的另一个指针变量类型
例如:指向 int* 变量类型的指针变量类型是int**,指向int(*)[2]变量类型的指针变量类型是int(**)[2] -
指针变量类型既然是普通的非数组变量类型,因此可以用来构造数组变量类型,作为数组的元素
例如:int*[2]包含两个元素,每个元素的数据类型是int*,把int*当作一个整体,比如看作PINT,则int*[2]可以写成PINT[2],即PINT[2]包括两个元素,每个元素的类型是PINT -
指针变量类型构成的数组变量类型也有其对应的指针变量
例如:int*[2],float*[2][3],double*[2][3][4] 对应的指针变量类型 int*(*)[2],float*(*)[2][3],double*(*)[2][3][4]
把int*,float*,double*当做整体来看,更好理解,比如把int*当整体看作PINT,则int*[2] 为PINT[2]对应的指针变量类型PINT(*)2 -
指针变量类型的大小与计算机的位数有关,即地址总线的宽度,寻址位宽,32位机是4个字节,64位机是8个字节
变量类型总结
假设变量类型为Var_T 变量名 N
变量的声明可以抽象为:Var_T N; 变量类型对应的指针类型为Var_T*,具体的申明方式还要根据具体的语法规则