关于指针指向地址中“指向”二字的理解

本文探讨了编程中关于int类型指针p是否自动在栈上分配内存的疑惑,揭示了变量a和指针p内存分配的不同,并澄清了指向的概念。作者通过实例解析内存、地址和指针之间的关系,以纠正常见的误解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要写这文章?

因为对于这个问题:“定义int* p; 系统会给p分配内存空间吗?”

绝大部分回答都是不会。

但是问题来了,刷网课的时候,看到会为p在栈上开辟内存空间。

由此,我开始了思考并最终写下这篇博文。



先来看两个问题:(32位系统下)
Q1:int a; 有没有为a分配内存呢?

A1:编译器会随机取出一个空闲的地址分配给a,不妨设为0x00000000,该地址指向一个4个字节的内存空间,所以会分配内存。

但是这4个字节用来存储什么呢?

当然是a的数值


Q2:int *p;有没有为指针变量p分配内存呢?
A1:int*p;也表示随机取出一个空闲的地址分配给p,不妨设为地址为0xffffffff,该地址也指向了一个4个字节的内存空间。(所以分配了内存空间!)

但是这4个字节用来存储什么呢?

存储的是一个地址!

但这四个字节现在存储的地址是不确定的,是随机地址。我们假设这个地址为0x0000000f,那么这个地址标示的内存空间是什么呢?

很明显我们并不知道,这个地址是一个指向不确定内存空间的地址(可以这样理解:系统并未给这个地址分配内存空间)

也正因如此,如果我们试图 *p = 5;

则把数值5存放进地址0x0000000f 所标示的内存空间里去了,显然如果该地址目前正在被某个进程使用,就有可能破坏该进程,因此这种方法是十分危险的。

总结:

1.内存/地址/变量  的关系
地址 用来标示内存空间 内存空间里可以存放数据,这个数据可以用个变量名来标示 
而指针变量略有不同,该指针变量也有自己的某块内存空间,然而指针的这个内存空间存放的是内存地址而不是数据。

2.存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。
假设在程序中声明了1个int型的变量a。系统为变量a分配的首地址为0X65FDF4H,pa是存放变量a地址的指针变量,即pa中存放的值为0x065FDF4H

3.所以指针指向地址中“指向”二字的到底是怎么指向的呢?是把这个地址存储了吧!


最后:

所以其实自己问的“内存空间”和他们回答的“内存空间”是两码事

他们所说的“内存空间”指的是 指针存放的地址对应的内存。

而我所说的“内存空间”指的是 指针为了存放地址而在栈上开辟的内存空间

(第一篇博文,感觉说什么都是错的,很怕误导别人。

但是我又很想让别人知道,为什么呢?因为当初查资料的时候多想看到一些这方面的文章啊,哪怕是错误的文章我也愿意看,先不说对不对,只是想知道别人怎么想的。

所以抱着这样的心态我写了我的第一篇博文。

有什么不对欢迎指出。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值