初识C语言(4)
#define 定义常量和宏
define 是一个预处理指令
define 定义标识符常量
1 | //define 定义标识符常量 |
define 定义宏
1 | define 定义宏 |
define 定义宏的时候,字符串出现运算符,需要在合适的位置上加括号
否则宏的参数会被替换 替换成 4*x+y
指针
内存
内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的。
所以为了有效使用内存,就把内存划分成一个个小内存单元,每个内存单元的大小是1个字节
为了能够有效的访问到内存的每个单元,就给内存单元进行编号,这些编号就被称为内存单元地址
内存是怎么编号的?
32位 - 32根地址线 - 物理线 - 通电 - 1/0
64位 - 64根地址线 - 物理线 - 通电 - 1/0
电信号转换位数字信息:1和0组成的二进制序列
00000000000000000000000000000000
…
01111111111111111111111111111111
10000000000000000000000000000000
…
11111111111111111111111111111111
一共2的32次方的序列
而这些序列都可以成为内存的编号
解析一个内存单元有多大空间?
一共有2的32次方个内存单元
假设:
一个内存单元是1bit
那么一共就有2的32次方bit
换算成十进制就是
4,294,967,296bit
/8 = 536,870,912byte
/1024 = 524,288kb
/1024 = 512Mb
/1024 = 0.5GB
那么 一个数据类型 比如
char
占一个字节,一个字节占有8bit 那么就要有8个地址这显然是不合理的
结果:一个内存单元是一个字节,一个字节是一个编号,然后分配地址
指针变量
1 | int main() |
我们使用F10进行调试

通过&a
我们可以看到它的内存地址为00B8F804
在内存中存储为十六进制
而且 int
类型占用4个字节,也就使用了4个地址
但如图可以看出,只有第一个地址有值,其余地址是没有使用的
所以&a
仅仅只是调用了第一个地址进行存储
1 | int main() |
那么我们能不能通过地址来找到a呢
1 | int main() |
指针的大小
1 | int main() |
我们可以发现,指针的大小都是相同的
因为指针使用了存放地址的,指针需要多大空间取决于地址的存储需要多大的空间
32位平台 - 32bit - byte
64位平台 - 64bit - 8byte
vs2019可以在如图位置修改位数

结构体
结构体 - 可以让C语言创建新的类型出来
1 | //创建一个学生类型 |
那么我们运用一下前面指针的知识点
能不能通过指针来找到结构体的成员变量呢
1 | int main() |
我们定义了一个指针变量 pa
存储了s1
的地址
然后使用*
解引用操作,找到了s1
扩展:
使用上面的方法有一点麻烦了,我们可以使用->
操作符来拿到结构体的成员变量
->
的使用 结构体指针 -> 成员变量
1 | int main() |