C语言指针从入门到进阶(1)——指针相关知识

本文详细讲解了内存地址的概念、指针变量的使用、取地址操作符、解引用操作、指针类型和大小、野指针产生的原因及规避方法,以及传址调用与传值调用的区别。
摘要由CSDN通过智能技术生成

目录

1.内存和地址

2.指针变量和地址

2.1 取地址操作符(&)

2.2 指针变量

2.3解引用操作符(*)

2.4指针变量的大小

3.指针变量类型的意义

4.指针运算

(1)指针+-整数

(2)指针-指针

(3)指针与指针比较大小

5.野指针

5.1产生原因

5.2规避方法:

5.2.1.指针初始化

5.2.2.小心指针越界访问

5.2.3.指针变量不使用时及时置为NULL,指针使用前检查其有效性。

5.2.4.避免返回局部变量的地址!

6.指针的使用与传址调用

6.1传址调用

6.2传值调用

6.3为什么会这样呢?

7.const修饰指针变量
对于这一部分内容已写,若想了解请在我的主页里自取。

1.内存和地址

学习内存和地址之前,先来了解一个例子,假设有一栋楼,这栋楼有100个房间,房间没有编号,但你住在其中一个房间里,此时你让你的朋友来找你,那么最坏的一种情况是:他要找100次才能找到你,这样的话效率很低,但如果给每个房间编号,朋友知道了房间号,就可以快速的找到你,效率大大提高。

那么类似这样的情况在计算机中是怎样的呢?

我们知道计算机上的CPU在处理数据时,需要的数据从内存读取,数据处理后在返回内存,我们知道计算机有内存空间,那么如何管理内存呢?

实际上也是把内存空间划分成一个个内存单元,每个内存大小取一个字节

补充知识:

计算机中与内存相关的单位有:bite(比特),byte(字节),KB,MB,GB,PB。

换算关系:8 bite =1 byte,1 KB=1024 byte,1 MB=1024 KB……(以此类推)

1个比特位可以存储一个二进制位的1或者0

每个内存单元相当于一个宿舍,1个字节里能存放8个比特位,类似与1个宿舍里住了8位同学,每个人就是一个比特位,

其实每个内存单元都有一个编号,得到这个编号CPU可以快速的访问这块空间

生活中我们把门牌号称为地址,那么在计算机中我们把内存单元的编号也称为地址,地址在C语言中称为指针

简单理解 :内存单元的编号==地址==指针

例如:int a=100;

            int * p=&a;

p中存放了a的地址,*p—>a—>100,

p就指向了a,即可以通过p指针来访问a;


2.指针变量和地址

2.1 取地址操作符(&)

我们知道创建变量需要向内存申请空间,并且内存需要申请相应的字节来存储数据,然而每个字节都有相应的地址,如何取出它们的地址?

这时就需要用取地址操作符(&)

注意:&a是取出a所占4个字节中地址较小的字节的地址。

实际上知道第一个字节的地址,就可以得到这个数据

2.2 指针变量

取出来的地址是具体的数值,为了将它们存储起来方便以后使用,于是就需要创建指针变量

指针变量:是一种变量,存放在其中的值可以理解为地址

2.2.1 拆解指针的类型

例如 int * p=&a;

这里的p左边是int *,*表示p是指针变量,int 表示所指向的对象类型是整型

2.3解引用操作符(*)

C语言中我们获取地址(指针),就可以通过地址(指针)来访问指针所指向的对象

代码如下:

j解释:*p的意思是通过p中存放的地址找到它指向的空间,*p就是变量a

2.4指针变量的大小

指针变量的大小取决与地址的大小。

32位平台上是32个比特位(4个字节)

64位平台上是64个比特位(8个字节)

注:指针变量的大小与类型无关,只要是指针类型的变量,在相同的平台上大小都是相同的。

在不同的环境下,指针变量的大小有所不同

64位平台

32位平台


3.指针变量类型的意义

指针类型决定了对指针解引用时有多大权限(即一次能访问/操作几个字节)。

例如:char * 类型的指针解引用一次能访问一个字节,int * 类型的指针解引用一次能访问4个字节,意义就不同。

指针的类型有:

char * :指向字符的指针

short * :指向短整型的指针

int *:指向整型的指针

float * : 指向浮点型的指针

void *:无具体类型指向的指针,可以接收任意类型的地址,但void *类型的指针不能直接进行指针的+-整数和解引用的运算。

作用:使用在函数参数部分,接收不同数据类型的地址,实现一个函数处理多种类型的数据


4.指针运算

学习指针运算,可以类比日期运算,

日期+-整数;

日期-日期;

日期与日期比较大小

其中指针的作用:访问内存空间

(1)指针+-整数

例如:int a=10;

           int * p=&a;

p+1——>跳过4个字节(1个整型,1* sizeof( int ) );

类比可得如果这个类型是自定义类型可得

type * p;

p+n ——>跳过n * sizeof ( type )个字节;

结论:指针的类型决定了指针向前或向后走一步有多大(距离)。

实例:

利用指针打印数组内容;

数组内元素是由低地址到高地址,下标逐渐递增

思路:数组在内存中是连续存放的,知道第一个元素的地址,就能找到后面所有元素的地址。

(2)指针-指针

容易知道日期-日期得到的是中间的天数;

那么指针-指针得到的就是两个指针之间的元素个数的绝对值

(3)指针与指针比较大小

指针与指针比较大小,也是地址与地址比较大小


5.野指针

野指针:指针指向的位置是不可知的(随机的,不正确的,无明确限制的)

类似——>野狗

5.1产生原因

1.指针未初始化

2.指针越界访问

3.指针指向的空间被释放

5.2规避方法:

5.2.1.指针初始化

明确指针指向哪里就直接赋值,不清楚的话就赋值NULL(空指针),该地址是0;

5.2.2.小心指针越界访问

程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,超出范围就是越界访问。

5.2.3.指针变量不使用时及时置为NULL,指针使用前检查其有效性。

规则:当指针为NULL时,就不去访问,同时在使用指针之前判断指针是否为NULL。

5.2.4.避免返回局部变量的地址!

6.assert断言(引用 #include<assert.h>头文件)

作用:判断指针不是NULL。

例如:assert ( p ! =NULL);

如果p 为NULL,程序会报错终止运行,反之则会正常运行。

assert(表达式)如果表达式为真,assert()不会产生任何作用,如果表达式为假,则会报错

如果程序无问题,#include<assert.h>前加一个宏定义#define NDEBUG,这样程序就会禁用文件中assert(表达式)语句,取消 assert () 语句。如果程序问题,移除#define NDEBUG,这样就启动了assert()语句


6.指针的使用与传址调用

6.1传址调用

6.2传值调用

6.3为什么会这样呢?

传值调用是把变量本身直接传给函数,实际上实参在传递形参时,形参会单独创建一块临时空间来接收实参,对形参的改变不影响实参。

传址调用是把变量的地址传给函数,可以让函数与主调函数建立联系,在函数内部可以修改主调函数内部的变量。

传值调用:只需要主调函数内部的变量进行运算,

传址调用:函数内部要修改主调函数内部的变量的值

7.const修饰指针变量

对于这一部分内容已写,若想了解请在我的主页里自取。

老铁们,你们的支持是我的创作的动力,一键三联吧!!

  • 48
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值