文章目录
一、#define 定义 常量 和 宏
1、define 定义 标识符常量
#define Mac 123
int main()
{
int a = Mac;
printf("%d ", Mac);
return 0;
}
2、define 定义 宏
#define Add(x,y) x+y
int main()
{
int a = 2;
int b = 3;
printf("%d\n", Add(a, b));
return 0; 输出结果:5
}
#define Add(x,y) x+y
int main()
{
int a = 2;
int b = 3;
printf("%d\n", 2*Add(a, b)); 2*2+3
return 0; 输出结果:7
}
#define Add(x,y) (x+y)
int main()
{
int a = 2;
int b = 3;
printf("%d\n", 2*Add(a, b)); 2*(2+3)
return 0; 输出结果:10
}
二、指针 (指针 就是 地址)
1.内存
总结:内存单元 是有 地址 的
内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的。
所以为了有效的使用内存,酒吧内存划分成一个个小的内存单元,每个内存单元的大小是一个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
(1)问题一:内存是怎么编号的?
系统32位指的是针对32位CPU设计的操作系统。 1字节=8位,32位处理器可以一次性处理4个字节的数据量。
电脑系统分32位、64位。
32位,即32根地址线,这地址线是物理量,通电为 1 ,不同电为 0 。
电信号转换为数字信息:1 和 0 组成的二进制序列。
内存 | 地址 |
---|---|
一个字节 | 0xFFFFFFFF |
一个字节 | 0xFFFFFFFE |
一个字节 | 0xFFFFFFFD |
… | … |
… | … |
一个字节 | 0x00000002 |
一个字节 | 0x00000001 |
一个字节 | 0x00000000 |
以32为系统为例:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
…
11111111 11111111 11111111 11111110
11111111 11111111 11111111 11111111
由此可知,这里由2^32个地址;
可以管理2^32个内存单元。
地址的大小跟编号的方式有关,32位平台有32根地址线,现实中物理的线 1 ,所以可以存储32个bit,等于4个字节的地址信息,所以地址的大小是 4 个字节,64位平台有64地址线,地址大小是8个字节。
(2)问题二:一个这样的内存单元是多大空间?
总结:每个内存单元的大小是一个字节。
(1)假设一个内存单元为 1 bite
2^32 / 8 = 536870912 Byte
536870912 / 1024 = 524288 KB
524288 / 1024 = 512 MB
512 / 1024 = 0.5 GB
显然,这太小了。
char 是一个字节,1 Byte = 8 bite,如果按照一个内存单位为1Bite,那这样子也太浪费空间了。
(1)假设一个内存单元为 1 Byte
2^32 / 1024 = 4194304 KB
4194304 / 1024 = 4096 MB
4194304 / 1024 = 4 GB
实际电脑,每个内存单元的大小是一个字节。
2.指针 %p:打印地址
地址 就是对内存空间有效利用的一种编号方式。
存储这些地址信息的变量,我们赋予其特殊的类型——指针。
专门存放地址的变量,本质上还是变量,是变量就会有存储空间,也就有其对应的地址。
也就是说:指针本身也有对应的地址,虽然指针本身的内容也是存放地址信息的。
int main()
{
int a = 10;
return 0;
}
首先,F10,逐过程调试到 int a = 10 ; 这个步骤之后,如图:
其次,调试->窗口->内存->内存1,2,3,4随便哪一个,如图:
其次,调试->窗口->监视->监视1,2,3,4随便哪一个,如图:
在内存1 的地址栏目中,输入&a ,然后按 回车键,得到的就是 变量a 的地址,如图:
同理,在监视栏目窗口,输入&a,然后按 回车键,得到的值就是 变量a 的地址,如图:
地址相同,数值存储在这里
内存1 列的搜索栏目中 选择 4 的意思是:一行只显示 4 个字节,如图:
内存1 列的搜索栏目中 选择 自动 来比较一下,如图:
内存1 列的搜索栏目中 选择 8 来比较一下,如图:
每一个字节,都有一个地址
int main()
{
int a = 10;
&a;
printf("%p ", &a); 输出结果:00CFF980
return 0;
}
源文件中:&a 得到的地址 ,是 第一个字节 的 地址,即:第一个内存单元的地址(int 是 4 个字节,即:四个内存单元),由于,已经知道了变量的类型是 int ,也就是占 4 个字节,那么,我们知道了第一个内存单元的地址,那么整个的地址也就确定了。
内存 | 地址 | |
---|---|---|
一个字节 | 0xFFFFFFFF | |
一个字节 | 0xFFFFFFFE | |
一个字节 | 0xFFFFFFFD | |
… | … | |
一个字节 |
| |
一个字节 |
| |
一个字节 |
| |
一个字节 |
| |
一个字节 | 0x00CFF97F | |
一个字节 | 0x00CFF97E | |
… | … | |
一个字节 | 0x00000001 | |
一个字节 | 0x00000000 |
黄色标记出来的,就是 int a ,在内存中保存的位置,&a 得到的就是 第一个字节,即:第一个内存单元的地址
3.指针变量 * %p:专门用来打印地址
(1) 数据类型 * 指针变量名
举例1:
int * pa = &a; // pa 是用来存放地址的,在 c 语言中,pa 就是指针变量;
int * pa = &a; // * 说明 pa 是 指针变量
int * pa = &a; // int 说明 pa 执行的对象是 int 类型的
举例2:
char ch= ’ w ’ ; // char 说明 pc 执行的对象是 char 类型的
char * pc = &ch ;
int main()
{
int test = 10;
int* pa = &test;
printf("%p\n", pa); 输出结果:0062FD9C pa 是用来存放地址的,在c语言中,pa 就是指针变量
printf("%d\n", *pa); 输出结果:10 * 说明 pa 是指针变量;
return 0; *pa 就是 int test 存放在 指针变量pa 中的数值
}
(2)解引用操作: * 指针变量名
int main()
{
int num = 10;
int* pa = #
printf("%p\n", pa); 输出结果:00EFFA78
printf("%d\n", *pa); 输出结果:10
*pa = 20; (解引用操作)
printf("%p\n", pa); 输出结果:00EFFA78
printf("%d\n", *pa); 输出结果:20 (解引用操作)
return 0; *pa 就是通过 pa 里面存放的地址,找到num,
} 并将 20 赋值给 num
4.指针变量的大小
结论:指针大小在 32 位平台是 4 个字节,64 位平台是 8 个字节
int main()
{
printf("%d\n", sizeof(char*)); 输出结果:4
printf("%d\n", sizeof(short*)); 输出结果:4
printf("%d\n", sizeof(int*)); 输出结果:4
printf("%d\n", sizeof(long*)); 输出结果:4
printf("%d\n", sizeof(long long*)); 输出结果:4
printf("%d\n", sizeof(float*)); 输出结果:4
printf("%d\n", sizeof(double*)); 输出结果:4
return 0;
}
(1)问题一:指针的大小是相同的,为什么呢?
指针是用来存放地址的!
指针需要多大的空间,取决于地址的存储需要多大的空间。
32 位平台 就是 4 个字节。
64 位平台 就是 8 个字节。
x86 是32位平台
x64 是 64 位平台
1.如何更改32位或者64位 平台
三、结构体
struct Stu
{
char name[20];
int age;
double score;
};
int main()
{
struct Stu s = { "张三",20,85.5 };
printf("1:%s,%d,%lf\n", s.name, s.age, s.score); 1:张三, 20, 85.500000
struct Stu* ps = &s;
printf("2:%s,%d,%lf\n", (*ps).name, (*ps).age, (*ps).score); 2 : 张三, 20, 85.500000
printf("3:%s,%d,%lf\n", ps->name, ps->age, ps->score); 3 : 张三, 20, 85.500000
return 0;
}