C语言编程注意点

1、scanf(’%d’,&input)
scanf要用地址符&,字符串除外:scanf(’%s’,input),因为字符串名字即为字符串首地址;
scanf(’%s’,input)遇到空格即结束,gets(input)遇到空格不结束,遇到回车结束;
scanf(’%s’,input),如果input是char *,一定要先用malloc开辟空间。
2、printf(’%d’,num)
printf()不需要取地址符,直接用变量名即可;
3、函数定义
c语言不支持函数重载。同一作用区域不可以有函数重名,但不同作用区域中允许函数重名。不同作用区域可以通过在不同文件中使用static实现。
4、形参、实参
函数调用过程中,形参和实参是值传递,不会相互影响。
5、函数返回值
如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。
6、函数声明
a、 void printMax(int a, int b);
b、 void printMax(int, int);
两种方式均可。函数声明可以放在文件开头,则此时全部函数均可使用该函数。
7、函数可以嵌套调用,但是不可以嵌套定义
8、函数的递归
在调用一个函数的过程中又出现直接或者间接地调用该函数本身。(汉诺塔问题)
9、数组定义

type arrayName [ arraySize ];
10、数组内存是连续的
11、在C语言中,二维数组是按行排列的。
12、字符数组
字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了

char str[7];
str = "abc123"; //错误
//正确
str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
str[3] = '1'; str[4] = '2'; str[5] = '3';

在C语言中,字符串总是以’\0’作为结尾,所以’\0’也被称为字符串结束标志,或者字符串结束符。
‘\0’是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中唯一的作用就是作为字符串结束标志。字符’\0’的编码值就是 0。
由" "包围的字符串会自动在末尾添加’\0’
逐个字符地给数组赋值并不会自动添加’\0’
13、在函数内部定义的变量、数组、结构体、共用体等都称为局部数据。在很多编译器下,局部数据的初始值都是随机的、无意义的,而不是我们通常认为的“零”值。
14、变量的使用遵循就近原则,如果在当前的局部作用域中找到了同名变量,就不会再去更大的全局作用域中查找
全局变量的作用域从定义开始到本文件结束,其他文件不可用,本文件中定义之上不可用。通过static可以将全局变量的作用域限定在本文件中
15、变量的存储方式
a、静态存储区:程序运行期间由系统分配固定的存储空间
全局变量全部存放在静态存储区
b、动态存储区:程序运行期间根据需要动态分配存储空间
(1)函数形式参数;(2)函数中定义的没有static关键字声明的变量;(3)函数调用时的现场保护和返回地址等
16、变量的存储类别
a、自动存储(auto);b、静态分配(static);c、寄存器存储(register):允许把变量的值放在CPU的寄存器中;d、外部存储(extern)
17、默认值问题
static定义的变量有默认值,如int为0;数组中也有默认值;其他的无默认值,值不确定。
数组默认值如下:

int arr[10]={1,2,3};    //剩余其他为0
int brr[10]; //brr元素无默认值

18、外部函数
定义函数时默认省略extern,可供其他文件调用。
19、C语言是值传递,即便是指针作为参数。
20、使用指针时一定要时刻注意指针的当前值