攻克指针(一)

不理解指针,很大程度上是因为不懂数据结构,不理解内存

怪不得之前学长说,你要是看过数据结构那本书,就知道指针有多牛逼了

 

//==============内存

1 byte (B) = 8 bits (b) 字节=8个二进制位 

Byte-------By---------8----------8bit-----------------根据读音记

位:“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。 
字节:8个二进制位构成1个“字节(Byte)”,它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说:1个汉字占据2个字节的存储空间。 
字:“字”由若干个字节构成,字的位数叫做字长,不同档次的机器有不同的字长。例如一台8位机,它的1个字就等于1个字节,字长为8位。如果是一台16位机,那么,它的1个字就由2个字节构成,字长为16位。字是计算机进行数据处理和运算的单位。

参考:计算机基础知识:什么是位、字节、字、KB、MB

//============变量

一个变量对应两个值,一个是变量的地址,另一个是变量的值。所以不好弄清楚。

//===========变量在内存中储存

//===========cpu执行

参考:1分钟彻底理解C语言指针的概念

一切都是地址(从微机原理课上也能感觉出来,时时刻刻都是围绕地址展开)

C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。

数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。

CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。如果程序不小心出错,或者开发者有意为之,在 CPU 要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序崩溃,程序员没有挽救的机会。

CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。

假设变量 a、b、c 在内存中的地址分别是 0X1000、0X2000、0X3000,那么加法运算c = a + b;将会被转换成类似下面的形式:

0X3000 = (0X1000) + (0X2000);

( )表示取值操作,整个表达式的意思是,取出地址 0X1000 和 0X2000 上的值,将它们相加,把相加的结果赋值给地址为 0X3000 的内存

变量名和函数名为我们提供了方便,让我们在编写代码的过程中可以使用易于阅读和理解的英文字符串,不用直接面对二进制地址,那场景简直让人崩溃。

需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。

//=================C语言(彻底理解指针和地址,彻底!)

有人一提到指针地址,就会一脸懵逼,因为在他们的脑海中,指针的概念始终建立不起来,总感觉自己跟指针之间隔着一层迷雾,那我现在就用1分钟的时间,拨开你们之间的这层迷雾!

首先你要知道,计算机编程世界中的任何东西,都是一块块的内存!然后,指针是什么?那当然是一块内存了,那为什么叫指针呢?因为这块内存不放鸡,不放鸭,也不放狗屎,而专用来存放另一块内存的地址!所以我们就把这样的内存称为指针。

 

那什么是内存地址呢?

理解内存地址,是猎杀指针的第一把尖刀。

地址是一片内存中每个字节(byte)的编号,就好比房号是一栋办公楼中每个房间的编号一样,假如我所在的办公楼房间数量总共不超过1000间,那么我用一个三位数来表示就足够了,比如302、508等等。

同样的道理,假如计算机内存的字节总数不超过1000个,也可以用三位数来表达,换算成二进制数,最多也就是11 1110 0111(即十进制的999),也就说说用10bits就可以完全表示1000以下的所有字节的编号的。但假如我们的内存有多达4GB个字节,10bits的编号显然太短了,经计算,我们至少需要32bits来表示所有的字节地址编号,因此一个数据的地址就类似于:0110 1101 1100 0010 1101 1110 0101 1101,由于写起来太长不够方便,因此我们更喜欢将上述地址表示为十六进制:0x6DC2DE5D。

内存这栋大楼的房间数多得惊人!他们的编号从0x00000000开始,到0xFFFFFFFF,总计达232个房间!每一个房间(字节/byte)包含8个比特/bit,每个比特可以存放一个1或者0,一图顶万言,附上一张内存的性感照片:

上图展现了一个32位系统的内存示意图,第0x0804FFB0号字节里面存放了一串数据:1111 0000,而紧挨着他的第0x0804FFB1号字节里面存放了另一串数据:1010 1010。

 

所以,对一个指针取地址,无非就是对一块内存取地址,跟对一个整数取地址,对一个浮点数取地址,对一个数组取地址,对一个函数取地址,没有任何区别!请看:

int a = 100; // 内存a的地址是:&a

float b = 3.14; // 内存b的地址是:&b

char c[5]="abc"; // 内存c的地址是:&c

void f(int size, float length); // 内存f的地址是:&f

int *p = &a; // 内存p的地址是:&p

懂了吧。smiley

--------------------- 本文来自 盛夏雨林 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/vincent040/article/details/51072675?utm_source=copy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值