今天学习了指针数组和数组指针,相较于之前学习过指针来讲,今天学习的算是之前从未接触过的新知识,算是知识上的盲区,指针变来变了去,对概念的理解也逐渐的模糊了,所以接下来的时间要好好去琢磨这一块的知识,争取能啃下来这块硬骨头
1.void指针
1.主要用于存放内存空间地址
2.函数传参,不同类型的指针可以通过转换为void*传参
将内存地址为0x12345678的空间赋值为0x11223344 *((int *)((void *)0x12345678) = 0x11223344;2.二级指针
1.函数中想要修改函数外的指针变量的时候就要使用二级指针
2.指针数组传参要传二级指针和长度
#include<stdio.h> void fun(char **ptemp) { *ptemp = "hello"; return; } int main(void) { char *p = NULL; fun(&p); printf("%s\n",p); return 0; }注:这段代码定义的函数想要修改函数外的指针变量就要使用二级指针,否则在定义函数形参的时候定义指针类型的形参就是值传递,形参是实参的副本,实参永远得不到改变
3.指针数组
1.指针数组是数组,数组指针是指针
int *a[5] //定义了一个int类型的指针数组,里面存放了五个指针,每个指针8个字节,这个数组占40个字节2.字符串存储用字符型数组,操作字符串用指针
3.字符串数组存储用二维字符型数组,操作字符串数组用指针数组
4.数组指针
1.指针指向一个数组
int a[5] ={1,2,3,4,5}; int (*p)[5]; 定义了一个数组指针,占8个字节空间,指向20个字节的指针注意:一维数组的数组名是指向数组第一个元素的指针常量
sizeof运算时不能理解为int*型
对一维数组&时,值不变,类型升级为指向整个数组,对数组指针取*运算时,值不变,类型降级为指向数组的第一个元素的指针
5.二维数组传参:
1.二维数组传数组名和第一维长度
int fun(int (*p)[3],int len)可以理解二维数组就是多个一维数组组成
二维数组的数组名就是指向第一行的数组指针,对a取*就是指向第一行第一列的指针,再对a取*就是对第一行第一列的元素进行元素访问,其次就是p[i]等价于*(p+i)