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
===================