C语言学习-多级指针与指针数组

1.多级指针

1.1什么是多级指针

如果一个指针变量存储的也是一个指针变量的地址,则可以视为该指针也指向了另一个指针,即“指向指针的指针”,这样的指针变量称为多级指针变量

1.2二级指针

对于指向处理数据的指针变量称为一级指针变量,简称一级指针。而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。同理还有三级指针、四级指针等。

二级指针定义形式一般如下:

<数据类型>  ** <指针名>

eg:

C语言学习-多级指针与指针数组

运行结果:

C语言学习-多级指针与指针数组

注意 : 二级指针变量q保存了p的地址(q = &p),

所以*q 等价于p 等价于 &m

所以**q 等价于*p 等价于 m

 

2.指针数组

 

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个元素所指向对象的值

C语言学习-多级指针与指针数组

 

2.3字符指针数组

若数组中存储了若干字符串的地址,则这样的数组就叫作字符指针数组。

示例:

一维字符 指针数组ps[5] 里面存放着字符串首地址

char  *ps[5] = {“beijing city”,  “New York”, “London”, “Paris city”, “Moscow city”};

    定义一个二级指针变量,并指向指针数组首地址;

       char **pps = ps; 那么pps指向 指针数组的首地址

C语言学习-多级指针与指针数组

C语言学习-多级指针与指针数组

 

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指针数组与二维数组

通过指针数组来遍历二维数组中的所有元素。二维数组有几行则指针数组就有几个元素。

示例:

C语言学习-多级指针与指针数组

C语言学习-多级指针与指针数组

 

2.6 指针数组与数组指针的比较

  1. 数组指针:

int (*p)[n] , p是一个指针,指向整个一维数组,这个一维数组长度为n, p+1时,p增加整个数据的长度。数组指针也称为指向一维数组的指针, 或叫行指针。

  1. 指针数组:

int *p[n],  p是一个数组,这个数组元素是地址,p+1,指向下一个数组元素。p = a属于赋值错误,因为p是常量。只能对元素赋值a[0] = a, *p = a。