1.指针数组
本质是一个数组,数组中数据元素是指针。
数据类型 * 数组名[整形常量]; 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]};// 指针指向了数组,可以读取可以修改存放字符串使用字符数组,操作字符串使用指针。
存放多个字符串使用二维字符数组(多个字符串的话),操作字符串数组使用指针数组
2.数组指针
对一维数组名执行取地址操作(&) , 地址值不变,类型升级为指向整个数组的指针
对数组指针执行解引用操作 (*) , 地址值不变, 类型降为指向第一个元素的指针
2.1应用
- 需要和二维数组配合使用
- 把二维数组作为参数的时候,在定义被调函数需要声明参数的数据类型时会用到。
#include <stdio.h> { 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("*(a+1) addr %d\n", *(a + 1)); // int printf("a[1] addr %d\n", a[1]); // int printf("a+1 addr %p\n", a + 1); // int * printf(" &a %p\n", &a); // 数组指针 printf("&a+1 %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",*(*(array2+1)+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",*(*(p2+1)+2)); printf("&a[0] %p\n",&array2[0]); printf("&a[1] %p\n",&array2[1]); printf("p2 %p\n",p2); printf("p2+1 %p\n",p2+1); } { 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] = > *(p2+1) 下标运算符 和 解引用运算符的关系。 }3.二级指针
指向指针的指针。 在定义指针变量的时候,会开辟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; }