helloC

1. 字符串处理

1. gets(str)/puts(str)
2. fgets(str,len,stdin)/fputs(str,stdout)
3. strlen(str)
4. strcat(s1,s2)/strncat(s1,s2,n)   //strcat无法检测s1是否能容纳s2,strncat加上n字节的限制
5. strcmp(s1,s2)strncmp(s1,s2,n)    //只比较前n位
6. strcpy(s1,s2)/strncpy(s1,s2,n)
7. strchr(str,c)/strrchr(str,c)  //在字符串中找字符位置,第二个是倒着找
8. strstr(s1,s2)           //在字符串中找子串位置

2. 存储类别、链接

序号
存储类别
作用域
链接
声明方式

1

auto 自动

块内默认

2

register 寄存器

变量前用关键字register

3

静态无链接

块内的static

4

静态内部链接

文件

内部

全局static

5

静态外部链接

文件

外部

全局变量,不加static

```

  1. extern 说明 extern 只是变量声明,表明这个变量已经在其他文件中定义过了。 用extern声明的变量不能再定义。

  2. auto 关键字 C 中的 auto 和C++ 中的完全不一样 C 中的是存储类别声明 C++ 中是自动类型

  3. 自动即放到栈上,静态即放到数据段,动态放到堆段

  1. malloc(size)

  2. calloc(n,size) 二者参数不同。且calloc初始化申请的空间为0,而malloc不初始化

  3. relloc

  4. free

  1. const //常量限定,注意常量指针和指针常量

  2. volatile //声明不能被编译器优化

  3. restrict //只能用于指针,告诉编译器该指针是访问数据的唯一且初始的方式,可以被优化

  4. _Atomic //原子操作限定,相当于资源锁了,但是只是可选实现,编译器不一定支持,不建议使用

  1. 注意struct成员是数组还是指针的问题 若是数组,存的是数组的大小 若是指针,存的是地址,地址指向其他地方,若要使用,记得用malloc

  2. 结构体的对齐问题

  3. union 中多种类型只占一份空间,可用来判别大端小端

  4. enum 枚举,为了增加程序的可读性,最好只使用,不要对其进行算术运算,不推荐使用

  1. typedef只能用于类型

  2. typedef由编译器解释,#define由预处理器处理

~:取反 & | ^ 与 或 异或

MASK=0x02 flags = flags & MASK 使用 MASK 中的 0 掩藏 flags 中的相应位

MASK=0x02 flags = flags | MASK 使用 MASK 中的 1 打开 flags 中的相应位

MASK=0x02 flags = flags & ~MASK 使用 MASK 中的 1取反后 关闭 flags 中的相应位

MASK=0x02 flags = flags ^ MASK flags中对应 MASK 中的 为1的位置的数全部改变,1变为0,0变为1

MASK=0x02 (flags & MASK)==MASK 检查 flags 中的某位或某几位是否为1

主要是在结构体中声明位大小 struct { int a:1; int b:1; } 本来应该占8字节,现在只占4字节,因为对齐原则,一个int至少4字节,但只使用了2位,其他的30位为0,不使用

最后更新于

这有帮助吗?