C语言系列(15)——指针数组
一、定义
指针数组即,存放指针的数组。
语法:
数据类型 *p[元素个数];
如:定义存放10个整数指针的数组
int *p[10];
其实就是一个数组
,只不过存放的元素是指针变量
。
二、初始化、赋值和元素操作
int a, b, c, d, e;
//p指针数组,存放了5个地址
int *p[5] = { &a, &b, &c, &d, &e };//存放a,b,c,d,e的地址
*(*(p + 0)) = 2;//等价 p[0][0] = 2;
printf("%d\n", a);//打印:2
//p[0][1] = 3;//访问不合法
//字符串类型指针数组:
char n1[10] = "liLei";
char n2[10] = "Binson";
char n3[10] = "xiaowei";
char* name[3] = { n1, n2, n3 };//存放n1,n2,n3的地址
puts(name[0]);//Lilei
puts(*name);//lilei 等价于*(name+0)
putchar(**name);//l 等价*(*(name+0)+0),等价于name[0][0]
**name = 'L';
puts(*name);//Lilei
//初始化为常量字符串
const char* constName[5] = { "Lily", "Lucy", "Jame", "Jim", "jeff" };
puts(*(constName+0));
*(constName+0) = "lily";//改变第一个
puts(*constName);
//*((*constName + 0) + 0) = 'L';//不能修改,因为是常量字符串
//初始化为NULL,5个指针都指向NULL
char* str[5] = { NULL };
三、指针的指针(多级指针)
语法:
数据类型 **p;
例:
int a = 0;
int *p = &a;
int **pp = &p;
int ***ppp = &pp;
printf("%p, %p, %p\n", p, pp, ppp);
图示:
char name[5][10] = { "张三疯", "张无忌", "张铁林", "张学友", "zhangsan" };
char(*p)[10] = name;
//char** pp = name;//error指数组的指针,数组的长度是确定的,所以不能直接用二级指针指向。
const char *name1[5] = { "张三疯", "张无忌", "张铁林", "张学友", "zhangsan" };
const char **pp = name1;//可以理解为一个 char* 类型的一级指针,指向了一个 一维数组(该一维数组元素是指针)。
练习:
如下用指针操作
1、矩阵置换
1、2、3 1、4、7
4、5、6 -> 2、5、8
7、8、9 3、6、9
2、输入10个人的英文姓名,按字母排序(字符串比较大小)输出