指针数组与数组指针

来源:互联网 发布:pp助手 mac 备份app 编辑:程序博客网 时间:2024/05/20 09:05

在c语言中有两个总是让人迷惑的概念:指针数组与数组指针,这里简单的解释一下

指针数组

指针数组的理解

指针数组着重点在后两个字,数组,对,这就是一个数组,只不过不同于其他数组,该数组的每个成员都为指针,这里可以将指针视为一种数据类型,这个数据类型包含char *, int *,short *…等,这样可以同其它数组一样来理解(整形数组,字符数组…,这里为指针数组),指针类型的一个数组

指针数组的定义

指针数组的定义相对简单:

char *p[10];

这里由于[ ]的优先级高于*,所以p会先与[ ]结合,这就使得p为一个数组,然后再定义该数组为什么类型(char *)

数组指针

数组指针的理解

数组指针的着重点同样在后两个字,指针,这里为一个指针,只不过该指针指向一个数组,这里可以将数组理解为一种数据类型,数组指针就是利用该类型创建的一个指针变量。

数组指针的定义

相对于指针数组,数组指针的定义方法就比较多,主要有如下三种:

第一种

typedef int A[10];A *a;int b[10];a = &b;

这里为先定义一个数组类型,再用该类型来定义一个该类型的指针变量(数组指针变量),然后让该变量指向一个相同类型大小的数组。

这类解释一下为什么要用&b,我们知道,我们定义的a位指向一个一维数组的指针,而一维数组名表示的位首元素地址,为我们要的是整个一维数组的首地址,所以这里对一维数组取地址,就位整个一维数组的地址,但由于一维数组首元素地址和整个一维数组的地址相同,所以不加&会warning不会报错,不推荐使用。

同样,这里如果定义一个二维数组的话,可以不加&,二维数组数组名就表示二维数组的首元素地址,即一维数组的地址(二维数组的元素就是一维数组)

第二种

typedef int (*A)[10];A a;int b[10];a = &b;

这里是直接定义了一个数组指针类型,再定义数组指针变量。注意,这里的定义与指针数组的定义相似,这里由于是要定义一个指针,所以使用( )将其优先级打乱,这里( )与[ ]优先级相同, 从左向右结合,即A为一个指针类型

这里还有一种不常见的情况,指向一维数组的指针只能指向一维或二维数组(一维数组使用&转换为整个一维数组的地址,二维数组名就表示首一维数组地址),若想指向一个三维数组(元素为二维数组)就要使用指向二位数组的指针int (*A)[10][10],(可以想象三维数组为三颗*,指向二位数组的指针也为三颗*)

第三种

int (*a)[10];int b[10];a = &b;

这一种与上一中类似,这里是直接定义了一个数组指针类型,上面一种是先定义数组指针类型,再拿类型定义变量

比较常用的位第二种与第三种

指针数组于数组指针的使用

指针数组

指针数组的使用与普通数组的使用基本相同,当然并不能直接给每个元素赋值,它的每个元素都是指针,保存着一个地址,乱赋值程序就会崩溃

int *a[3];a[0] = (int *)malloc(sizeof(int));*a[0] = 10;int b[10] = { 1, 2, 3, 4 };a[1] = b;a[1][4] = 5;

这里第一个是将一个指针数组内的第1个元素指向堆区分配的一个int内存,然后为其赋值

第二个是让他指向一个相同类型的数组,然后就可以对数组内的元素进行操作

数组指针

数组指针的使用类似于多维数组,这里只分析指向一维数组的指针(char (*a)[10]),我们知道指向一维数组的指针可以指向一维数组,同样可以指向二维数组,所以这里有分为两种情况

指向一维数组

char (*a)[10];char b [10] = "abcde";a = &b;printf("%c %c %c\n", **a, *(*a + 1), (*a)[2]);

这里a表示为指向整个一维数组,所以使用*来让其表示指向一维数组首元素地址(a = &b –> *a = *(&b) –> *a = b),然后再用*取值,就是字符
这种情况在使用时一定要给指针名绑定一个 * ,让其跟指针名先结合,这样在操作时才能减少出错

指向二维数组

char (*a)[10];char b[2][10] = { "hello", "rain" };a = b;printf("%c %c %s\n", *(*(a + 1) + 1), a[1][1], a[1]);

让一个指向一维数组的指针指向一个二维数组,使用时就像在使用数组本身一样

在解释一下为什么能指向二维数组,这里是将 a = b ,b是二维数组名,表示首元素地址,二维数组的元素为一维数组,所以这里类型正好匹配

原创粉丝点击