高级程序员的必经之路-指针(入门篇,一级指针)

好久不见,甚是想念。hello,大家好我是玉无涯。没错这个男人又回来了。好了,废话不多说今天我们来讲一讲C/C++中语法的核心内容之一指针。由于指针难度较大,我把它分为三个部分,分别为入门篇,中级篇,高级篇。如果文章好评度高的话我还会再出一个终极篇。

好了,接下来我要开始表演了。首先我们来了解一下指针,来看一个定义:int a=0;int *p=&a;那么 这个是什么意思呢。这是定义指针的一种常见用法。指针指针,顾名思义要有所指。即我们定义了一个名叫p的指针,他指向了一个整形变量a。这里强调一下:指针类型一定要与指向目标类型一致。至于原因,过于繁琐这里不多解释。那么这里就有人要问了:你说那么多那指向到底是什么意思呢?好的,接下来请看图一(由于手画的不太好看,勉强看看吧)

 这里我要跟大家解释一下,指向的意思就是指针的存放对象。在此之前大家要明白一个概念--地址,在计算机中地址就是每一个变量或运算符或函数所在计算机硬件中的一个位置(以后有机会深入讲解,需要知道堆空间和一些其他的东西),这里的例子很明显,指针p存放了一个叫做a的整形变量的地址。也就是上图的0x666(假设地址为0x666),指针和其他变量不同的地方在于指针存放的是变量的地址而不是变量的值。这里就有点小小的绕了。简单来说指针也是一个变量,但存放的值为指向变量的地址。而我们可以直接使用解引符来访问变量存放的内容。我们先来看p中存放的到底是不是a的地址呢?(看图二)

我们可以看到,指针p中存放的内容为a的地址,完全符合逻辑。然后我们可以用解引符*来访问a中存放的内容。(见图三)

 我们可以看到,直接打印出来变量a和用指针间接访问看到的结果完全相同。首先,我们可以直接得出一个结论,那就是指针可以通过变量的地址来访问并且修改变量。那么原理是什么呢?虽然我们访问的是指针,但我们解引以后实际访问的对象为变量本身,如果我们通过指针对变量进行修改,那么改变的并不是指针本身,改变的是地址中变量存放的内容。(见图四)

我们可以看到,a原本被赋值为5,使用指针解引后访问到的结果为5,但通过指针修改变量a

为6后打印结果随之改变。 

那么就有人要问了:你说那么多,这指针好像没什么用啊,我直接修改a不就好了,还浪费栈空间来开辟它干嘛?别急别急,指针的用途可大了。我们先看一个例子(见图五)

 我们可以看到,在主函数中,我们将实参a和b传入test函数中,形参a和b被赋值为5和6,但是主函数中a和b的值并没有发生改变。但我们使用指针结果就不一样了(见图六)

我们可以看到,使用指针p1和p2分别指向a和b后,再将p1和p2分别传入函数test中,我们就成功改变了a和b的值。(注意,p1和p2为地址,我们需要使用指针去接收,也就是test中*p1和*p2) 。那么为什么会这样呢?这个就和问我上面说的东西首尾呼应了。我们已经知道了地址这个概念,所以为我们也不难理解test中形参a和b也有地址,那么问题来了。它们之间的地址难道相同吗?答案当然是否定的,我们来看一个例子(见图七)

这里我们分别打印出了实参a,b和形参p1和b(为了让大家明白实参和形参没有半毛钱关系,我这里使用一个同名一个不同名的形参)的地址。我们可以发现,它们的地址各不相同,也就是说它们四个是不同的变量。所以各自无法相互影响。

 有始就有终,我们来看看使用指针传递后各个变量的地址(见图八)

我们可以很轻易的就看到了结果,如我们想的那样,地址一一对应。这就是为什么直接传递值无法改变但传递指针可以的原因了。为了更加贴切,我们可以直接传递地址,而不使用指针传递。(见图九)

结果很明显,也是一一对应。这里有人要问了:为什么两次的地址都不相同呢。我们要知道一个东西,就是变量在代码中是有生存周期的,当程序结束它会自动删除,下次执行时会重新分配空间(详细请见我的另一篇博客--栈空间)。为了让大家理解的更加深刻,我这里用一个大家常用的c语言函数:int a=0;scanf("%d",&a);,结果可想而知,a的值被改变了。那么看完我上文的再看这个函数是不是有一个发现,那就是&a,没错,scanf函数也取了a的地址,所以才能改变a的值。是不是很神奇呢?哈哈。 

好了,我知道大家对指针还有很多疑问,我们先说到这里,剩下的等下一篇博客在说。接下来我给大家看看常见的错误:1.char a='b';int *p=&a;(错误,指针必须指向相同的类型变量)2.int *p;printf("%d",*p);(错误,指针没有指向内容,会变成野指针,非常的危险,会造成程序的崩溃,一般我们会将指针进行初始化int *p=NULL,这个代表指针指向了一块不可访问的内容) 3.int *p=NULL; int a=0;p=a;printf(("%d",*p);(错误,在vs中我们无法将a直接赋值给p,但在Linux操作系统中,我们可以进行强制类型转化。是可以做到直接赋值的,这样非常的危险,因为你不知道使用的到底是谁的地址,情况与野指针类似)。

补充:Linux操作系统到底是什么?简单来说他和windows操作系统有点类似,但不相同。Linux操作系统是程序员的逼格所在,如果你只是单纯想玩玩编程,只需要了解Windows操作系统就可以了,但是要是想赚钱,还得是Linux操作系统。关于Linux的补充就到这里,说不定以后心情好会专门写一篇博客讲解

好了,高级程序员的必经之路入门篇讲解结束,谢谢大家的观看。希望不要吝啬自己的点赞加收藏。(关于自己为什么那么久没更新,原因是这样的,当时在CSDN中无意中看到了一个动态,被一个自以为是的女人气到了,现在突然想起来博客就来更新一波。点赞越多发车越快。)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值