指针数组

xiaoxiao2021-02-28  103

int main()

{

// 字符串本身代表一个char*类型的指针!!

char *arr[5] = {"hello1",

"hello2",

"hello3",

"hello4",

"hello5"};

char **p = arr;

int i;

for (i = 0; i < 5; i++)

{

printf ("%s\n", arr[i]);

}

return 0;

}

 

 

二维数组与指针:

 

为了更好的理解指针和二维数组的关系,我们先来定义一个指向 a 的指针变量 p

int (*p)[4] = a;

括号中的*表明 p 是一个指针,它指向一个数组,数组的类型为int [4],这正是 a 所包含的每个一维数组的类型。

[ ]的优先级高于*( )是必须要加的,如果赤裸裸地写作int *p[4],那么应该理解为int *(p[4])p 就成了一个指针数组,而不是二维数组指针,这在 C语言指针数组 中已经讲到。

 对指针进行加法(减法)运算时,它前进(后退)的步长与它指向的数据类型有关,p 指向的数据类型是int [4],那么p+1就前进 4×4 = 16 个字节,p-1就后退 16 个字节,这正好是数组 a 所包含的每个一维数组的长度。也就是说,p+1会使得指针指向二维数组的下一行,p-1会使得指针指向数组的上一行。

 

数组名 a 在表达式中也会被转换为和 p 等价的指针!

 

按照上面的定义:

1) p指向数组 a 的开头,也即第 0 行;p+1前进一行,指向第 1 行。

2) *(p+1)表示取地址上的数据,也就是整个第 1 行数据。注意是一行数据,是多个数据,不是第 1 行中的第 0 个元素,下面的运行结果有力地证明了这一点:

#include <stdio.h>

int main(){

    int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };

    int (*p)[4] = a;

    printf("%d\n", sizeof(*(p+1)));

 

    return 0;

}

运行结果:

16

 

指针数组和二维数组指针的区别

 

指针数组和二维数组指针在定义时非常相似,只是括号的位置不同:

int *(p1[5]);  //指针数组,可以去掉括号直接写作 int *p1[5];

int (*p2)[5];  //二维数组指针,不能去掉括号

指针数组和二维数组指针有着本质上的区别:指针数组是一个数组,只是每个元素保存的都是指针,以上面的 p1 为例,在32位环境下它占用 4×5 = 20 个字节的内存。二维数组指针是一个指针,它指向一个二维数组,以上面的 p2 为例,它占用 4 个字节的内存。

转载请注明原文地址: https://www.6miu.com/read-38707.html

最新回复(0)