一、什么是指针
如果在程序中定义了一个变量,在编译时就给这个变量分配内存空间。系统根据程序中定义的变量类型,分配一定长度的空间。
(例如:变量类型为int,则分配4个字节)
内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。
在地址所标识的内存单元中存放数据,这相当于旅馆中各个房间中居住旅客一样。
可以通过下面语句将a的起始地址存放到A中:
A=&a; // &a是变量a的存储单元的起始地址;
&是取地址运算符,&a是变量a的地址;
二、指针的定义
格式: 数据类型*指针变量;
例如:int *p;这表明,定义一个指针p,p是int类型的指针;
但是可以发现,这个指针没有初始化,说明指针是一个野指针,容易产生一些难以发现的问题,所以一般不这么定义。而是在定义的时候就告诉它指向哪里,例:int *p=&a;
(简单解释一下::例a=3,则&a是a的地址,那么p=&a也是a的地址,但是*p的结果的3)
二:指针的赋值
int a=5;
int *p=&a;
cout<<*p<<endl; //输出为指向对象a的值5 ,*为解引用操作符
cout<<p<<endl; //输出为地址值0x22fe44
&在表达式中,并非紧跟类型说明符,不是定义一个引用,所以为取址符(一定要清楚*或&是在表达式中,还是在定义中)
如果写成int *p=a则会编译报错,原因是:指针不是整形。要清楚指针和整数的区别
虽然地址值是一个整数,但是,从定义上来说,整数是可以加减乘除的,而指针描述的是位置,显然两个指针相乘没有意义
所以不能简单的将整数赋给指针,如:
p=0x22fe44[错] p=(int *)0x22fe44 [对]
变量的地址,一般是指针类型,不同类型变量的地址,用不同的指针进行保存, //如int类型的地址,使用int *保存;char类 型的地址,用char *保存
定义指针对象,需注意以下几点
1.指针的类型必须和所指向的对象的类型一致;例如
char b='A'; char *p=&b; 【正确】 char b='A'; int *p=&b; 【错误】
2.和引用类似,定义多个相同类型指针对象的时候,每个对象名前都要加*
int b=5,*p1,*p2; (最好要赋值:int b=5,*p1=&b,*p2=p1) //在定义中,把p1的值赋给p2
3.定义指针对象时,如果不知道指向哪里,则可以用nullptr来初始化(否则就成为上面所说的野指针)
int b=5,*p1=&b,*p2=nullptr
三:改变指向
#include<iostream>
using namespace std;
int main()
{
int i=1,j=100,*p1=&i,*p2=&j;
cout<<"i的地址为:"<<&i<<endl;
cout<<"j的地址为:"<<&j<<endl;
cout<<"p1表示"<<p1<<"根据输出结果可知,p1为i的地址0x70fe0c"<<endl;
cout<<"p2表示"<<p2<<"根据输出结果可知,p2为j的地址0x70fe08"<<endl;//
p1=p2;//把p2的地址赋给p1,则p1变为j的地址
cout<<"输出p1指向对象的值为"<<*p1<<endl;//输出p1指向的对象的值
cout<<"果然是j的值"<<endl;
return 0;
}
//改变指针指向,简单的来说,就是把一个新的地址赋给指针变量
(读者可以自行运行下代码,不同编译器可能运行的地址是不一样的,不过丝毫没关系)
关于指针与数组的关系,请看下面这篇文章:
https://blog.csdn.net/weixin_45807161/article/details/105297408