一、指针:
定义:指向被指向对象的内存地址
如:int xx=10;
int *p=&xx;
指针的操作:+加法 -减法 sizeof() *解引用 ->指向操作符
加减法操作:主要用在线性表中,如数组。
int arr[3]={1,2,3};
int *p1=arr;
//和int *p1=arr[0]一致
int *p2=p1+1;
//和int *p2=arr[1]一致
int *p3=p2-1;
//和int *p1=arr;
一致
解引用操作:
int a=10;
int *p=&a;
//p内存块中存储的是变量a的内存地址
cout<<*p<
sizeof操作:
sizeof(p);
//变量p的字节长度,比如p为int类型,那么sizeof(p)一般为4个字节。
注意事项:
1、普通指针变量2边类型必须一致(常量指针可以不一致,但必须可以隐试转换)
2、指针存在4种状态:指向一个对象;指向紧邻对象的内存地址;空指针;无效指针
空指针:int *p=NULL, *p=0, *p=nullptr;
(最后一种是C++的写法,前面2种是C的写法)
无效指针:int *p;
3、不能访问无效指针
4、一个指针变量最多只能指向一种基类型的变量,但一个基类型的变量可以被多个同类型的指针变量指向
5、对指针变量的解引用操作,都是对基类型变量的操作。如:int a=10;
int *p=&a;
*p=11;
//和a=11;
操作结果一样
二、c++内存模型:
1、源代码区:存储代码的区域(类似jvm里的方法区)
2、静态区:存储静态变量和全局变量的区域(类似jvm里的方法区里的方法区)
3、栈区:存储局部变量和参数的内存区域,由系统开辟、由系统回收的内存区域(类似jvm里的栈)
4、堆区:程序员开辟的一块内存区域用来存储对象的区域,由用户开辟和回收的内存区域。(类似jvm里的堆)
5、常量区(字面值区):(类似于jvm里的方法区的常量池)
指针变量能指向那些区域:
栈区、堆区、静态区、常量区、代码区
三、函数指针和指针函数
函数指针:是一个指针,它指向函数
指针函数:是一个函数,其返回值为指针
头文件:一般用于申明函数,在需要使用时,可以通过#include “头文件名” 将头文件引入进来
库文件:一般用于头文件申明函数的实现
【c++指针和内存结构总结】函数指针:
比如有个函数为:void myswap(int *a,int *b);
定义函数指针:void (*p)(int *,int *)=myswap;
//除了函数名外,其他的地方都必须和函数一样,函数名这里必须用“(*指针名称)”,
它是一个指向函数的指针
int x=1,int y=2;
调用函数指针执行函数:(*p)(&x,&y);
调用函数有如下几种方式:
myswap(&x,&y);
(*myswap)(&x,&y);
(*p)(&x,&y);
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 个人日记|K8s中Pod生命周期和重启策略
- 学习分享|【C语言函数基础】
- C++|C++浇水装置问题
- 数据结构|C++技巧(用class类实现链表)
- C++|从零开始学C++之基本知识
- 步履拾级杂记|VS2019的各种使用问题及解决方法
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- 动态规划|暴力递归经典问题
- 麦克算法|4指针与队列
- 遇见蓝桥遇见你|小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题