1.register(建议性):修饰变量,尽量将所修饰变量放入CPU寄存器中,从而达到提升效率的目的。
使用建议:①局部变量。②不会被写入的变量。③高频被读取的变量(比如用于while(date),循环判断条件)。④寄存器数量有限,不要大量使用。⑤register修饰的变量不建议取地址(地址是内存的概念)。
2.auto:一般局部变量默认为auto修饰。
3.static:①修饰全局变量和函数,使它们只能在本文件中使用,不能被外部文件直接访问,为项目维护提供了安全保证。②修饰局部变量,改变了局部变量的生命周期(本质是将局部变量存储在静态区)。
4.sizeof:不是函数,是操作符关键字,用于确定一种类型对应开辟空间的大小。
5.signed:有符号字符型。unsigned:无符号字符型。 ①.数据的存储:unsigned int a=-10; 这是没有问题的。空间不关心内容,单纯的数据没有意义,变量类型在读取的时候才有意义,类型决定了如何解释空间内部保存的二进制序列。②大端存储:按字节为单位,数据高权值位存储在低地址处;小端存储:按字节为单位,数据高权值位存储在高地址处。 ③二进制转十进制:1->2^0 , 10->2^1 , 100->2^2 , 1000->2^3 。④unsigned int b = 10u,保持等号两端数据类新一致。(10u : unsigned int ; 10 : int )
6.if: if(!flag)推荐写法,直观反映flag是"bool"。①if语句,先执行()中的表达式或者函数,得到真假结果。②条件判定功能。③进行,分支功能。④if else 联用,遵循就近原则。
7.float、double:浮点数在进行比较的时候,绝对不能直接使用==进行比较,因为浮点数本身有精度损失,进而导致各种结果可能有细微的差别。if(x==y) => if(fabs(x-y)
8.NULL:0 ‘\0’ "NULL" 的类型不同,数值都为0。
9.switch&&case&&break&&default:①switch语法结构中,case完成的判定功能,break完成的分支功能,default处理异常情况。②case后面不能跟变量或者常变量,也不能定义变量,一定需要的话,可以加{}或者封装为函数。③default:可以出现在任何地方,推荐放在最后面。
10.while&&do{}while;&&for:①循环条件初始化。②循环条件判定。③循环条件更新。死循环:while(1);for(;;);do{}while(1);
11.break:跳出循环。continue:结束本次(一次)循环,while与do while 跳转到条件判断,for跳转到条件更新处。两循环嵌套,最好将循环次数多的放在里面,for循环最好前闭后开,便于循环次数统计。
12.goto:遇到 goto end; 跳转到 end: 处(end为标记位,自己定义名字,goto语句不能跨代码块使用)。
13.void:void 不能定义变量,因为void本身被编译器解释为空类型,强制的不允许定义变量。但可以定义指针,因为指针大小是明确的,VS2019中:sizeof(void) 0 字节,Linux 中,sizeof(void) 为1字节,所以void * p,VS中不能进行p++等操作,而Linux中可以。C语言可以不带返回值,默认返回值为int。void *p 不能直接解引用,它能被任意类型的指针接收,也可以接受任意类型的指针(常用)。
14.return:函数的返回值通过寄存器(eax)的方式返回给函数调用方,函数的返回值具有常属性。main 函数return 0的原因:声明的main函数是有返回值的话,那么就必须返回一个给定类型的值。比如int main() 就需要返回一个int类型的值,通常用0,因为操作系统的习惯是认为返回0是正常退出。
15.const:修饰的变量具有只读属性,不可直接修改,可以通过指针方式间接修改。作用(于编译阶段):①让编译器进行直接修改式检查。②告诉其他程序员,后面不要直接修改,也属于一种“自描述”。const修饰指针(关键字不能修饰关键字):①const int *p = &a(int const *p = &a),const修饰 * ,p指向的变量,a不能直接被修改。② int * const p = &a,const修饰 p,p的内容不能直接修改,即p的指向不能变。const修饰函数返回值(返回指针)。
16.volatile:多用于并发场景,保持内存可见性。不希望被编译器优化,达到稳定访问内存的目的。const(不要进行直接写入) volatile(读取时每次都要往内存读) int a=100;
17.struct:定义结构体其实就是在制作类型。柔性数组如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
//#define NUM 64
//
//struct stu {
// char name[NUM / 2];
// int age;
// char sex;
// char addr[NUM];
//}*p,x;
//
//void test(struct stu* p)
//{
// printf("%s\n", p->name);
// printf("%d\n", p->age);
// printf("%c\n", p->sex);
// printf("%s\n", p->addr);
//}
//
//int main()
//{
// strcpy(x.name, "zhangsan");
// x.age = 10;
//
// p = &x;
//
// p->sex = 'w';
// strcpy(p->addr, "地球");
// test(p);
//
// return 0;
//}
struct date {
int num;
int arr[0];
};
int main()
{
struct date* p = malloc(sizeof(struct date) + 10 * sizeof(int));
p->num = 10;
for (int i = 0; i < p->num; i++)
{
p->arr[i] = i;
printf("%d\n", p->arr[i]);
}
free(p);
}
18.union:联合体,联合体内所有成员的起始地址都是一样的,每一个都是第一个元素。联合体的大小必须能够整除所有成员的大小。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
union un {
int a;
char b;
}*p,x;
void test(union un* p)
{
if (1 == (p->b))
{
printf("%s\n", "小端");
}
else
{
printf("%s\n", "大端");
}
}
int main()
{
x.a = 1;
p = &x;
test(p);
}
19.enum:具有代码的自描述性,列举出具有相关性的常量,可以分段设置常量。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
enum color {
RED,
BLUE,
GREEN=5,
BLACK,
YELLOW=100
};
int main()
{
enum color c = RED;
printf("%d\n", RED);
printf("%d\n", BLUE);
printf("%d\n", GREEN);
printf("%d\n", BLACK);
printf("%d\n", YELLOW);
return 0;
}
20.trypedf:类型重命名。(推荐在结构体上使用)
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
typedef unsigned int u_int;
typedef int* int_p;
typedef struct stu {
char name[20];
int age;
char sex;
}t_stu;
void test(t_stu* p)
{
printf("%s\n", p->name);
printf("%d\n", p->age);
printf("%c\n", p->sex);
}
int main()
{
unsigned int a = 10;
u_int y = a;
int_p p = &a;
t_stu x = { "zhangshan",y,'w' };
test(&x);
return 0;
}
1.C语言中一共有32个关键字(C89 C90),C99标准有32+5个。
2.在Win中,双击的本质是运行程序,将程序加载到内存中。任何程序在被运行之前都必须被加载到内存中。
3.摩尔定律是英特尔创始人之一戈登·摩尔的经验之谈,其核心内容为:集成电路上可以容纳的晶体管数目在大约每经过18个月便会增加一倍。
4.所有变量在声明时不能设置初始值。
5.解决头文件重复包含的一种方法:#pragma once。 .h头文件的作用:便于项目组织,降低维护成本。
6.C语言中为何要有数据类型:对内存进行合理划分,按需索取。
7.局部变量不做初始化,内容为随机值。
8.命名规则:①见名知意。②大小驼峰。③数字字母下划线。
9.计算机内存储的整形必须是补码,有符号正数和无符号数的原反补码相同,有符号且为负数:原码->(最高位为符号位1不变,其余按位取反)反码->(反码+1,符号位也要参加运算)补码;补码取反再+1,可得到原码。
10.为什么计算机中存储补码:cpu所有计算全部能转换为加法依赖于补码,使得cpu的硬件电路只需要设计一套就够了。
11.C中,0为假,非0为真,C语言中C89,C90标准没有bool类型,C99中有-Bool,在头文件
12.强制类型转换:不改变内存中的数据,只改变对应的类型。真实转换:会改变内存中的数据。
13.任何C程序在默认编译好之后,运行时都会打开三个输入输出流,stdin:标准输入,FILE*stdin,键盘。stdout:标准输出,FILE*stdout,显示器。stderr:标准错误,FILE*stderr;显示器。键盘输入的内容或者往显示器中打印的内容都是字符。
14.C语言中有字符串,但没有字符串类型。
15.计算机中清空数据,只需要设置该数据无效即可。调用函数形成栈帧,函数返回栈帧结构被释放。(其中数据会被覆盖)临时函数具有临时性的原因:临时变量存放于栈帧之中。
16.指针就是地址,指针变量用于存放地址。地址(指针)的作用:提高查找定位效率。任何一个变量,在不同的应用场景中,代表不同的含义。int x;x=100,左值,代表x的空间,变量的属性。int y=x;右值,代表x的内容,数据的属性。
17.C中,任何函数参数都会形成临时变量,包括指针变量。限定不严格的变量可以赋值给限定严格的变量,反之则不行。
18.取地址操作取的是最低地址,在C中任何变量都是低地址开始(字节序),对指针进行解引用,即为指针所指向的目标(类型相同)。