初识C语言
define定义常量和宏
define定义常量
#define
#include 预处理指令
#include<stdio.h>
#define M 1000
#define M SIZE 10
int main(){
int arr[SIZE];
printf("%d\n",SIZE);
return 0;
}
define定义宏
宏是有参数,和函数很像
//函数
int Add(int x,int y){
return x+y;
}
//宏
#define ADD(x,y) ((x)+(y))
| |
代表宏定义中的参数 宏定义里的内容
与函数的区别:函数参数有具体的类型
宏带括号:当成整体使用
宏和函数使用上的区别?
指针初步
内存
内存-------> 分割成内存单元------->内存单元的编号:地址 一个单元的大小为1字节
32位机器上:32根地址线 命令的执行:是/否 1/0------>化为二进制 即:32个0或1产生的二进制序列
通过地址找到内存单元,一个地址管理一个字节,能产生2的32次方自己的空间------->管理4GB的空间
编号=地址=指针
int a=10; //向内存中申请4个字节的空间
//2进制来表示:00000000 00000000 00000000 00001010
//16进制(4个二进制位表示1个16进制位) 00 00 00 0a
//内存中的表示(把最低位提前) 0a 00 00 00
&a; //取地址符,取出a所占4个字节中第一个字节的地址
printf("%p\n",&a) //%p - 打印地址(显示的是16进制)
pa=&a; //pa是存放地址的变量,叫做指针变量
关于指针变量的理解:pa保存了a所占4个字节中第一个字节的地址,即可用pa有能力找到(指向)这个内存空间
int *pa=&a; //*说明pa是指针变量,而pa指向的对象是int类型
指针,本质是地址;口头语中说的指针是:指针变量
int main(){
int a=10;
int *pa=&a;
*pa=20; //*是解引用操作,pa指向的a的地址,而*pa即代表的就是a,通过对*pa赋值即可对a操作
return 0;
}
指针变量的大小
要知道指针变量的大小------>地址存储需要多大空间------>32位机器,地址是32个二进制,存储需要32bit的空间,因此在32位机器上,指针变量的大小是4个字节。
同理:64位机器上指针变量的大小是8个字节
int main()
{
printf("%zu\n", sizeof(char*));
printf("%zu\n", sizeof(short*));
printf("%zu\n", sizeof(int*));
printf("%zu\n", sizeof(long*));
printf("%zu\n", sizeof(float*));
printf("%zu\n", sizeof(double*));
return 0;
}
//%zu:专门用于打印sizeof的打印值的
指针需要正确使用,不能在未指向地址之前就进行操作(野指针)
结构体
内置类型 char,short,int,long,long long,float,double------>对单一对象的描述
对复杂对象的描述------>结构体
例如:
struct Stu //struct:结构体关键字 Stu:结构体名称
{
char name[20];
int age;
char sex[5];
char id[12];
};
通过结构体类型构造出结构体变量——实例化(我们定义的类型即为struct Stu)
int main()
{
struct Stu s={“kevin”,20,“male”,“30”}; //其中s叫结构体变量,初始化
printf("%s %d %s %s %s\n",s.name,s.age,s.sex,s.id);
//格式: 结构体变量.结构体成员
return 0;
}
到这里我们不妨创造一个函数来打印结构体
void print_struct(struct Stu *ps)
| | |
函数名 变量类型 指针变量
理解:当创造一个结构体后,我们即将整个结构体看成一个新的我们自己定义的变量类型,使用方法同int等
所以函数书写如下:
void print_struct(struct Stu *ps)
{
printf("%s %d %s %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).id);
//另一种写法:printf("%s %d %s %s %s\n",ps->name,ps->age,ps->sex,ps->id);
//ps-> 代表ps指向的成员
//格式:结构体指针->结构体成员
}
现在,我们不妨思考另一种初始化结构体的操作:让用户输入
struct Stu s={0}; //空
//输入
scanf("%s %s %s %d",s.name,s.sex,s.id,&(s.age))
上述前三个都是以数组才保存,数组名本来就是地址,所以不用取地址符,而age作为变量名,需要取地址