*欢迎来到博主的专栏——C语言进阶指南

博主id:reverie_ly

@toc

N级指针指针变量是一个存放地址的变量,在C语言中,每个变量都会有一个地址值。所以指针变量也有一个地址。

代码语言:c代码运行次数:0运行复制int main()

{

int a = 0;

int* pi = &a;//pi变量的值是a的地址

int** ppi = π//ppi的值是pi的地址

}从vs调试的监视窗口可以看到

pi的类型是int*,存储的是int类型的a的地址。 pi是一级指针

ppi的类型是int**,存储的是int*类型的pi的地址。 ppi是二级指针.

将存储数据变量地址的指针称为1级指针,存储一级指针地址的指针称为2级指针,以此类推。N级指针存储的是N-1级指针的地址。

指针数组声明指针数组的标准形式如下

type *name[];

name是标识符,指针数组的声明是先让标识符与数组声明符([])结合,使这个声明是一个数组,然后在声明指针(*),声明这个数组是一个指针的数组。type是指针指向的变量的类型。

以一个指针数组的声明为例

代码语言:c代码运行次数:0运行复制 int a, b, c, d, e;

int* parr[5] = { &a,&b,&c,&d,&e };该数组parr是一个 5个元素 都是 指针 的 数组。 分别指向a,b,c,d,e这五个变量。此时可以通过解引用数组的元素来操作这些变量

代码语言:c代码运行次数:0运行复制 int a, b, c, d, e;

int* parr[5] = { &a,&b,&c,&d,&e };

*parr[0] = 1;//a=1

*parr[1] = 2;//b=2

*parr[2] = 3;//c=3

*parr[3] = 4;//d=4

*parr[4] = 5;//e=5指针数组与二维数组在数组和指针这一章里我们了解到数组名和指针之间的关系。当数组名作为指针使用时,

指针的值是数组的首元素的地址。

而二维数组的行下标指向的是一维数组的地址。以arr2为例

我们可以发现:

指针数组可以充当二维数组的行下标

因为他们都有着类似的作用,即指向一个数组的地址。

代码语言:c代码运行次数:0运行复制 int arr[2][5] = { 0 };

int* parr[2] = { arr[0],arr[1] };

for (int i = 0; i < 2; i++)

{

for (int j = 0; j < 5; j++)

{

parr[i][j] = j;

}

}

return 0;在该程序中,我们将arr0和arr1作为指针数组的元素,当对parr进行元素访问操作时,可以得到arr0或arr1的地址。再对元素进行访问操作,就能得到二维数组中的元素。

数组指针作为函数的参数可以将指针数组作为函数原型的参数来对二维数组进行操作。

代码语言:c代码运行次数:0运行复制void print(int* parr[])

{

for (int i = 0; i < 2; i++)

{

for (int j = 0; j < 5; j++)

{

printf("%d ", parr[i][j]);

}

printf("\n");

}

}如果将上面例子结合起来,正确的传参形式是

print(parr);

在C语言进阶指南(10)中我们提到了,数组名在作为指针操作时会发生的类型降级的例子。所以上述函数在设计原型时也可以设计为

代码语言:c代码运行次数:0运行复制void print(int** parr)

{

for (int i = 0; i < 2; i++)

{

for (int j = 0; j < 5; j++)

{

printf("%d ", parr[i][j]);

}

printf("\n");

}

}相关文章传送门:

C语言进阶指南(10)(指针与数组)