1.1什么是多级指针
如果一个指针变量存储的也是一个指针变量的地址,则可以视为该指针也指向了另一个指针,即“指向指针的指针”,这样的指针变量称为多级指针变量。
1.2二级指针
对于指向处理数据的指针变量称为一级指针变量,简称一级指针。而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。同理还有三级指针、四级指针等。
二级指针定义形式一般如下:
<数据类型> ** <指针名> ;
eg:
运行结果:
注意 : 二级指针变量q保存了p的地址(q = &p),
所以*q 等价于p 等价于 &m
所以**q 等价于*p 等价于 m
2.1什么是指针数组
如果有一个数组其所有元素均为指针类型,则这个数组称为“指针数组”。也就是说,指针数组的每个元素都是一个指针变量。
指针数组的一般形式:
<数据类型> *<指针变量数组名>[<大小>];
eg:
int *p[2];
char *c[9];
注意:这里由于”[ ]”优先级高于”*”,因此数组名先于”[ ]”结合,这就构成一个指针数组形式。
2.2理解指针数组名
对于指针数组的数组名,也代表数组的起始地址。由于数组的元素已经是指针了,数组名就是数组首元素的地址,因此指针数组的数组名是指针的地址,即二级指针。
如果通过指针数组,表示数组元素所指向对象的值
p[i] 表示数组的第i个元素;
*p[i] 表示第i个元素所指向对象的值
同时p表示指针数组的首地址,
p = &p[0]
*p = p[0]; **p = *p[0]
所以
*(p+i) = p[i] 表示数组的第i个元素;
**(p+i) 表示第i个元素所指向对象的值
2.3字符指针数组
若数组中存储了若干字符串的地址,则这样的数组就叫作字符指针数组。
示例:
一维字符 指针数组ps[5] 里面存放着字符串首地址
char *ps[5] = {“beijing city”, “New York”, “London”, “Paris city”, “Moscow city”};
定义一个二级指针变量,并指向指针数组首地址;
char **pps = ps; 那么pps指向 指针数组的首地址
2.4针数组在main()函数中作为形参
我们平时书写的main()函数一般为:
int main()
实际上这是省略了main函数形参的写法。main()函数的完整写法是:
其中,argc和argv就是main()函数的参数,他们是程序的“命令行参数”。
argc (argument count):参数个数
argv (argument vector):参数向量表
例如:如果我们执行a.out:
./a.out
则这个就是“命令行参数”,可以传递到main()函数中。此时argc=1,argv[0]="./a.out" 这样我们可以在执行程序时携带参数。
例如我们在执行main()函数时携带参数:
./a.out 1 2 3
则此时argc=4,argv[0]="./a.out",argv[1]="1",argv[2]="2",argv[3]="3"这时我们就可以直接通过访问argv[]数组获得携带的参数。
2.5指针数组与二维数组
通过指针数组来遍历二维数组中的所有元素。二维数组有几行则指针数组就有几个元素。
示例:
2.6 指针数组与数组指针的比较
int (*p)[n] , p是一个指针,指向整个一维数组,这个一维数组长度为n, p+1时,p增加整个数据的长度。数组指针也称为指向一维数组的指针, 或叫行指针。
int *p[n], p是一个数组,这个数组元素是地址,p+1,指向下一个数组元素。p = a属于赋值错误,因为p是常量。只能对元素赋值a[0] = a, *p = a。