一、指针数组
格式:
类型名 *数组名 [数组长度] // 每一个元素都是指针字符型 char *color[5]; // color[i] 可以指向一个字符变量,可以存储一个字符串的首地址
整型 int *a[10]; // a[i]可以指向一个整型变量
指针数组常使用字符型 (每一个指针都可以存储一个字符串 相当于二维数组)
char *color[5]={"red","blue","yellow","green","black"};
使用样例:
①输出首字母为 “ b ” 的单词 (类似二维数组)
if ( color [i][0]==' b ') printf("%s",color[i]);
②交换字符串 (交换 color[0] 和 color[4] )
char *str=color[0];
color[0]=color[4];
color[4]=str;
二、二级指针(指向指针的指针)
格式:
类型名 **变量名 //指向 “ 类型名 ” 指针的指针
int a=10; int *p=&a; // p 指向 a
int **pp=&p; // pp 指向 p
其中 :
① pp 等价于 &p
② *pp 等价于 p、&a
③ **pp 等价于 *p、a
关于一级指针,二级指针本质的理解:(注意交换的顺序)
①交换 a b
int a=10; int *pa=&a;int **ppa=&pa;
int b=20; int *pb=&b;int **ppb=&pb;
int t=a; a=b; b=t;
此时依次输出 a *pa **ppa b *pb **ppb 为 20 20 20 10 10 10
②交换 pa pb
int a=10; int *pa=&a;int **ppa=&pa;
int b=20; int *pb=&b;int **ppb=&pb;
int *pt=pa; pa=pb; pb=pt; // 交换操作 pa=pb 指向 b pb=pa 指向 a
此时依次输出 a *pa **ppa b *pb **ppb 为 10 20 20 20 10 10
③ 交换 ppa ppb
int a=10; int *pa=&a;int **ppa=&pa;
int b=20; int *pb=&b;int **ppb=&pb;
int *ppt=ppa; ppa=pb; ppb=pt; // ppa 指向pb ppb 指向 pa
此时依次输出 a *pa **ppa b *pb **ppb 为 10 10 20 20 20 10
三、二级指针与二维数组
1.整型数组
一维数组名是一个指针(常量),二维数组名是一个二级指针 (二者使用仍有区别)
① 一维数组:
int a[10]; // 取一维数组地址 :int *p=a; (或者 int *p= &a[0];)
// 即 a 就是一个指针常量, a=&a[0];
(a+i) 或 (p+i) 指数组元素 a[i] 的地址: *(a+0)=a[0]; *(p+0)=a[0];
*(a+i)=a[i]; *(p+i)=a[i];
② 二维数组
int a[10][10]; //取二维数组地址 int *pa=a[0]; 或者 int *pa=&a[0][0];
int **ppa=&pa;
//a 就是一个二级指针 a(数组名)=&a[0]; //地址为第一个元素a[0]的地址
a[0]是一个一级指针常量 a[0]=&a[0][0]; //地址为第一个元素a[0][0]的地址
所以 a = & a[0] = && a[0][0]; (值相等但不等价)
a+1是 a 的第二个一维数组的地址 为 &a[1]
例 a+i = &a[i] *(a+i) = a [i] **(a+i) = a[i][0]
*(a+i)+j = &a[i][j] *(*(a+i)+j) = a[i][j]
2.字符型数组
char *str[3]={"one","two","three"}; // str(数组名) 等价 &str[0]
str[0]是一个指针 即 str 是一个二级指针(一维字符串指针数组相当于二维字符串数组)
*str == str [0] **str =str [0][0]
*(str+i)==str [i] *(*(str+i)+j) == str [i][j]
四、二级指针的应用
传递指针的地址:当需要在函数内修改指针本身的值(即指针的地址)时,就需要使用二级指针。
动态分配内存:使用二级指针可以在函数内动态分配内存,并且可以将分配的内存地址返回给调用函数。
使用指针数组:使用二级指针可以定义指向指针的指针数组。
使用指向指针的指针实现二维数组:使用二级指针可以定义一个指针,该指针指向一个包含整型值的指针数组。
其他:二级指针还有其他应用,例如可以用来实现可变参数函数、链表等。