C++之C基础

  1. 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函数的返回值,不同平台返回值不同
    }
    
  2. 编译步骤

    1. 预处理:宏定义展开,头文件展开,条件编译等,同时删除注释,不检查语法,头文件展开就是把.h文件的内容替换到.c文件中。

      gcc -E hello.c -o hello.i

    2. 编译:检查语法,将预处理后的文件编译生成汇编文件。

      gcc -S hello.i -o hello.s

    3. 汇编:将汇编文件生成目标文件(二进制文件)。

      gcc -c hello.s -o hello.o

    4. 链接:C程序是需要依赖各种库的,所以编译之后还需要把库链接到最后的可执行程序中,程序依赖的动态库要么在环境变量中,要么在同一个目录下,lld命令可以查看一个可执行文件需要的动态库。

      gcc hello.o -o hello

  3. 声明定义

    • extern int a; 声明外部文件已经定义过a了,不建立存储空间
    • int b = 10; 定义,建立存储空间
  4. 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进制转义字符
    
  5. 汇编

    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"
    
  6. 原码补码反码

    • 原码:最高位为符号位,正数为0,负数为1。
    • 反码:
      • 正数原码和反码一致。
      • 负数反码:原码符号位不变,其他位取反。
    • 补码:计算机采取补码存储数据
      • 正数原码,反码,补码一致。
      • 负数补码:反码+1。
  7. 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
    
  8. 指针

    • 野指针:指向无意义的地址,本身无错,但是若要操纵内存就会有问题。

    • 不可以定义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";	//在堆,数组,可以改
      

欢迎访问我的主页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值