c语言指针,c语言中指针的用法

怎么深刻理解C语言中的指针?又如何能灵活运用指针?这是大多数C/C++初学者都十分迷茫的地方;

想要去理解和熟练运用指针就少不了从原理层去认识它。这里小编就自己学习指针过程中的一些理解,总结出来分享给您;

理解指针

首先,你需要掌握两个运算符“*”和“&”;

“&”运算符:取对象在内存中的地址

“*”运算符:取内存中地址上的对象(值);

大家一定要深刻的理解上面两个运算符,然后才能去进一步理解指针;

int a = 100 ;这一行代码我想大家都没问题。那么“&a”返回的就是对象(变量)a在内存中的地址,它是一个16进制数。

然后用“*”号去a的地址去取对象:“*(&a)”,,就能取到对象a,也就就是100 ;

接下来进入重点了,指针,本身也是一个变量(对象),它本身占用内存,但是它只存地址(别人的地址),它存的谁的地址我们就称它为指向谁的指针;

int* p = &a ;int* p_2 = new int(200) ;先不管他的类型申明,只看变量本身p和p_2。前面讲到指针存放的是对象的地址,那么可以理解为指针是一个地址变量,那么赋值的话就需要也赋一个地址给它一个地址。int* 和char*都可以表示地址类型,它们的区别就是地址所存的值得类型不同,一个是存整型,一个是存字符型;

对指针取值的话,就是用“*”号,后面接对象地址,也就是指针变量,所以*p和*p_2就分别是a和200;

c语言指针,c语言中指针的用法图1

指针的运用

指针并不是C/C++独有的,像C#和java等其实也是有指针的,只不过都被语言本身用其他的方式替代和封装了一般程序员接触不到,C/C++就不一样,它是直接将指针暴露给开发者,因为大部分牵涉到指针的都与内存有关,而计算机内存很重要,万一出什么问题可能系统都会崩溃,下面就简单来看一下程序在运行时指针与内存之间到底是个什么样的关系:

先看一段代码:

#include <stdio.h>

#include <string>

#include <iostream>

#include <time.h>

using namespace std;

class people

{

public:

people();

~people();

string Name ;

int age ;

bool sex ;

char info[1024] ;

void run(){}

void eat(){}

private:

};

people::people()

{

}

people::~people()

{

}

int main()

{

people* p1 = new people();

cout<<p1<<endl;

cout<<&p1<<endl;

cout<<sizeof(p1)<<endl;

cout<<sizeof(*p1)<<endl;

system(“pause”);

return 0 ;

}

直接运行看结果:

c语言指针,c语言中指针的用法图2

分析

接下来来一一进行分析:

首先people* p1 = new people();这一句是类的一个实例化,系统会给people实例化一个对象*p并且给它在堆上开辟空间,注意是在堆上,开辟的空间用来存储对象的数据。数据包括哪些?就是对象的属性和虚函数指针,但是函数并不存储在各对象中。因此run()和eat()方法是不存在对象*p指向的内存处的。

cout<<p1<<endl;输出的是00279360,这是一个地址,是系统给new people()对象分配的地址。

cout<<&p1<<endl;输出的是0012FD90,这也是地址,但这是指针变量p本身的地址。

cout<<sizeof(p1)<<endl;

cout<<sizeof(*p1)<<endl;

通过这两个输出就能有更清晰的认识了,p1本身只占用4个字节的空间,而它所指向的对象的地址所占的空间就很大,等于类中所有数据类型所占空间之和。

接下来在main函数里写一点逻辑:

c语言指针,c语言中指针的用法图3

图解

我们来看一下程序运行时间,指针和内存是怎么工作的。这里画一个图给大家:

c语言指针,c语言中指针的用法图4

程序在运行时,数据主要是存储在栈、堆、代码区、全局区。代码区主要就是存代码中出现的一些字符常量、方法等,比如这里代码中给对象的Name属性赋的值“xiaoli”之类的都是存在此处,然后我们通过new出来的对象,都是由堆通过计算好类中各属性所需空间然后开辟出来的。这里p3不是通过new开辟出来的,所以他是存在栈上的并且地址是固定的,是不能更改的,而p1和p2是能更改的。

改变地址

如此,我们三个对象互相赋值后会发生什么呢?

c语言指针,c语言中指针的用法图5

对比代码和输出结果我们发现了什么?赋值后p1和p2本身的地址并无改变,但是他所指向的内存都编程p3所在的内存了。下面用图解给大家看一下:

c语言指针,c语言中指针的用法图6

注意,此处原来的p1和p2指向的内存由于是new出来的我们需要手动释放它。所以我们在重新赋值之前要将这两块内存删除掉delete p2 ;delete p1;

改变地址的值

如果我将代码中的 p2 = &p3;换成*p2=p3呢?我们看下输出结果:

c语言指针,c语言中指针的用法图7

造成这种情况的原因,其实这就牵涉到指针的两种赋值问题:一种是改变指向的地址,一种是改变本身指向地址的值p2 = &p3是改变指向地址,*p2=p3是改变指向地址的值。

C语言的指针确实是个比较讨厌的东西!哪里讨厌呢?肯定不是指针这个东东讨厌,而是教材没有把指针说清楚很讨厌。翻开你的教材,对指针的描述基本是就是“它是一个指针变量”、“指针是一种地址变量”、“指针指向的XXX”等描述,你说这样的描述怎么能让人看懂指针,反而越看越迷糊。

我在想,描述指针P时,可不可以换其他的词语来辅助理解“指针”这个词语,因为“指针”这个词语确实不太好理解。你想啊,在描述整型变量、字符变量的时候,大家都很好理解,因为“整型”、“字符”型、“字符串”型这样的词语大家都很好理解,你说“指针”这个词语大家都不多见,这怎么理解呢?难不成还要拿个词语大全先去查下“指针”的汉语词义吗?

在讲解指针P时,可以说P是一个地址变量,此时先不要说“指针”这个词语,而是说“地址”这个词语,也就是地址变量P怎么怎么。那么定义指针变量P时的写法:

int *P 也可以暂时写为 address P。

这样初学者学习到指针P时会不会一目了然:哦,address这个单词我小学就学过了,是地址的意思,那么变量P的类型就是地址类型咯!

你看,这样初学者对指针变量就建立起了一个地址的概念了,总比巴拉巴拉说一大堆的无用解释好吧。

关于指针更多的解释,我在“C语言编程技术分享”,也就是一个公众号里写了不少文章,有兴趣的小伙伴们可以参考。C语言里很多复杂的概念,有时候也可以变通一下去理解。

原创文章,作者:普尔小编,如若转载,请注明出处:http://www.puerpx.cn/pxwd/5623.html

(0)
上一篇 2022-11-21 上午9:51
下一篇 2022-11-21 上午10:45

相关推荐

  • 软装装饰如何更省钱且实用

    软装是一种对家居整体环境、空间美学、陈设艺术、生活功能、材质风格、意境体验、个性偏好,甚至包括风水文化等在内的多种复杂元素的创造性融合,是对硬装等基础家装设计的补充,是提升个人生活…

    2023-06-18
  • 重庆北碚区适合旅游吗,2019重庆北碚旅游

    北碚,因有巨石伸入嘉陵江中,曰碚,又因在渝州之北,故名北碚。 北碚号称“嘉陵江畔的明珠”,号称“重庆的后花园”。相对于重庆其它主城区,它的森林覆盖率高,空气质量好,被联合国人居环境…

    2023-06-20
  • 河北专接本有用吗,河北专接本靠谱么

    看看你适合跨专业吗?根据河北省教育厅,对于专接本考试的相关规定,在跨专业选择问题上,政策是比较宽松的。除医学类本科专业不接受跨专业报考外,其它专业均可以互相报考。 一、河北省教育厅…

    2023-01-08
  • 如何选择网站域名

    不管对企业还是个人来说,建站越来越普遍,必然要考虑域名注册,好的域名不仅能给网站带来更多流量,还具有升值潜力,那么如何正确的选择网站域名呢? 一.简短忆记 域名越短,用户越喜欢,也…

    培训问答 2023-03-13
  • 怎么帮狗狗做美容(狗狗美容文案朋友圈)

    准备美容工具 1、您要准备好给狗狗修剪毛发的工具:梳子、剪刀、电推刀、指甲刀、毛巾、宠物洗浴液,风筒等等。 2、剪刀的选择也是很有讲究的,一般来说,要选择末端刀刃比较圆的形状,否则…

    2023-04-27
  • 以前的人贩子有多可恶,人贩子究竟有多可恶

    女大学生从城市被拐卖到深山,成为老丑男的“妻子”,遭到强奸、毒打、囚禁! 深山里的恶人,日复一日地折磨着女大学生。而深山里的好人,在竭尽全力地帮助女大学生走出深山。 总的来说,女大…

    2023-05-10
  • 喜欢艺术的孩子出国留学该如何选择学校

    一提到动画/动漫设计专业,很多人第一反应就是“做动画片”或者“画漫画”。其实除了这两类以外,动画设计可选择的方向还有很多。 在海外院校中,动画设计专业被划分的十分细微:2D 动画、…

    培训问答 2023-01-07
  • 留学中介排行榜,美国留学中介哪家好,排名和费用是怎样的呢

    从调查结果中我们可以看出: 1、综合排名前10的美国留学中介机构主要集中在北上广等一线城市,北京为主要聚集地; 2、知名度比较高的留学中介,规模也比较大,存在正相关关系。规模和知名…

    2022-04-18
  • 点心面怎么做才会酥(点心面的制作过程怎样)

    一道:南瓜糯米糍 一款软软糯糯的小点心做法,颜色鲜亮,外皮圆圆滚滚,软糯可口,内馅清甜香滑,咬一口,淡淡的椰香在嘴里融化,越嚼越美味。做法很简单,将糯米粉与南瓜泥混合揉匀,然后包上…

    2023-04-11
  • 山东管理学院好吗(山东管理学院在哪)

    1、这个学校以前叫山东省工会管理干部学院,2013年升入本科,目前学校主要在长清,共有八栋宿舍楼,其中有六栋是六人间,学校坐落在长清大学科技园内,离济南市区较远,公交车的话要一个半…

    2023-06-06