深入理解指针(详解 图文)

目录

前言

1.内存和地址

2.指针变量和地址

2.1取地址操作符(&)

2.2指针变量和解引用操作符(*)

2.2.1指针变量

2.2.2解引用操作符

2.3指针变量的大小

3.指针变量类型的意义

3.1指针的解引用

3.2指针 +- 1

3.3 void* 指针

4.const修饰指针

4.1const修饰变量

4.2const修饰指针变量

5.指针运算

5.1指针 +- 整数

5.2指针-指针

5.3指针的关系运算

6.野指针

6.1野指针成因

6.1.1.指针未初始化

6.1.2.指针越界访问

6.1.3.指针指向的空间释放

6.2如何规避野指针

6.2.1指针初始化

6.2.2小心指针越界访问

6.2.3指针变量不再使用时要置空且使用前检查有效性

6.2.4避免返回局部变量的地址

7.指针传值调用与传址调用

7.1传值调用

7.2传址调用


前言

在学习指针之前,我们先浅了解一下指针是个什么东西,指针其实是一种数据类型,用于存储变量的内存地址。简单来说,可以将指针想象成一个指向内存中某个存储单元的箭头,通过这个箭头可以找到存储单元中实际存储的值。

1.内存和地址

对于指针,我们将它理解为地址,生活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。每个内存单元也都有⼀个编号(这个编号就相当于宿舍房间的门牌号),有了这个内存单元的编号,CPU就可以快速找到⼀个内存空间,C语言中给地址起了新的名字叫:指针

            

内存单元的编号 == 地址 == 指针

2.指针变量和地址

2.1取地址操作符(&)

在C语⾔中创建变量其实就是向内存申请空间

⽐如,上述的代码就是创建了整型变量a,内存中申请4个字节,⽤于存放整数10,其中每个字节都有地址。

那如何才能得到a的地址呢?

现在就学习了一个操作符——(&)取地址操作符

按照我画图的例子,会打印出:0137FCEC

&a取出的是a所占4个字节中地址较⼩的字节的地址。

虽然整型变量占⽤4个字节,我们只要知道了第⼀个字节地址,顺藤摸⽠访问到4个字节的数据也是可行的。

2.2指针变量和解引用操作符(*)

2.2.1指针变量

那我们通过取地址操作符(&)拿到的地址是⼀个数值,比如:0x0137FCEC,这个数值有时候也是需要存储起来,方便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中。

#include<stdio.h>
int main()
{
	int a = 10;
	int* p = &a;//取出a的地址并存储到指针变量p中

	return 0;
}

指针变量也是⼀种变量,这种变量就是用来存放地址的,存放在指针变量中的值都会理解为地址。

我们看到 p 的类型是 int*,那该如何去理解这个指针的类型呢?

int a = 10;
int* p = &a;

这⾥ p 左边写的是类型的对象 int* ,* 是在说明p是指针变量,而前⾯的 int 是在说明 p 指向的是整型 (int) 类型的对象。

在指针眼里只要放在指针变量里面,什么东西都是地址,很好的类比,在锤子眼里什么都是钉子。

2.2.2解引用操作符

C语言中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针) 指向的对象,这⾥必须学习⼀个操作符叫解引用操作符(*)。

int main()
{
    int a = 100;
    int* p = &a;
    *p = 0;
    return 0;
}

上面代码中 *p = 0 就使⽤了解引用操作符, *p 的意思就是通过 p 中存放的地址,找到指向的空间, *p 其实就是 a 变量了;所以 *p = 0,这个操作符是把 a 改成了0。

学到这大家可能会有疑问,指针有什么用呢?这里如果目的就是把a改成0的话,写成 a = 0;不就行了,为啥非要使用指针呢? 其实这里是把 a 的修改交给了 p 来操作,这样对 a 的修改,就多了⼀种的途径,写代码就会更加灵活,下面我举一个例子来帮助大家理解。

相信大家都看过最近一个很火的电视剧《狂飙》,在电视剧中有个人叫强哥,他是个黑社会,在早期他想做一件事都是自己直接动手,而后面他有了老莫后,他有不方便动手的事情,他就会跟老莫说他想吃鱼了,然后老莫就会动手帮他摆平这件事了。

而放到指针中这也很适用,a = 0就相当于强哥亲自动手了,p 就相当于老莫,&a后就相当于把事情的经过告诉了老莫,然后老莫搞定了这件事。相信大家通过这个例子,也对指针有了更多的了解。

2.3指针变量的大小

指针变量的大小取决于地址的大小

32位平台下地址是32个bit位(4个字节)

64位平台下地址是64个bit位(8个字节)

结论:指针变量的大小和类型无关,只要指针类型的变量,在相同的平台下,大小都是相同的。

3.指针变量类型的意义

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值