指针详解——初学者视角

一、什么是指针

    如果在程序中定义了一个变量,在编译时就给这个变量分配内存空间。系统根据程序中定义的变量类型,分配一定长度的空间。

   (例如:变量类型为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

 



 

   

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值