c++指针和内存结构总结

一、指针:
定义:指向被指向对象的内存地址
如: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);

    推荐阅读