一、常见关键字
1)auto 自动的
每个局部变量都是auto修饰的,基本上都是省略了
int main(){ auto int a = 10; // 局部变量,进入大括号自动创建,除了大括号自动销毁--自动变量 }
2)break/continue 用于for循环,while循环,swith
3)case,default: 用于swith 语句中
4) char/float/int/short/long
5) const 常变量, 不能修改的
6)enum 枚举
7)extern 是用来申明外部符号的
全局变量在整个工程中都可以使用;
8)register 寄存器关键字
register创建的变量,建议存放在寄存器中
大量/频繁被使用的数据,想放在寄存器中,提升效率;
int main(){ register int num=100;//建议num放在寄存器中,只是建议,最终还是由编译器决定 }
扩展:计算机中的数据可以存储到哪里呢?
CPU处理的数据需要去内存中拿
CPU处理速度快,但是内存的速度跟不上,也不行;
cpu去寄存器中拿数据,没有的话去高速缓存中拿,还没有再去内存中拿
9) signed 有符号的
数字是有正负的,signed表示描述的数字是有符号的
同理unsigned,表示无符号的
10)static 静态的
static的3种用法:
用法一、static修饰局部变量
static修饰局部变量,改变了局部变量的生命周期(本质上是改变了变量的存储类型)
void test() { int a = 1; a++; printf("%d ", a); } int main() { int i = 10; while (i < 10) { test(); i++; } return 0; }
结果输出10 个2;
将int a 修改为static 变量,如下:
void test() { static int a = 1; a++; printf("%d ", a); } int main() { int i = 10; while (i < 10) { test(); i++; } return 0; }
结果输出2,3,4,5,6,7,8,9,10,11
结论:static修改的局部变量,会从栈区存到静态区,除了大括号也不会消毁。程序不结束,全局变量跟static修饰的局部变量不会销毁。
用法二、static修饰全局变量
static修饰全局变量,使得这个全局变量只能在自己所在的.c文件内部使用,出了该文件,不能被使用了。
如下:
用法三、static修饰函数
static修饰函数之前:result=30
增加static ,
static int add(int x, int y),报错!!
11)struct 结构体
12)union 联合体/共用体
13)void 无,空
14)typedef 类型重定义(重新起个名字/别名)
typedef unsigned int u_int; // 给unsigned int 取个别名叫做u_int int main() { unsigned int num = 10; //定义一个无符号的int 变量 u_int num = 20; //用上面定义的别名,定义一个无符号的int 变量,跟直接定义unsigned int num=20是一个意思 }
15)volatile
Note: include 、define不是关键字,叫做预处理指令
二、函数
直接scanf输入两个数,计算2个数的和
#include <stdio.h> int main() // 计算2个数的和 { int num1 = 0; int num2 = 0; scanf("%d%d\n", &num1, &num2); int sum = num1 + num2; printf("sum=%d\n", sum); }
函数的方式调用2个数的和
#include <stdio.h> int add(int x, int y) { int z = 0; z = x + y; return z; } int main() // 计算2个数的和 { int num1 = 1; int num2 = 2; // int sum = num1 + num2; int sum = add(num1, num2);// 函数的方式 printf("sum=%d\n", sum);//3 }
三、数组
定义:一组相同类型的元素的集合
举例:10个整形1-10存起来
1.数组的创建跟初始化
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//数组的创建和初始化 char ch[5] = {'a', 'b', 'c'}//不完全初始化,剩余的默认为0
2.数组的访问--下标(索引)
#include <stdio.h> //数组 int main() { int arr[3] = {1,2,3}; char ch[10] = {'a','b','c'};// 不完全初始化,剩余的默认为0 int i = 0; while (i < 3) { printf("%d\n",arr[i]); i++; } return 0; }
四、关键字
五、指针
对于32位的计算机,32根物理线->通电->电信号转化成数字信号:1/0, 所以有2的32次方个编号可以给内存编号,0~2**32就是给每个内存单元的编号。
即:32个bit位的二进制序列组成的地址
同理:64位机器是64个bit位的二进制序列组成的地址
1.指针的使用
# include <stdio.h> int main() { int a = 10; char ch = "he"; printf("%p\n", &a);//%p专门用lai打印地址的; //取地址a , a 是int,占4个字节,取的是第一个字节的地址; //pa=&a, pa是用来存放地址的,在C语言中pa叫做指针变量;* 说明pa是指针变量;int说明pa指向的对象是int类型的 int* pa = &a; char* pc = &ch; printf("%p\n", pc); //pa中存的是a的地址,那么由pa肯定可以找到a的值 *pa = 20;//*pa就是通过pa地址找到a的值,这个*叫做解引用 printf("new a is %d\n", a); }
2.指针的大小
int main() { printf("%d\n", sizeof(char*)); printf("%d\n", sizeof(short*)); printf("%d\n", sizeof(int*)); printf("%d\n", sizeof(long*)); printf("%d\n", sizeof(long long*)); printf("%d\n", sizeof(float*)); printf("%d\n", sizeof(double*)); return 0; }
指针的大小是相同的,64位机器的指针的地址都是8byte,
为什么指针的大小都是一样的呢?
指针是用来存放地址的,指针需要多大的空间,取决于地址的存储需要多大的空间。
32位机器 32bit -->4 byte
64位机器 64bit --> 8 byte
六、结构体
#include <stdio.h> // Define a struct Student struct Student // Student 叫做结构体变量 { char name[10]; //结构体里面的成员,叫做成员变量 int age; double score; }; // Define a struct Man struct Man { char name[20]; int age; float height; }; int main() { // init a struct: s struct Student s={"zhangsan", 18, 97}; struct Man m = {"xiaoming", 20, 175.5}; // print+ 点 操作符 printf("name:%s\nage:%d\nsource:%lf\n", s.name,s.age,s.score); printf("1:name:%s age:%d height%lf\n", m.name, m.age,m.height);//用到了 点 操作符, 访问成员变量的语法: 结构体变量.成员变量 // print+ 指针 + 点 操作符 struct Man * pm = &m; printf("2:name:%s age:%d height%lf\n", (*pm).name,(*pm).age, (*pm).height);//双精度浮点型用lf // print+ 指针 + ->操作符 //->操作符的语法:结构体指针->成员变量 printf("3:name:%s age:%d height%lf\n", pm->name, pm->age, pm->height); { /* data */ }; return 0; }