提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、void指针
- 二.二级指针
- 三.指针数组
- 四.数组指针
- 五.二维数组传参
- 1.二维整型数组的传参
- 总结
前言
难死我了
提示:以下是本篇文章正文内容,下面案例可供参考
一、void指针
主要用于存放内存空间地址
也用于函数传参,不同类型的指针可以通过转换为 void* 传参
(void* 就是设置一个没有类型的地址,里面可以放任何类型的数据)
//将内存地址为0x12345678的空间赋值为0x11223344*((int*)((void*)0x12345678)=0x11223344;二.二级指针
函数体内想修改函数体外指针变量值的时候,需要传递指针变量的地址,即二级指针
C语言指针数组传参需要传二级指针和长度
inta=100;int*p=NULL;int**q=NULL;p=&a;q=&p;printf("&a:%p\n",&a);//a的地址printf("&p:%p\n",&p);//存放p这个指针的地址printf("&q:%p\n",&q);//存放q这个指针的地址printf("=========================\n");printf("q = %p\n",q);//q放的是p的地址printf("p = %p\n",p);//p放的是a的地址printf("a = %d\n",a);//a的值,即100printf("=========================\n");printf("*q = %p\n",*q);//取q的值,即为p的地址printf("*p = %d\n",*p);//取p的值即a的地址printf("=========================\n");printf("**q = %d\n",**q);//取*q的值,即p所存的地址的值,即为a的值100三.指针数组
本质上为一个数组,里面的数据类型为指针
定义:int *a[5]
定义数组a里有5个元素,占40个字节空间,每个元素都是int *型 C语言中字符串存储用字符型数组,操作字符串用指针 字符串数组的存储用二维字符型数组,操作字符串用指针数组四.数组指针
本质上是指针,指向一个数组
定义:nt a[5] = {1, 2, 3, 4, 5}; int (*p)[5];
1.定义数组指针变量p,占8个字节空间,指向20个字节的指针
2.一维数组的数组名a,是指向数组第一个元素的指针常量,a可以理解为int *型,除以下2种情况
(1)sizeof运算时
对一维数组数组名&时,值不变,类型为指向整个数组的指针地址,就应该是元素总数*步长
a:数组第一个元素的首地址
&a:数组的首地址
(2)数组指针取*,值不变,类型为指向数组第一个元素的指针地址
都是指地址哦
五.二维数组传参
1.二维整型数组的传参
(1)传数组名和第一维长度(行)int fun(int (*parray)[3], int len);
(这里的【3】指3列哦)
(2)在函数里的用法和在主函数里数组的用法是一模一样的,不用变换
二维数组和指针的关系
inta[2][3]={1,2,3,4,5,6};int*p=NULL;int(*q)[3]=NULL;p=&a[0][0];p=a[0];p=*a;q=a;a:指向数组一行元素的数组指针 a[0]:指向第一行第一个元素的指针 a[1]:指向第二行第一个元素的指针 访问第m行第n列元素的方式: a[m][n]*(a[m]+n)//加步长取值*(*(a+m)+n)//a加步长(一次加一列)先到m再加步长取值*(p+m*N+n)//p就是a0,a0一次加一个,先到m行再加步长取值*(*(q+m)+n)//q是a,一次加一列*(q[m]+n)//qm就是第m行q[m][n]//与a【m】【n】等价