C语言(13) 指针数组,数组指针 指针数组数组指针指针数组本质是一个数组。 数组中数据元素是 指针。指针是字符类型指针用的多。数据类型 * 数组名[整形常量];int * a[4];char* a[4]{NULL};char * b[5]{hello,ok,how,are,you}; // 指针指向了字符串常量去只可以读取不可以修改#include stdio.h int main(int argc, char **argv) { char *pstr[4]{hello,ok,123,aaa}; // 读取数据 int i0; for(i0;i4;i) { printf(i:%d %s\n,i, pstr[i]); } // 因为指向了字符串常量不能修改。 pstr[0][0] pstr[0][0]1; // p[0]-char* p[0][0] for(i0;i4;i) { printf(i:%d %s\n,i, pstr[i]); } return 0; }char str[8][100]{hello,ok,how,are,you};char *str3[5]{str[0],str[1],str[3]};// 指针指向了数组可以读取可以修改#include stdio.h int main(int argc, char **argv) { char strs[4][100]{hello,ok,123,aaa}; // 指向了数组中字符串可读可写 char *pstr[4] {strs[0],strs[1],strs[2],strs[3]}; int i 0 ; for(i0;i4;i) { printf(i:%d %s\n,i, pstr[i]); } pstr[0][0] pstr[0][0]1; pstr[1][0] pstr[1][0]1; pstr[2][0] pstr[2][0]1; pstr[3][0] pstr[3][0]1; //int i 0 ; for(i0;i4;i) { printf(i:%d %s\n,i, pstr[i]); } return 0; }存放字符串使用字符数组操作字符串使用指针。存放多个字符串使用二维字符数组(多个字符串的话)。操作字符串数组使用 指针数组练习how are you 变成howareyou分别输出#include stdio.h #include string.h int main(int argc, char **argv) { char *pstr[3]{NULL}; char str[100]how are you; char *tmp str; pstr[0] str; int i 1; while(*tmp) { if(*tmp ! ) { } else { *tmp \0; pstr[i]tmp1; } tmp; } for(i0;i3;i) { printf(%d %s\n,i,pstr[i]); } //sort int j 0 ; for(j 2;j0;j--) { for(i0;ij;i) { if(strcmp(pstr[i] ,pstr[i1])0) { // 只是交换 指针内存储的地址值 char* tmp NULL; tmp pstr[i]; pstr[i] pstr[i1]; pstr[i1] tmp; } } } for(i0;i3;i) { printf(%d %s\n,i,pstr[i]); } return 0; }数组指针对一维数组名执行 取地址操作() , 地址值 不变 类型升级为指向整个数组的指针对数组指针 执行 解引用操作 (*) , 地址值 不变, 类型降为指向第一个元素的指针应用1 需要和二维数组配合使用2 把二维数组作为参数的时候在定义被调函数需要声明 参数的数据类型会用到int a[5] {1, 2, 3, 4, 5}; // int []-- int *printf(a addr %p\n, a);printf(a[0] addr %p\n, a[0]);printf(a[1] addr %p\n, a[1]);printf(a[2] addr %p\n, a[2]);printf(*a addr %d\n, *a); // intprintf(a[0] addr %d\n, a[0]); // intprintf(*(a1) addr %d\n, *(a 1)); // intprintf(a[1] addr %d\n, a[1]); // intprintf(a1 addr %p\n, a 1); // int *printf( a %p\n, a); // 数组指针printf(a1 %p\n, a 1);int(*p)[5] a; // int (*p)[5] 数组指针 int* p[5]// int * p1[5] a;#endifint array2[4][4] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};int(*p2)[4] array2;printf(array2 is addr%p\n, array2); //int [4][4] - int (*)[4]1 --》16byteprintf(array2[0] is addr%p\n, array2[0]);// int * 1 --》4byteprintf(array2[0][0] is addr%p\n, array2[0][0]);// int * 1 4byteprintf(array2[0][0] is addr%d\n, array2[0][0]); // intprintf(a[1][2] %d\n,array2[1][2]); //printf(a[1][2] %d\n,*(array2[1]2));printf(a[1][2] %d\n,*(*(array21)2));printf(p2[1][2] %d\n,p2[1][2]);printf(p2[1][2] %d\n,*(p2[1]2));printf(p2[1][2] %d\n,*(*(p21)2));printf(a[0] %p\n,array2[0]);printf(a[1] %p\n,array2[1]);printf(p2 %p\n,p2);printf(p21 %p\n,p21);int array2[4][4] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};array2 类型 -》 指针 -》 int [4][4] int(*)[4] 列是4 1 sizeof(int) *4(列)array2[0] -- 指针 -》 int * 第一行的首元素的地址 array2[0][0]array2[0][0] - int - 数据int(*p2)[4] array2;p2 - 类型 int(*)[4] 1 sizeof(int) *4(列)p2[0] - 类型 int* 第一行的首元素的地址 array2[0][0]p2[0][0] - int - 数据p2[1] *(p21) 下标运算符 和 解引用运算符的关系二级指针指向指针的指针。 在定义指针变量的时候会开辟8个自己的空间 。指针变量本身也是有内存地址的。对一级指针取地址操作就会获得二级指针。需要解引用*两次可以访问到数数据。void fun(char * arg_p) { static char str[10]hello; arg_p str;// 无法修改主调的参数 } int main(int argc, char **argv) { char *p NULL; fun(p); printf(p is %s\n,p); // NULL return 0; }void fun2(char ** arg_p) // 二级指针 { static char str[10]hello; *arg_p str; // 可以修改主调的参数 } int main(int argc, char **argv) { char *p NULL; fun2(p); printf(p is %s\n,p); return 0; }