目录
关键字
关键字就是程序发明者规定的有特殊含义的单词,又叫保留字 。在声明变量,函数的时候不能以这些关键字作为变量名。C语言的32个关键字如下:
这里介绍一下: extern static #define
extern
修饰使用外部链接的全局变量,修饰使用外部链接的全局函数
未使用的情况会有如图警报,但仍能用
static
- static修饰局部变量
原代码及结果void test(){ int a=0; a++; printf("%d",a); } int main(){ for(int i=0;i<3;i++){ test(); } }
修饰后void test(){ static int a=0; a++; printf("%d",a); } int main(){ for(int i=0;i<3;i++){ test(); } }
static声明后,a将不会马上被销毁,只有第一次执行 int a=0 时进行初始化。
代码运行结果将是 - static修饰全局变量。全局变量具有外部链接属性,但被static修饰后,将变成内部属性链接。
- static修饰函数,与上一条相同,外部链接变内部链接,其他c文件调用本c文件的函数将失败,只有同一个c文件自己能调用此函数。
运行将会失败。
#define
定义宏 可以定义变量,函数(带参数)
#define Max 999
int Max = 999;
#define MAX(x,y) (x>y?x:y) //宏一般全大写
对比函数
int MAX(int x,int y){
return x>y?x:y;
}
宏定义无需声明形参类型
不过需注意的是,最好写成如下的形式,因为当x,y为一个式子时,如(1+2) 会直接进行文本替换同时因为操作符优先级而导致得不到理想的结果。
#define MAX(x,y) ((x)>(y)?(x):(y))
指针
这里要引入一个重要的概念——内存,内存(Memory)是计算机的重要部件,CPU计算的数据都暂时放在内存中。为了不浪费内存,内存被分成一个一个单元格,每个单元大小为8位(bit),也就是一个字节(Byte)。每个单元都有自己的名称,也就是地址/指针。一个地址可以是
0000 0000 0000 0000 0000 0000 0000 0000 (共32位)二进制
32位平台下地址为32位,同理64位平台下地址就为64位。
指针变量就是存放指针/地址的变量, 指针变量的大小取决于地址的大小,也就是只取决于用32位机还是64位机。32位平台下的地址是4个字节,64位平台下地址是8个字节。
指针的声明与初始化
int value=233;
//用&符号获取变量地址
int *pointer =&value;//用pointer 存放了value 的地址
int *pointer2;
pointer2 =&value;
如何通过地址取值呢,这里可以用前面学的 '*' 解引用符号,得到指针指向的值。
printf("%d",*pointer);
改变 *pointer 也就改变了value 的值
int value=233;
int *pointer =&value;
*pointer =1;
printf("%d",value);
结构体
- 结构体的定义
结构体就是用户可以自定义的一种数据类型,这个类型里面又有多种变量,里面的内容由自己决定。struct Student{ char Sex[10]; int ID; int Class; };
- 结构体的初始化及使用。
#include <stdio.h> struct Student { char name[10]; int ID; int Class; }; int main() { struct Student s1 = { "小明",1234 };//初始化 s1.Class=2;//对成员变量赋值 printf("%s %d %d", s1.name, s1.ID, s1.Class); }
可以通过 '.' 来访问结构体内的成员变量;结构体的书写比起cpp学到的类较为繁琐,可以用关键字typedef的方法减少代码量
#include <stdio.h> typedef struct Student { char name[10]; int ID; int Class; }Student; int main() { Student s1 = { "小明",1234 , 2 }; printf("%s %d %d", s1.name, s1.ID, s1.Class); }