初识#define 定义常量和宏
define 是一个预处理指令
#define 里被定义的名称必须全大写字母
定义常量
#define MAX 2000
#include<stdio.h>
int main()
{
int a=MAX+1;
printf("%d\t%d",MAX,a);
return 0;
}
给常量名MAX赋予常量2000。
定义宏
#include<stdio.h>
#define ADD(X,Y) X*Y
int main()
{
printf("%d", ADD(2, 3));//实际运算2+3
int a = 4, b = 5;
printf("\n%d", ADD(a, b));//实际运算4+5
printf("\n%d", 5 * ADD(2, 3));//实际运算5*2+3
printf("\n%d", 5 * (ADD(2, 3)));//实际运算5*(2+3)
printf("\n%d", 5 * ADD_1(2, 3));//因为宏定义时,已经将括号括号了,所以这里也是5*(2+3)
return 0;
}
为了保证逻辑不出错,建议在定义好的宏左右写上括号:(X+Y)或者((X)+(Y))
初识指针
内存
内存是计算机上非常重要的存储器,计算机中所有的程序都是在内存中运行
为了有效得使用内存,就把内存划分为一个个小得内存单元,每个内存单元大小为1字节。
为了能有效的访问到内存的每一个单元,对内存单元进行编号,这个编号被称为内存单元的地址
地址线通电产生的电信号转换成数字信号,然后形成2进制序列,32位2^32个,64位2^64个
#include<stdio.h>
int main()
{
int a = 10;
printf("%p\n", &a);//&是指向地址,这里通过&和%p显示a在内存的地址
//注意,因为变量有生命周期,每次创建和销毁,他的地址都会改变。
return 0;
}
指针变量
数据类型 * 指针变量名=&被指向的变量
#include<stdio.h>
int main()
{
int a = 100;
int* p_a = &a;
printf("a=%d\na当前地址:%p\n", a, p_a);
printf("%p\n", &a);//可以通过&直接访问a的地址
//注意,因为变量有生命周期,每次创建和销毁,他的地址都会改变。
*p_a = 20;//通过*p直接访问a,并且重新赋值
printf("a=%d", a);
int* p_a_2 = &a;//同时其他指针变量也可以指向a
*p_a_2 = 30;//同样可以通过*来访问并修改
printf("\na=%d", a);
return 0;
}
其中,指针变量p_a也是有地址来存放的,
所以这里p_a=&a,其实就是在p_a的内存空间里存放a的开头地址。
指针变量可以通过*来直接访问被指向变量的值,*p_a其实就是a。
一个变量的地址,可以有多个指针变量指向它。
指针的大小
运用sizeof同样可以得到指针类型的大小
#include<stdio.h>
int main()
{
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(long*));
printf("%d\n", sizeof(long long*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
return 0;
}
所有位数都一致,因为指针是存放地址,而地址有多大,指针就有多大。
不同位数下,得到结果不一样,32位得到的是4,64位得到的是8
初识结构体
结构体有助于让我们描述复杂对象类型
结构体,可以让c语言创建一个新的类型出来
#include<stdio.h>
//
struct stu
{
char name[20];
int age;
long id;
char sex[3];
};
int main()
{
struct stu s_1 = { "李华",19,2020211666,"男" };
printf("%s %d %d %s", s_1.name, s_1.age, s_1.id, s_1.sex);
struct stu s_2 = { "莉莉",32,1988211666,"女" };
struct stu* p_s = &s_2;//结构指针
printf("\n%s %d %d %s", (*p_s).name, (*p_s).age, (*p_s).id, (*p_s).sex);
printf("\n%s %d %d %s", p_s->name, p_s->age, p_s->id, p_s->sex);
//调用结构指针,有两种方法,一种是(指针变量).结构成员变量
//另一种是结构体指针->结构成员变量名
return 0;
}
上述代码中,我们通过struct创建了一个stu结构体,其具有四种属性(成员变量):name,age,id,sex。
后面又使用struct stu 类型声明了一个s_1对象,并对该对象的属性赋值。