指针数组

来源:互联网 发布:吉林十一选五遗漏数据 编辑:程序博客网 时间:2024/05/23 12:16

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 个字节的内存。

原创粉丝点击