1. 程式人生 > >c語言——linux上c開發編譯tips

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);

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

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

是因為 當陣列做為函式的形參的時候,該引數退化為指標,並且是無法直接求得陣列的大小

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

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