我的小态度:慢慢来比较快哟 欢迎大家来看我的文章 有不对的地方,麻烦大家评论区指正出来呀,谢谢大家啦
一、#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;
}
|