一、数组指针
1.1 含义
数组指针本质是一个指针,它指向一个数组也就是说它指向数组在内存中的起始地址。数组指针可以用来处理多维数组,尤其是二维数组。
1.2 数组指针的一般形式
首先数组的一般形式是:
int a[10] = {1,2,3,4,5};
这里a代表的是这个数组的数组名,而数组名是首元素的地址,也就是a[10]的地址。
数组指针的一般形式是:
int (*pa)[10] = &a;
pa是一个数组指针,它是一个指针含有十个元素的int类型数组。pa 会指向整个数组,而不是数组的首元素。因此,不能直接写 int (*pa)[10] = a,因为a只是一个一维数组的首元素地址。如果a是一个二维数组,就可以写 int (*pa)[10] = a,具体看下面例子。
此时,pa++是自增一个数组类型的长度,一个int类型是四个字节,而数组里面有十个int类型的元素,也就是会增加四十个字节。
一般来说数组名是数组首元素的地址,但有两个例外:
- sizeof(数组名):数组名表示整个数组。计算的是整个数组大小,单位字节。
- &数组名:数组名表示整个数组, 取出的是整个数组的地址。
1.3 数组指针的使用
数组指针一般用在二维数组中。
二维数组的数组名表示:首元素的地址,首元素是第一行!
二维数组可以用二维数组接收也可以用数组指针来接收。
例:
#include <stdio.h>
#include <string.h>int main()
{int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};int (*pa)[3];int i, j;pa = a;printf("a arr length is %d\n", sizeof(a)/sizeof(a[0]));for(i = 0; i < sizeof(a)/sizeof(a[0]); i++){for(j = 0; j < 3; j++){printf("%d ", pa[i][j]);}printf("\n");}return 0;
}
二、指针数组
2.1 含义
本质是个数组,这个数组里面存放着指针的地址。
2.2 指针数组的一般形式
char *arr[10]
2.3 指针数组的使用
指针数组主要是应用在多个字符串的处理上。
#include <stdio.h>
int main()
{int a[5] = { 1,2,3,4,5 };int b[5] = { 6,4,8,3,1 };int c[5] = { 2,5,8,6,1 };int* arr[] = { a,b,c };for (int i = 0; i < 3; i++){for (int j = 0; j < 5; j++){printf("%d ", *(arr[i] + j));}printf("\n");}return 0;
}
在这里可以把abc看成一个二维数组,这样*(arr[i] + j)等价于arr[i][j]。
三、总结
- 数组指针:指向一个数组,通常用于处理二维数组。
- 指针数组:一个数组,里面存放的是指针的地址,通常用于处理多个字符串或数组。