C语言--day16
指针数组数组指针指针数组本质是一个数组。 数组中数据元素是 指针。指针是字符类型指针用的多数据类型 * 数组名[整形常量]int * a[4]char* a[4]{NULL}; char * b[5]{hello,ok,how,are,you}; // 指针指向了字符串常量去只可以读取不可以修改char str[8][100]{hello,ok,how,are,you}; char *str3[5]{str[0],str[1],str[3]};// 指针指向了数组可以读取可以修改存放字符串使用字符数组操作字符串使用指针存放多个字符串使用二维字符数组(多个字符串的话)。操作字符串数组使用 指针数组数组指针对一维数组名执行 取地址操作() , 地址值 不变 类型升级为指向整个数组的指针对数组指针 执行 解引用操作 (*) , 地址值 不变, 类型降为指向第一个元素的指针应用需要和二维数组配合使用把二维数组作为参数的时候在定义被调函数需要声明 参数的数据类型会用到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); // int printf(a[0] addr %d\n, a[0]); // int printf(*(a1) addr %d\n, *(a 1)); // int printf(a[1] addr %d\n, a[1]); // int printf(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; int 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 --16byte printf(array2[0] is addr%p\n, array2[0]);// int * 1 4byte printf(array2[0][0] is addr%p\n, array2[0][0]);// int * 1 4byte printf(array2[0][0] is addr%d\n, array2[0][0]); // int printf(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; }