每个程序都是一段进程
指针是指向存放变量的地址
1,栈
函数调用
局部变量
等都是在栈空间里面操作的
2.堆
静态变量
全局变量
数组
等都是定义在堆空间里面的
电脑内存空间
|-------|上面一部分为栈空间
| | |
| | |(栈,开辟空间)
| | \/
| |
| |
| | /\
| | |(堆,开辟空间)
| | |
| |下面一部分为堆空间
|-------|
开到栈里面的变量是随机的值(默认)
开到堆里面的变量都为0(默认)
找地址的方法
char a='c';
cout<<(void*)&a<<endl;
指针的运用
int a=1;
int* p=&a;//表示p是一个int 类型的指针,p的数值等于变量a的地址
//此时p的值为a的地址
*p;//表示取得a的值1;
*p=12;//表示给这段地址赋值为12,同时这段地址表示a的值故a的值也会一起更改
p本身也是一个变量故p也有存放的地址
int** q=&p;来获取指针p的指针;
·································
数组也是一种特殊的指针叫数组指针
比如说
int a[3]={1,2,3};
cout<<a<<endl;
这样会输出a的地址
a这个指针存放的是数组起始的地址
就 数组a的地址和a[0]的地址是一样的
比如说数组a前面还开了一个变量b
那么数组a的地址是变量b的地址的下一个地址
比如说 int 类型的数组
那么每个数组a[0],a[1],a[2]之后他们的地址之间相差4个字节
····································
指针的运算
int a[10]={0,1,2,3};
int* p = a;//代表访问a[0];
int* p+1=a;//代表访问a[1];
//p+1之前先看看p为什么类型的如果是int类那么地址之间相隔4其他类比即可
//字符类型要强制类型转换下才能看到地址~~
cout<<p<<endl;//代表输出 指针类型p的数值
cout<<*p<<endl;//代表输出 指针类型变量p的地址
注意:因为数组等价于指针 a[2] 和 (a+2)等价
cout<<a[2]<<endl; cout<<(a+2)<<endl;
这俩效果是一致的
scanf("%d",a);//指针可以不用加 & (取地址符号)~~因为指针本身代表了地址
指针的运算
指针的减法,,这样是算出指针a和指针b之间间隔了几个int
不允许俩个不同类型的指针相减
int s[]={1,2,34,5};
int* a=&s[1];
int* b=&s[2];
cout<<b-a<<endl;
引用
int* p = &a;//代表定义了一个指针变量p并且p的数值等于a的地址
int& p = a;//引用,定义了一个变量p并且p和a之间存储在同一个地址
就是p的数值和a的数值之间胡同
可以把 变量p看做变量a的别名