【C语言】我的23个C语言check list

来源:互联网 发布:淘宝详情页是什么 编辑:程序博客网 时间:2024/06/05 06:37

今天整理桌子发现了一叠纸,上面都是自己在学C语言的时候的一些不理解反复学习的知识点,但是有一部分找不到了,现在看看还是满满的回忆。刚刚读大学的时候,比较二逼,觉着上了大学就自由了,可以放松了,第一学期的C语言课,没有认真学习,只是为了应付考试最后考了80+分,所以到了大二感觉后悔的要死,往死里恶补,从图书馆里借来了好多本C语言的经典书,《C陷阱与缺陷》《C程序设计语言》《495个C语言问题》《C专家编程》《征服C指针》等等,虽然不敢说每本书的每一页都仔细看过,但是至少也有70%吧,所以贴到博客上来,也算是温故而知新,更是对自己那些献给C语言的日子的一些见证。OK,下面就是了。


1.

const int n = 5;      //不能修改n的值,因为n为不可变的变量const int  *p = &n;   int const  *p = &n;   //这两个语句等价,可以修改指针p的值,但是不能修改变量n的值。int * const r = &n;       //你能修改指针r的值,但是可以修改*r即变量n的值。const int * const r = &n;      //不能修改*r的值,也不能修改r的值。

2.

在声明函数的时候,const可以用来修饰形式参数(一般为指针)。


3.

union变量可以被初始化,但是这个初始值必须是union变量的第一个成员的类型,而且他必须位于一对花括号({})里。

例如:

union{int i; float f; double d;} x = {5};

4.

C语言声明的优先级规则:

A:声明从他的名字开始读取,然后按照优先级次序依次读取。

B:优先级从高到低依次是:

①.声明中被括号括起来的部分。

②.后缀操作符:

括号()表示这是一个函数。

而中括号[]表明这是一个数组。

③.前缀操作符:*表示指向......的指针。

C:如果const和volatile关键字的后面紧跟类型说明符(如int和long),那么它作用于类型说明符;其他情况下,const或volatile关键字作用域它左边紧邻的*指针符号。


5.

static在函数这一级,表示该函数仅对该文件可见。


6.

typedef并不创建一个变量,而是宣称这个名字是指定类型的同义词。

可以用其他类型的说明符对宏类型名进行扩展,但对typedef所定义的类型就不行。

不要为了方便(少打5个字母)省略掉struct而使用typedef,这样会省略掉提示信息。


7.

只有在函数形参的声明中,数组的声明才可以被解读为指针。


8.

gechar()函数的返回值为int类型,如下代码:


int ch;while((ch = getchar()) != EOF){NULL;}

9.

下面两段代码的对比:

A:

char ch;while(!feof(fp)){    ch = fgetc(fp);    printf("%X/n", ch);}
B:

char ch;ch = fgetc(fp);while(!feof(fp)){    print("%X\n",ch);    ch = fgetc(fp); }
以上两段代码功能一样,都是从文件里读取数据,但是方法A多输出一个FF,方法B结果正常。


10.

double d = 10.0;printf("%f\n", d);
在printf函数中,%lf并没有被定义,应该尽可能的使用%f保证可移植性。

11.

fgetpos/fsetpos和ftell/fseek之间的区别?

ftell和fseek用long int类型表示文件内得偏移量,因此偏移量被限制在2G(2^31 - 1)以内,而fgetpos/fsetpos用一个特殊类型fpos_t便是偏移量(可以表示恩一大小的偏移量)。


12.

静态变量在没有被显示初始化的情况下,自动初始化为0.

auto变量在没有被显示初始化的情况下,不会被初始化。


13.

ANSI C允许指向数组的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但不允许与指向数组第一个元组之前的那个内存位置的指针进行比较。


14.

char *string = "abc";

string指针指向的字符串不能被修改。(楼主表示被坑过)


15.

对数组的引用总是可以写成指针的引用。


16.

通用规则:

①当一个数组名出现在一个表达式中时,他会被转化为一个指向该数组的第一个元素的指针。

②对数组的引用如a[i]在编译时总是被编译器改成*(a + i)的形式。

③在表达式中,指针和数组是可以互换的,因为编译器里的最终形式都是指针,并且都可以进行下标操作。


17.

什么时候数组和指针是相同的?

①表达式中的数组名被编译器当做指向该数组第一个元素的指针。

②下表总是与指针的偏移量相同。

③在函数参数的声明中,数组名被编译器当做指向数组第一个元素的指针。


18.

为什么C语言要把数组形参当做指针来处理?

为了效率。在C语言中,所有非数组形式的数据实参均以值传递形式调用。函数的返回值绝对不能是一个函数数组,而只能是指向数组或函数的指针。


19.

处理锯齿状数组时,应使用字符串指针数组,节省空间。


20.

向函数传递一位数组的方法:

①增加一个额外的参数,表示数组长度的方法。

②赋予数组最后一个元素一个特殊值,提示他是数组的尾部。


21.

gets()函数和fgets()函数的区别gets()不对数组的长度进行检查,安全性低(果断放弃之)。


22.

C中的参数是从后往前被堆积在栈中的。


23.

int array[10];int *p = array;int *q = &array;
p和q的区别?

p的类型为int *,它指向array[10]的第一个元素的首地址。

q的类型为int(*q)[10],它指向整个array[10]数组的首地址。


0 0
原创粉丝点击