大话指针

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_40946921/article/details/90047918

在很多教材中,一讲到指针的章节,首先铺天盖地的给你来一大堆云里雾里的定义,光看这密密麻麻的文字都晕了,耐着性子迷迷糊糊看完,感觉像是明白了指针是什么,但下次又看到,咦?这个指针怎么可以这么用。由于经常有人询问指针的问题,于是乎,我决定写下这篇文章,来说说我怎么理解指针。

为什么编程语言中会有指针这个东西,这东西难道是弄出来故意为难开发者的吗?很显然,不是!它既然存在,肯定有它存在的意义,可惜的是,大多数教材都没有很清楚的说明为什么要用指针,随便扔给你一段代码,告诉你:“这个就是指针!”,这不明显的耍流氓么。

哈哈,玩笑归玩笑,下面开始。

开门见山的说,为什么要用指针?比较常见的用法就是把指针当成函数参数,众所周知:

函数的形参如何改变,实参永远都不会发生改变——张春元第一定律

 假如我们想写一个函数,功能是:改变某个变量的值,你会怎么写?
 

很多小萌新一开始会写出这样的代码,结果运行一看,咦?懵逼了吧,一阵吐槽:垃圾电脑,垃圾编译器,垃圾C/C++。

其实犯这样的错误很正常,这个时候请想到我们的定律(我老师的定律=.=),这个时候有些聪明的同学可能就要出来打的我的脸了,用指针不就可以改形参了吗?反手给我来了一段代码:

乍一看,还真改了,不过我得打你的脸,int*是什么?指针,对吧,指针里面放什么,地址啊,你告诉我难道变量a的地址变了吗?没有啊,形参还是没变,难道我把学校图书馆地址告诉你,你把图书馆炸了,图书馆的地址就会改变?是吧,所以,从此以后请牢记这条定律(专治各种不服)

误区:

有些同学可能会这样去解读代码,这样的说法是错误的,最好不要将指针当做有什么指向关系,它就是一个普通的变量,上面的语句只是进行了一个简单的赋值(值是地址)

之前还有个朋友跟我吐槽为什么改了a,b没变(相似的问题),我来比喻一下这件事有多简单:你拿纸把图书馆的地址给记下来,然后把纸上的地址再改一下,难不成图书馆就会瞬间移动了?这就好比“掩耳盗铃”一样

多维指针也是指针

比如我要修改的变量是int类型,那么我就用int*做参数,调用的时候取变量地址

如果我要修改的变量是int*类型,那么就用int**做参数,同样调用的时候取变量地址;

以此类推,是不是把多维的指针都给搞懂了,我们用指针当参数,只是为了修改指针低纬度的数据

实际操作指针变量

int *a;  //注意这与int* a;没有区别,只是代码风格不同。

上面的代码干了什么?定义了一个叫a的指针,是吧,聪明!但你给我记住了,以后再也不要把a记成指针,那要怎么记?记好了,a是一个int*类型的变量!

从现在起,忘了有指针这个东西,取而代之的只是多了一些数据类型,它们有一个共同点:指针类型名中至少有一个*(虽然可以通过别名隐藏*,此阶段可忽略),像基本数据类型一样,类型是值的类型,比如int *a;你可以放一个int*的值到a里面。

所以:把指针当成一个数据类型大家族,而不是一种迷糊的概念。

有关指针的两个重要的操作符:

     算是当成类型转换

  • &(取地址运算符):在数据类型上增加一个*;
  • * (取内容运算符):在数据类型上消除一个*;注意:在定义变量时的*不是取内容!
#include<iostream>
using namespace std;
const int n;
int main() {
	int* a, b;	//注意这个写法,这里a是int*类型,b是int类型,千万不要当成同种类型
	*a = b;		//取a的内容(消除a类型的一个*:int* -> int)故int = int是没问题的
	a = &b;		//取b的地址(增加b类型一个*:int -> int*)故int* = int*也是没问题的
	a = &*&*&*&b;	//再来看这个,不就是多做了几次转换吗?
	return 0;
}

指针注意点:

     一般情况下,指针是占4个字节(跟系统有关),与指针类型无关,因为只需要存储地址,不要以为char占一个字节,char*就也是占一个字节,二者没有任何联系,char*仍然占4个字节。

     数值与指针的区别:数组是一个分配了连续数据空间的指针,而指针,只分配了一个用于存储地址的空间。

     c++中有引用,最好使用引用容易理解。

 

 

猜你喜欢

转载自blog.csdn.net/qq_40946921/article/details/90047918