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
===================
更多推荐
所有评论(0)