-
system
//demo.c #include <stdlib.h> int main() { system("ls"); //这个函数可以执行系统命令 return 0; }
#include <stdio.h> int main() { int ret = system("./demo"); //执行上面的程序 printf("%d\n",ret); //ret就是main函数的返回值,不同平台返回值不同 }
-
编译步骤
-
预处理:宏定义展开,头文件展开,条件编译等,同时删除注释,不检查语法,头文件展开就是把.h文件的内容替换到.c文件中。
gcc -E hello.c -o hello.i
-
编译:检查语法,将预处理后的文件编译生成汇编文件。
gcc -S hello.i -o hello.s
-
汇编:将汇编文件生成目标文件(二进制文件)。
gcc -c hello.s -o hello.o
-
链接:C程序是需要依赖各种库的,所以编译之后还需要把库链接到最后的可执行程序中,程序依赖的动态库要么在环境变量中,要么在同一个目录下,lld命令可以查看一个可执行文件需要的动态库。
gcc hello.o -o hello
-
-
声明定义
extern int a;
声明外部文件已经定义过a了,不建立存储空间int b = 10;
定义,建立存储空间
-
int a = 123; //10进制 int b = 0123; //8进制 int c = 0x123; //16进制 1Kb = 1024bit 1KB = 1024Byte '\0' === 0 === NULL //字符'\0'等价于数字0等价于NULL 字符数组最后一个是'\0'就是字符串 C语言支持8进制16进制转义字符
-
汇编
int a,b,c; __asm { mov a,3 //3的值放在a对应内存的位置 mov b,4 //4的值放在b对应内存的位置 mov eax,a //把a内存的值放在eax寄存器 add eax,b //eax和b相加,结果放在eax mov c,eax //eax的值放在c中 } printf("%d\n",c); //"7"
-
原码补码反码
- 原码:最高位为符号位,正数为0,负数为1。
- 反码:
- 正数原码和反码一致。
- 负数反码:原码符号位不变,其他位取反。
- 补码:计算机采取补码存储数据
- 正数原码,反码,补码一致。
- 负数补码:反码+1。
-
fgets(buf,100,stdin); //读99位到buf包括\n fputs(buf,stdout); //输出buf strncpy(dst,src,10); //拷贝10个字符 strncat strncmp sprintf(buf,"a=%d\n",10); //buf = "a=10\n" char buf[] = "10"; sscanf(buf,"%d",&a); //从buf读取写到a中 strstr() //查字串 strchr() //查字符 strtok(buf,","); //切割字串 strtok(NULL,","); //第二次切割 atoi();atof();atol(); //字串转int,float,long
-
指针
-
野指针:指向无意义的地址,本身无错,但是若要操纵内存就会有问题。
-
不可以定义void变量,但可以定义void*万能指针,因为地址大小是固定的,万能指针可以指向任何类型的变量,但是操作内存时需要转换为具体类型。
-
数组名是个常量,是不能改变的,他的值为第一个元素的地址。
-
const int * p = &a; int const * p = &a; //这两个等价,*p=1可以,p=NULL不行 int * const p = &a; //p=NULL可以,*p=1不行
-
char *p = "hello"; //在栈,常量,不能改 char p[] = "hello"; //在堆,数组,可以改
-
C++之C基础
最新推荐文章于 2022-02-25 23:47:59 发布