多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

【C语言指针进阶】一篇搞懂数组指针与指针数组、二级指针、指针函数与函数指针的区别

【C语言指针进阶】一篇搞懂数组指针与指针数组、二级指针、指针函数与函数指针的区别 一、数组指针数组指针本质是指针指向数组整体的指针。语法int (*变量名)[5]; // 定义了一个指针变量指针变量自己占 8 字节空间可以指向一个具有 5 个元素的整型数组。 // 定义了一个指向 5 个整形元素的数组的指针。 a:首元素地址 --- a[0] --- int* a:数组的指针 --- int (*)[5]; a1:数组指针1 --- 代表偏移整个数组sizeof(a)字节注意int a[5] {1,2,3,4,5}; a:首元素地址 --- int * 除了 2 种场景 1.sizeof(a/数组名); a 不能当作 int * 类型当作数组整体代表整个数组。 2.a; 数组指针该指针类型为 int (*)[5]; 指向一个数组整体。二、指针和二维数组二维数组的数组名是首元素地址首元素是一维指针所以二维数组数组名本质是一维数组指针。int a[5] {1,2,3,4,5}; a --- 首元素地址 --- a[0] --- int * --- 指针 a[n] --- *(an) int a[2][3] {1,2,3,4,5,6}; a --- 首元素地址 --- a[0] --- int (*)[3] --- 数组指针 a[m][n] --- *(a[m]n) --- ((am)n) --- *(am)[n]二维数组的数组名作为函数参数传递int a[2][3] {1,2,3,4,5,6}; void print_2D_array(int a[][列数], int row) {} void print_2D_array(int (*pa)[列数], int row); {} print_2D_array(a, 2); char str[2][100] {hello world, how are you}; void print_str_array(char str[][100], int row) {} void print_str_array(char (*pstr)[100], int row) {} print_str_array(str, 2);三、指针数组指针数组本质是数组该数组中保存的是指针。语法int a[5]; int *a[5]; // int *数组中保存的数据类型该数组中保存的是 int * 指针。 // [5]该数组中可以保存 5 个指针int *。 // 定义了一个可以保存 5 个整形指针的数组整体占 40 个字节。 char *p[5];1指针数组的定义指针类型 数组名[元素个数];2指针数组的初始化char *p NULL; char *p[5] {NULL}; // 将 5 个字符型指针初始化成 NULL char *p hello; char *p[5] {hello, world, how, are, you}; // p[0] --- char * --- p[0] 指针保存字符串常量 hello 的首地址 // p[1] --- char * --- p[1] 指针保存字符串常量 world 的首地址 // p[2] --- char * --- p[2] 指针保存字符串常量 how 的首地址 // p[3] --- char * --- p[3] 指针保存字符串常量 are 的首地址 // p[4] --- char * --- p[4] 指针保存字符串常量 you 的首地址 char *p1 hello; char *p2 world; char *p3 how; char *p[3] {p1, p2, p3};3指针数组和二维字符型数组的区别char str[3][100] {hello, world, how}; sizeof(str) 300 字节 char *pstr3[3] {hello, world, how}; sizeof(pstr) 24 字节 --- sizeof(char *) 8 字节 区别 二维字符型数组中保存的是多个字符串本身指针数组中保存的是多个字符串的首地址。 要保存多个字符串用二维字符型数组要操作多个字符串用指针数组。四、二级指针二级指针本质还是指针是一个指针变量的地址。int **指针名称; // 保存整形指针的指针 char **指针名称; // 保存字符型指针的指针C 语言中主要有两个二级指针的应用场景1想要在被调函数中修改主调函数中的指针变量实参需要传递该指针变量的地址形参用二级指针接收2指针数组的数组名是一个二级指针实参传递指针数组的数组名时形参用二级指针接收。char *str[3] {hello, world, how}; // str[0] --- char * --- 保存了字符串常量 hello 的地址 // str --- str[0] --- char ** --- 二级指针值传递无法在被调中修改主调中的变量只能使用该变量。指针传参可以在被调中修改主调中定义的变量也可以使用该变量。值传递恰好传递的值是一个指针变量无法在被调用修改主调中定义的指针变量可以使用该指针变量。指针传参可以在被调函数中修改主调函数中定义的指针变量也可以使用该变量。五、指针函数指针函数本质是函数具有指针类型返回值的函数。指针函数能返回什么指针1局部变量的地址不能被返回变量数组char str[32] {hello world}; char *str hello world;2具有静态生命周期的变量的地址可以被返回1static 修饰的静态变量的地址2全局变量的地址。3可以返回字符串常量的地址4可以返回通过参数传递给该函数的地址5可以返回堆区申请的且没有被释放的空间地址。六、函数指针函数指针本质是指针指向函数的指针。函数函数的函数名为函数的入口地址。1定义函数指针函数声明 int fun(int , int ); int *pfun(int , int ); 函数指针 int (*pfun)(int , int ); // 定义了一个函数指针变量该指针在内存中占 8 字节 // 该函数指针可以指向一个具有 int 返回值、两个 int 类型参数的函数。 char *(*pfun)(char *); 总结 返回值类型 (*指针名称)(形参表);2函数指针初始化int (*pfun)(int, int) NULL;3函数指针赋值int add(int num1, int num2) {} int (*pfun)(int, int) NULL; pfun add;4函数指针调用函数函数名(实参表); 函数指针的名称(实参表);5函数指针的应用回调函数p将函数作为某个函数的参数传递传递的函数称为回调函数/p p主要为了降低代码的耦合度关联度减少重复代码。/p /li
返回列表