目录
12、#difine定义常量和宏
#include<stdio.h>
//#define定义的标识符常量
//NUM —— 这串字符就相当于一个常量 —— 2000
#define NUM 2000
//#define定义的的宏 —— 用#define定义的宏来实现两个数的相加
#define Add(x, y) ((x)+(y))
//用函数来实现两个数的相加
int ADD(int x, int y)
{
return (x + y);
}
int main()
{
int a = 10;
int b = 20;
int c = NUM;
printf("%d\n", c); //打印值2000
int sum1 = ADD(a, b);
printf("%d\n", sum1); //打印值30
int sum2 = Add(a, b);
printf("%d\n", sum2); //打印值为30
return 0;
}
其中的#define Add(x,y) ((x)+(y))中的括号不要省略
以防出现意料之外的结果:
就比如一下的代码
#include<stdio.h>
#define Add(x, y) ((x)+(y))
#define ADD(x, y) x+y
int main()
{
int a = 10;
int b = 20;
int sum1 = 2 * Add(a, b);
int sum2 = 2 * ADD(a, b);
printf("%d\n", sum1); //打印值为60
printf("%d\n", sum2); //打印值为40
return 0;
}
13、指针
13.1、内存(地址)
(1)内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
(2)所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
(3)为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
(4)补充:
前面有0x的数 —— 表示16进制的数字 —— 2个位数的16进制数 = 8个位数的2进制数(举例:16进制 —— FF 和 2进制 —— 11111111 表示的数相等)
在32位平台下:有32个地址线,每个地址线能够给出0或1,则能够给出2的33次方 - 1个 编号地址
2的33次方字节 = 4,294,967,296byte = 4,194,304kb = 4096mb = 4gb
所以在32位平台下(32个地址线):内存最大为4GB。
如果想要增大内存就要增加地址线,可以用64位的平台。
13.2、如何取出地址
利用&(取地址)操作符
#include<stdio.h>
int main()
{
int num = 0; //&num —— 取出num的地址
//num是一个整型,一个整型是4个字节,取出的是第一个字节的地址
printf("%p\n", &num); //%p —— 取地址 —— 以地址的形式打印
return 0;
}
补充:
%d —— 以整型的形式打印
%c —— 以字符的形式打印
%s —— 以字符串的形式打印
%f —— 以单精度浮点型的形式打印
%lf —— 以双精度浮点型的形式打印
%p —— 以地址的形式打印
%lld —— 以更长整型的形式打印
13.3、地址的储存
地址的储存需要定义指针变量
以整型指针为例:
#include<stdio.h>
int main()
{
int num = 0;
int* p; //定义指针变量,(int* p)其中*表示p是指针变量,int表示p指针变量的类型是整型
p = # //p是指针变量,用于存放地址 —— 这里存放的是num的地址。
*p = 10; //*是解引用操作符,可以根据地址来找到地址存放的内容
return 0;
}
补充:
(int* p)中的‘ * ’和*p = 10中的‘ * ’中的意义不相同
(int* p)中的‘ * ’表示p是指针变量
*p = 10 中的‘ * ’表示解引用操作
13.4、其他类型的指针和指针大小
char* p //字符指针
int* p //整型指针
short* p //短整型指针
long long* p //长整型指针
float* p //浮点型指针
double* p //双精度浮点型指针
当然还有数组指针等等一系列的指针(后面讲)
include <stdio.h>
int main()
{
printf("%d\n", sizeof(char *)); //4
printf("%d\n", sizeof(short *)); //4
printf("%d\n", sizeof(int *)); //4
printf("%d\n", sizeof(double *)); //4
return 0;
}
指针的大小是4个字节或者是8个字节(这个取决于你是用的是32位平台(4字节)还是64位平台(8字节))
指针变量是用来存放地址的,地址就是编号 —— 编号大小取决于平台 —— 所以指针大小取决于平台大小
14、结构体
结构体是C语言中特别重要的知识点,结构体能够描述复杂类型的变量。
比如描述书,书包含:书名 + 价格 + 书号, 这几项信息。
这里只能使用结构体来描述了
#include<stdio.h>
struct Book //自定义书类型
{
char name[20]; //书名
float price; //价格
char id[20]; //书号
};
void Print(struct Book* pb)
{
printf("%f\n", pb->price); //(->)操作符 —— 结构体地址 -> 成员名
printf("%s\n", (*pb).id); //(*pb).id 和 pb->id表示的意思相同
}
int main()
{
struct Book b = { "C语言程序设计", 45.5f, "C00110101" };
Print(&b); //打印函数
printf("%s\n", b.name); //(.)操作符 —— 结构体变量 . 成员名
return 0;
}
打印的内容为: