12. #define 定义常量和宏
12.1 #define 定义常量
#include <stdio.h> #define MAX 1000 #define STR "abcdef" int main() { printf("%d\n", MAX); int a = MAX; int arr[MAX] = { 0 }; printf("%d\n", a); printf("%s\n", STR); return 0; }
12.2 #define 定义宏
#include <stdio.h> //函数 int Add(int x, int y) { return x + y; } //宏 #define ADD(x,y) ((x)+(y)) #define MAX(x,y) ((x)>(y)?(x):(y)) int main() { int a = 10; int b = 20; int c = Add(a, b); int d = ADD(a, b); int e = MAX(a, b); printf("%d\n", c); printf("%d\n", d); printf("%d\n", e); return 0; } //宏的参数替换
13. 指针
13.1 内存
注: 编号就是内存单元的地址,我们把地址也叫做指针(编号=地址=指针)
当a创建好后,占用4个字节,每个字节都有一个地址(编号),&a拿到的是第一个字节的地址
注: 0x00B5F988 —— 16进制的数值
int main() { int a = 10; int * pa = &a; return 0; }
注:
i) int * 整体是一个类型:整型指针类型
ii) * 说明 pa 是指针变量
iii) int 说明的是 pa 指向的对象是 int 类型的
#include <stdio.h> int main() { int a = 10;//4个字节 //*&a;//a int * pa = &a;//pa是创建出来存放地址(指针)的,pa就是指针变量 *pa = 20;//*是解引用操作符,*pa就是通过pa中存放的地址,找到pa指向的空间。 //a = 20; printf("%d\n", a); //& - 取地址操作符,取出谁的地址 //* - 解引用操作符(间接访问操作符),通过地址找到地址指向的内容 char* pc = &a;//理论上是支持的,但是为什么呢? char ch = 'w'; char* pc = &ch; return 0; }
总结:
- 指针其实就是地址,地址就是内存单元的编号
- 把地址进行存储的时候,就可以放到一个变量中,这个变量就是指针变量
- 口头语中说的指针,一般指的是指针变量
13.2 指针变量的大小
指针变量的大小是多少呢?
因为指针变量是用来存放地址的,所以指针变量的大小取决于存储一个地址需要的空间。
电脑存在地址线(32/64)
- 32位环境下:32个0或者1组成的地址序列,需要32bit(4byte)的空间来存储,因此,指针变量的大小需要4个字节。
- 64位环境下:地址的序列就是64个1/0组成的二进制序列,要存储起来,需要8个字节。
x86 —> 32位环境
x64 —> 64位环境
#include <stdio.h> int main() { char ch = 'a'; char* pc = &ch; //sizeof 计算的结果是无符号整数的 //对应的打印格式应该是:%zu printf("%zu\n", sizeof(char*)); printf("%zu\n", sizeof(pc)); printf("%zu\n", sizeof(short*)); printf("%zu\n", sizeof(int*)); printf("%zu\n", sizeof(long*)); printf("%zu\n", sizeof(long long*)); printf("%zu\n", sizeof(float*)); printf("%zu\n", sizeof(double*)); return 0; }
14. 结构体
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
例:学生:名字+年龄+性别+身高+体重
struct Tag { 成员列表; };
例:
struct Stu { char name[20]; int age; float score; };
以上就是一个结构体类型,与int、float相似,可以用结构体类型创建变量
#include <stdio.h> struct Stu { char name[20]; int age; float score; }; void Print(struct Stu * ps) { //1. //printf("%s %d %f\n", (*ps).name, (*ps).age, (*ps).score); //2.结构体指针->结构体成员 printf("%s %d %f\n", ps->name, ps->age, ps->score); } int main() { struct Stu s1 = { "zhangsan",20,95.5f }; struct Stu s2 = { "lisi",40,99.8f }; //结构体变量.结构体成员 //. //-> //输入数据到s2中 scanf("%s %d %f", s2.name, &(s2.age), &(s2.score));//数组名本来就是地址,所以name不需要取地址 printf("%s %d %f\n", s1.name, s1.age, s1.score); Print(&s2); return 0; }