C开发环境与基础
- C开发工具
Clion 、vscode,工具破J略不同于IDEA,网上找了一个plugin BetterIntelliJ 离线安装即可 - 运行环境
Toolchain之MinGW ,建议x86_64-posix-sjlj
1.基本类型
1.1整型
整型有几个子类型,默认有符号signed,无符号可表示的最大值翻倍,int可省,极值在头文件limits.h定义,如ULLONG_MAX:unsigned long long 的最大值
unsigned short int a;
unsigned long int b;
unsigned long long int c= 1234ULL;(类似Java的后缀)
不同位数系统short long longlong字节宽度可能不同,stdint.h定义了屏蔽系统差异的便移植类型如int32,如果系统int类型为32位,int32_t就会指向int;如果long类型为32位,int32_t则会指向long;其它还有int_least8_t、int_fast8_t、intptr_t(存放指针的整型)等
1.2. 布尔
0=false;非0=true,引入stdbool.h才能使用true/false关键字,可以与0/1互换
1.3.其它
字符、浮点数类似Java,C也可以进行隐式显示类似转换
溢出错误案例
unsigned char xx = 255;
xx=xx+1;
printf("%d\n", xx); // 0
xx=xx-1;
printf("%d\n", xx); // 255
for (unsigned int i = n; i >= 0; --i) // 溢出导致死循环
unsigned int i = 5;
unsigned int j = 7;
if (i - j < 0) // 错误
printf("negative\n");
else
printf("positive\n");
unsigned int ui;
unsigned int sum;
// 错误
if (sum + ui > UINT_MAX) too_big();
else sum = sum + ui;
// 正确
if (ui > UINT_MAX - sum) too_big();
else sum = sum + ui;
2.指针类型
- 传入指针,即指向int p的地址,故对该地址的p修改函数外也能获取修改后的值,类似Java引用传递
void increment(int* p) {
*p = *p + 1;
}
int x=1;
increment(&x);//传入x的地址
printf("%d",x);//2
- *运算符为取内存地址的值,&p为取p的内存地址 p == *(&p)
- 指针运算
int* p;
*p = 1; // 错误,指针类型默认执行随机地址,不能读写;初始化后的指针可以加减整数表示指针移动;
short* j1;
short* j2;
j1 = (short*)0x1234;
j2 = (short*)0x1236;
ptrdiff_t dist = j2 - j1; //一种带符号的整数类型
printf("%d\n", dist); // 指针不能相加但可以相减,表示它们的距离,这里距离为1(但是内存地址相差2个bit),2个字节正好存放1个 short 类型的值