c语言——linux上c开发编译tips

vim编辑

gcc编译

gdb调试

 

vim小技巧:shift+v再按下箭头可以选中多行 y复制多行,d删除多行

 

c语言运行步骤:

预处理->编译->链接

预处理gcc -E main.c -o main.i(头文件替换,宏替换,删除注释)

编译gcc -S main.i -o main.s(变成汇编代码)

汇编gcc -c main.s -o main.o(生成目标文件,可重定向文件)

链接gcc main.o -o main

 

#if 0

#endif

可以起到条件注释的作用,预处理阶段就会处理

 

 

===================================

c语言类型的最小值是一个字节

%p可以打印内存地址

===================

进制

printf("%d", 017);

printf("%d", 0x17);

scanf("%x", &cmd);

scanf("%o", &cmd);

===================

输入输出

    a = getchar();

    printf("%d\n", a);

    char b[100];

    gets(b);

    puts(b);

    putchar(a);

    a = getc(stdin);

    printf("%c\n", a);

    putc(a, stdout);

 

//使用fgets()替换gets()

 

char buffer[4096];

 

fgets(buffer, (sizeof buffer / sizeof buffer[0]), stdin);

===================

memset是以字节为单位进行赋值的,所以一般用于数组的初始化操作,清0操作。

int a[10];

memset(a, 1, sizeof(a))

a[0]的值将会是0x01010101,16843009

===================

选择排序

for(int i = 0 ; i < alen-1; i++){

int min = i;

for(int j = i+1 ; j < alen; j++){

if(a[min]>a[j]){

min = j;

}

}

int tmp = a[i];

a[i] = a[min];

a[min] = tmp;

}

快排

#include <stdlib.h>

int cmp(int *a, int *b){

return *a-*b;

}

int cmpfunc (const void * a, const void * b) {

return ( *(int*)a - *(int*)b );

}

qsort(a, alen, sizeof(int), cmp);

===================

LEARN C STANDARD LIBRARY

===================

是因为 当数组做为函数的形参的时候,该参数退化为指针,并且是无法直接求得数组的大小

32位 sizeof(arr) = 4

64位 sizeof(arr) = 8

===================

常量指针,指向常量的指针,不能改变值,可以改变地址

const int *p = &a;

指针常量,指针是一个常量,不能改变地址,可以改变值

int *const p = &a;

(可以简单理解为const修饰谁,谁就是常量)

===================

函数指针,是指向函数的指针

顾名思义,指针函数即返回指针的函数。其一般定义形式如下:

类型名 *函数名(函数参数表列);

===================

输出多个字符串

printf("sdfdsf""sdfds""e3rjkerj");

puts("sdf""2342");

===================

strcpy strcat strcmp strlen

字符串连接的几种方式

strcat(a,b);

    char *p = a+6;

    strcpy(p, b);

    p = p+3;

    memcpy(p, b, sizeof(b));

===================

当前所处的文件,函数,行

printf("file:%s func:%s line:%d", __FILE__, __FUNCTION__, __LINE__);

===================

结构体初始化,可以用数组的方式;但不能用这种方式赋值

struct Node n = {4,6,7};

结构体赋值,可以用memcpy或者一个一个赋值

memcpy(&stu2, &stu, sizeof(stu));

===================

结构体对齐 mac64位 以结构体中占用内存最大的基本数据类型为最小单位进行对齐。

如果是int就是4,如果是long就是8

struct Date{

char time[20];

};

struct Student{

char name[20];

int age;

struct Date date;

};

sizeof(struct Student) = 44;

===================

struct Date{

char time[20];

};

 

struct Student{

char name[20];

int sno;

char sex;

short age;

long money;

struct Date date;

};

sizeof(struct Student) = 64;

===================

union A{

int a;

int b;

int c;

};

union A a;

a.a = 4;

a.b = 5;

printf("%d %d\n", a.a, a.b); 输出:5 5

===================

enum BB{AA = 1, B, C};

printf("%d\n", AA+B+C); 输出:6

===================

c按位取反 带符号位按位取反

负数如何用二进制表示,等于它的正数的补码

-1 -> 正数 00000000 00000000 00000000 00000001 -> 取反 11111111 11111111 11111111 11111110-> 加一

11111111 11111111 11111111 11111111

-1 = 11111111 11111111 11111111 11111111 -> 取反 00000000 00000000 00000000 00000000 = 0

0 = 00000000 00000000 00000000 00000000 -> 取反 11111111 11111111 11111111 11111111 = -1

1 = 00000000 00000000 00000000 00000001 -> 取反 11111111 11111111 11111111 11111110 = -2

负数的二进制如何转化成十进制,同样是取反加1,再加上负号

11111111 11111111 11111111 11111110 -> 取反 00000000 00000000 00000000 00000001 -> 加一 00000000 00000000 00000000 00000010 = 2 -> 加负号 -2

 

===================

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值