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 “头文件名” 将头文件引入进来
库文件:一般用于头文件申明函数的实现

函数指针:

比如有个函数为: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);

你可能感兴趣的:(c++)