#include<stdio.h>intmain(){int array[4]={1,2,3,4};int* p = array;
p =&array[0];for(int i =0; i <4; i++){//*(p+i) 等效p[i] 等效array[i]printf("%d\t",*(p + i));//printf("%d\t", p[i]); 和上面等效}//不正常的情况的//p[i] 等效*(p+i) //指针操作数组,直接用指针名替换数组的名的用法
p =&array[2];printf("\n%d\n", p[1]);//*(&array[2]+1)printf("%d\n",*(&array[1]+2));//输入的时候用用指针for(int i =0; i <3; i++){scanf_s("%d", array + i);}int array2D[2][2]={1,2,3,4};
p =&array2D[0][0];for(int i =0; i <4; i++){printf("%d\t", p[i]);}printf("\n");return0;}
四、万能指针
万能指针: void * 类型的指针
1.万能指针可以操作任何类型指针
2.使用前必须强制类型
#include<stdio.h>/*
万能指针: void * 类型的指针
1.万能指针可以操作任何类型指针
2.使用前必须强制类型
*/void*mytime(){returnNULL;}intmain(){int num =0;void* pNum =#//使用的时候必须强制类型转换printf("%d\n",*(int*)pNum);char cNum ='A';
pNum =&cNum;int* p =(void*)mytime();printf("%c\n",*(char*)pNum);return0;}
五、多级指针
1.变量地址用指针变量存储
2.指针变量的地址用二级指针存储
#include<stdio.h>intmain(){//变量地址用指针变量存储int num =0;int* p =#//指针变量的地址用二级指针存储int** pp =&p;printf("%d\n",**pp);//三级指针的存储int*** ppp =&pp;printf("%d\n",***ppp);return0;}
六、 内存四区解决问题
1.堆区: 手动回收 动态内存申请的内存 手动申请,手动释放
2.栈区 : 局部变量,函数参数 自动释放,当使用完后系统会回收资源
栈结构: 先进后出 堆: 随机访问
3.静态区: 全局变量+静态变量 常量区: 不能改变
4.代码区: 写的代码编译后存储的位置 机器指令
#include<stdio.h>//不能返回局部变量地址//warning C4172: 返回局部变量或临时变量的地址: numint*ReturnPoint(){int num =1001;return#}int*returnNum(int a){return&a;}//下个那个不算int*returnMyNum(int*a){return a;}intmain(){//写入访问权限冲突char* p ="ILoveyou";//不会修改,只做打印显示需求//*p = "I"; 错误//*p = 'I'; 错误//printf("%d\n", *p);char str[]="ILoveyou";
p =&str[0];//*(p+0) p[0] str[0]*p ='C';printf("%s", p);int* pReturn =ReturnPoint();printf("\n第一次:%d\n",*pReturn);printf("第二次:%d\n",*pReturn);return0;}