C程序设计语言学习笔记

来源:互联网 发布:中国移动网络电视套餐 编辑:程序博客网 时间:2024/06/02 23:55

第一章入门
1、UNIX操作系统,C编译器和几乎所有的UNIX应用程序都使用C语言编写的。
2、在C语言中,所有变量都必须先声明后使用。声明通常放在函数起始处,在任何可执行语句之前。声明用于说明变量的属性,它有一个类型名和一个变量表组成。
3、printf函数并不是C语言本身的一部分,仅仅是标准库函数中的一个函数。
4、EOF定义在头文件<stdio.h>中,是一个整型数。与任何实际字符都不同。
5、函数最好按照ANSI C中定义的方式声明。
6、在C语言中,所有的函数参数都是“通过值”传递的。被调用函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。
7、要想让函数能够修改主调函数中的变量,需要用指针或者数组作为参数。
8、函数中的每个局部变量只在函数被调用时存在,在函数执行完毕退出时消失。
9、外部变量必须定义在所有函数之外,且只能定义一次,定义后编译程序将为它分配存储单元。
10、外部变量在数据段分配。重复定义其实是重复分配,所以会出现错误。
11、所有在目标代码中的地址都是相对地址,直到链接时重定位。
12、“定义”表示创建变量或分配存储单元,而“声明”指的是说明变量的性质,但并不分配存储单元。
13、外部变量的使用会降低程序的通用性,应尽量减少使用。
14、变量名(标识符)都是给人看的,最后都变成内存地址。
15、变量名,变量类型都是编译时的概念,而不是运行时的概念。

第二章 类型、运算符与表达式
1、关于变量名:局部变量一般使用较短的变量名,外部变量使用较长的名字来表达用途。
2、short int一般写为short,通常为16位,long int一般写为long,通常为32位。int可以是16位或32位。
3、char可以有signed和unsigned加以限定,不加限定的char符号取决于具体机器,但是可打印字符总是正值。
4、无符号常量以字母u或U结尾。后缀ul或UL表明是unsigned long类型。
5、带前缀O的整型常量表示它为八进制形式;前缀为0x或0X,则表示它是十六进制形式。
6、常量表达式在编译时求值。
7、某些字符可以用转义字符序列表示。例如,'/ooo'和'/xhh'。
8、字符串常量也叫做字符串字面值,是由双引号括起来的0个或多个字符组成的字符序列。
9、(类型名)表达式这种方法经常用来转换指针。
10、自增和自减运算只能作用于变量。
11、赋值运算符有很多优点:简洁、高效,与人们的思维习惯接近。
12、三元运算符条件表达式可以写出很简洁的代码。
13、运算符的优先级:多用括号。
14、按位与运算符&经常用于屏蔽某些二进制位;按位或运算符|常用于将某些二进制位置为1。

第三章控制流
1、if语句要注意配对。
2、switch语句的最后一个分支(即default分支)的后面也应该加上一个break语句。
3、for语句的各组成部分可以是任何表达式,所以for语句并不限于通过算术级数进行循环控制。
4、do while语句至少执行一次。
5、应尽量少用或不用goto语句。

第四章函数与程序结构
1、C语言程序一般有许多小的函数组成,而不是由少量较大的函数组成。
2、最简单的函数可以是dummy(){},它可以在程序开发期间用于保留位置。
3、如果两个函数必须共享某些数据,而这两个函数互不调用对方,则用外部变量。
4、函数的参数实际是局部变量。
5、外部变量的初始化只能出现在其定义中。
6、名字的作用域指的是程序中可以使用该名字的部分。
7、对于在函数开头声明的自动变量来说,其作用域是声明该变量名的函数。
8、不同函数中声明的具有相同名字的各个局部变量之间没有任何关系。
9、如果要在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同一个源文件中,则必须在相应的变量声明中强制性地使用关键字extern。
10、外部变量的初始化只能出现在其定义中。
11、对于某些中等规模的程序,最好只用一个头文件存放程序中各部分共享的对象。较大的程序需要更多的头文件,我们需要精心地组织它们。
12、关于static
    (1)static既可用于声明外部变量,也可用于声明内部变量。
    (2)static既可用于声明变量,也可用于声明函数。
    (3)通常情况下,函数名字是全局可访问的,对整个程序的各个部分而言都可见。但是,如果把函数声明为static类型,则该函数除了对该函数声明所在的文件之外,其他文件都无法访问。
    (4)用static也可以限定外部变量的作用域为其所在的源文件。这与限定函数其实是一样的。因为函数可以看作是外部变量。
    (5)static类型的内部变量同自动变量一样,是某个特定函数的局部变量,只能在该函数中使用,但它一直占用存储空间,而且在编译时分配内存。
13、在一个好的程序设计风格中,应该尽量避免出现变量名隐藏外部作用域中相同名字的情况。
14、在不进行显示初始化的情况下,外部变量和静态变量都将被初始化为0,而自动变量和寄存器变量的初值则没有定义。
15、对于外部变量和静态变量来说,初始化表达式必须是常量表达式,且只初始化一次(程序开始执行前进行初始化)。
16、对于自动变量和寄存器变量,则在每次进入函数或程序块时都将被初始化。
17、数组的初始化可以在声明的后面紧跟一个初始化表达式列表。当省略数组的长度时,初始化表达式的个数就被当作是数组的长度。
18、如果数组的初始化表达式的个数比数组的元素数少,则对外部变量、静态变量和自动变量来说,没有初始化表达式的元素将被初始化为0。
19、续行可以在待续行的末尾处加上一个反斜杠符/。
20、宏替换中,参数名以#作为前缀则结果将被扩展为由实际参数替换该参数的带引号的字符串。
21、预处理器运算符##为宏扩展提供了一种连接实际参数的手段。如果替换文本中的参数与##相邻,则该参数将被实际参数替换,##与前后的空白符将被删除,并对替换后的结果重新扫描。

第五章指针与数组
1、ANSI C使用类型void *代替char *作为通用指针的类型。
2、指针只与字长有关。
3、每个指针都必须指向某种特定的数据类型。
4、void类型的指针可以存放指向任何类型的指针,但是它不能间接引用其自身。
5、指针pa+1就意味着pa所指向的对象的下一个对象。相应地,pa+i指向pa所指向的对象之后的第i个对象。
6、数组名不是变量,指针则是变量。因此指针可以作自增和赋值运算,但是数组名不可以。
7、类似于p[-1]、p[-2]这样的表达式在语法上都是合法的,它们分别引用位于p[0]之前的两个元素。
8、一般情况下,同其他类型的变量一样,指针也可以被初始化。通常,对指针有意义的初始化值只能是0或者是表示地址的表达式,对后者来说,表达式所代表的地址必须是在此前已定义的具有适当类型的数据的地址。
9、C语言保证0永远不是有效的数据地址。
10、指针没有合理合法的初值,通常出现断错误。
11、字符串长度、拷贝和比较的函数:

int strlen(char *s)
{
    char *p = s;
    while(*p != '/0')
    p++;
   
    return p - s;
}

void strcpy(char *s, char *t)
{
    while(*s++ = *t++)
    ;
}

int strcmp(char *s, char *t)
{
    for( ; *s == *t; s++, t++)
    if(*s == '0')
        return 0;
    return *s - *t;
}

第六章 结构
1、结构可以拷贝、赋值、传递给函数,函数也可以返回结构类型的返回值。
2、如果结构声明后面不带变量表,则不需要为它分配存储空间,它仅仅描述了一个结构的模板或轮廓。
3、结构的合法操作只有几种:作为一个整体复制和赋值,通过&运算符取地址,访问其成员。
4、在所有运算符中,下面四个运算符的优先级最高:结构运算符"."和"->",用于函数调用的"()"以及用于下标的"[]"。
5、sizeof是编译时的一元运算符,它用来计算任意对象的长度。
6、条件编译语句#if不能使用sizeof,应为预处理器不对类型名进行分析。但预处理器并不计算#define语句中的表达式,因此在#define中使用sizeof是合法的。
7、结构有对齐问题,主要是为了提高访问效率。
8、typedef可以使表达更简洁,可以使程序参数化,还可以为程序提供更好的说明性。
9、联合实际上就是一个结构,它的所有成员相对于基地址的偏移量都为0,此结构的容量要大到足够容纳最“宽”的成员,其对齐方式要适合联合中所有类型的成员。
10、对联合的操作与对结构允许的操作相同;作为一个整体单元进行赋值、复制、取地址及访问其中一个成员。
11、联合只能用其第一个成员类型的值进行初始化。
12、位字段与具体的实现有关,而且与大小端有关,因此具有不可移植性。

 

 

原创粉丝点击