1.特殊的char类型。
字符类型 char 也可以设置 signed 和 unsigned 。
signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255
注意,C 语⾔规定 char 类型默认是否带有正负号,由当前系统决定.
这就是说, char 不等同于 signed char ,它有可能是 signed char ,也有可能是
unsigned char 。
这⼀点与 int 不同, int 就是等同于 signed int
2.如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
3. do while(0) 用于宏定义。好习惯。
4. ASCII 码
我们不需要记住所有的ASCII码表中的数字,但是我们最好能掌握⼏组特殊的数据:
• 字符 A~Z 的ASCII码值从65~90
• 字符 a~z 的ASCII码值从97~122
• 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32
• 数字字符09的ASCII码值从4857
• 换⾏\n的ASCII值是:10
• 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上观察
5.如果函数不需要返回值,返回类型设置为void,如果不写,函数默认返回int类型的值。
6. 被static修饰的局部变量n只会被创建和初始化⼀次,不需要在每次调⽤test函数时都进⾏初始化,即相当于提出去当了全局变量。
7.内存
8.宏定义一定要带括号,否则不知道传的参数是否也是个表达式。宏定义就是无脑替换,不会自己给你带括号。宏定义无形参。宏函数也是。
#define SQUARE_SUM(a, b) ((a) * (a) + (b) * (b))
宏定义本身不参与编译过程,而是在预处理阶段由预处理器对源代码进行文本替换
9.void* 类型指针
⼀般 void* 类型的指针是使⽤在函数参数的部分,⽤来接收不同类型数据的地址,这样的设计可以
实现泛型编程的效果,使得⼀个函数来处理多种类型的数据。
10.const修饰指针变量的时候
结论:
• const如果放在的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
但是指针变量本⾝的内容可变。
• const如果放在的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变。
11.char
char只占一个字节,指针每次也指向一个字节。这样char 和指针就能做一些事。例如算字符串的个数。char指针malloc 的大小,就是char 指针数组的大小。
//指针-指针求字符串长度
#include <stdio.h>
int my_strlen(char *s)
{
char *p = s; while(*p != '\0' )
p++;
return p-s;
}
int main()
{
printf("%d\n", my_strlen("abc"));
return 0;
}
12 inline
在C语言中,inline
关键字是一个相对较新的特性,它首次在C99标准中被引入。inline
的主要目的是向编译器建议某个函数应该被内联展开,即函数的代码应该在每个调用点直接插入,而不是像通常那样进行函数调用。这样做可以减少函数调用的开销,包括保存和恢复栈上下文、参数传递和返回地址等。
#include <stdio.h>
inline int max(int a, int b)
{
return (a > b) ? a : b;
}
int main()
{
int x = 10, y = 20;
printf("Max of %d and %d is %d\n", x, y, max(x, y));
return 0;
}
在这个例子中,max
函数被定义为一个 inline
函数。编译器可能会选择在 main
函数中直接插入 max
函数的代码,而不是进行函数调用。
13 函数和宏
- 宏的优势
- ⽤于调⽤函数和从函数返回的代码可能⽐实际执⾏这个⼩型计算⼯作所需要的时间更多。所以宏⽐
函数在程序的规模和速度⽅⾯更胜⼀筹。 - 更为重要的是函数的参数必须声明为特定的类型。所以函数只能在类型合适的表达式上使⽤。反之
这个宏怎可以适⽤于整形、⻓整型、浮点型等可以⽤于 > 来⽐较的类型。宏的参数是类型⽆关
的。
- 宏和函数相⽐的劣势:
- 每次使⽤宏的时候,⼀份宏定义的代码将插⼊到程序中。除⾮宏⽐较短,否则可能⼤幅度增加程序
的⻓度。 - 宏是没法调试的。
- 宏由于类型⽆关,也就不够严谨。
- 宏可能会带来运算符优先级的问题,导致程容易出现错。
14 数组
除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。
- sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数
组。 - &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。