C语言复习笔记 9

C语言指针

概念的引入

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用4个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。

我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。

一切都是地址

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

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

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

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

由于关系运算符最终得到的是逻辑值(真或假),而不是具体的数字(计算机内部的运算器不是只可以进行算术运算,它也可以进行逻辑运算)。 判断是真是假时比较的是关系运算符两边数据的二进制代码所表示的数据的大小。 于是关系运算符两边的数据类型可以不一样(因为比较的是二进制代码所表示的数据的大小)。那么,如果char型a对应的二进制代码所表示的数据大于float型b对应的二进制代码所表示的数据,就会输出 真(表示a>b为真)(用来作条件判断)。

问题思考

1、如何深入理解指针、地址、关系运算符?

2、error C2446: ‘==’ : no conversion from ‘int *’ to ‘int’

你可能感兴趣的:(C语言复习)