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

为什么要写这文章?

因为对于这个问题:“定义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.所以指针指向地址中“指向”二字的到底是怎么指向的呢?是把这个地址存储了吧!


最后:

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

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

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

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

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

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

有什么不对欢迎指出。)

你可能感兴趣的:(指针,内存管理)