水木社区CFAQ---------资料收集请勿回复
转自水木社区:1、程序运行闪一下就没了,看不到运行结果。
以下方法为VC6.0中测试通过。
解决方法一:在程序结束的"}"处设置断点。
解决方法二:用"!",而不是F5执行。
解决方法三:程序头添加#include <stdlib.h>,程序结束处添加system("PAUSE");
TC3.0中方法:
Alt+F5查看Output窗口
2、TC编译提示找不到.obj文件 .h文件。
在菜单中设置路径。详见精华区->常见工具。
TC已经落伍了,跟不上标准,不建议使用。
3、C语言推荐图书
《The C Programming Language》(k&r),
Computer Systems: A Programmer's Perspective (CS:APP)
百度或google一下“C四书五经”
4、do{...}while(0)用途
精华区->[FAQ]常见问题->....的作用/....的通途 -> do{...}while(0)用途
5、(++i)*(++i)*(++i)的值是多少
和编译器相关,编码推荐不使用这种风格的表达式,愿意研究的请自行研究,本版不讨论。
另:同一变量在一个表达式中两次作为左值出现时,表达式的值不确定。比如,(i++)+(i++),i=i++
6、char *p="abcd";为什么不对
"abcd"是一个指针,一个字符串指针,指向的字符串一般保存在常量数据区,不可修改。
所以如果有char *p="abcd";然后*p=9;则会发生运行时错误。
"abcd"[2]值为'c',"abcd"[2]=5显然是不对的,写成p[2]=5或者*(p+2)=5也是不对的。
如果真的需要使用"abcd"作为指针,建议写为const char * p="abcd";
如果是初始化字符串数组,建议写为char p[]="abcd";
如果p为指针,需要初始化,应该是char *p;p=malloc(STR_SIZE);strcpy(p,"abcd");
7、#和##是什么意思?
预处理符号,#表示字符串,比如#define STR(a) #a 则STR(abc)为"abc"
##表示连接,比如#define S(a,b) a##b 则S(a,b)=5为ab=5
详见精华区-〉C语言讲解->常规预处理
8、推荐编译器/集成开发环境?
windows下vc不错但是很大,小一点免费的有dev c++ lcc,单独编译器icc也很好,gcc的偏好者可以用mingw+gcc或者cygwin+gcc
linux下当然的gcc
9、fwrite写入的字节数和结果文件字节数大小不等,结果文件要略大,为什么?
打开文件方式错误,不要用"wt",要用"wb"
10, 数组名是地址么?它和地址的差异在哪里呢?
如果运算需要的话,所有的数组都存在到它元素的指针类型的右值的隐式类型转换。
说数组是本身就是地址是不科学的,而应该说数组能够自动的转化为指向他的元素的指针,
这种转化是单向的,是一种退化,损失了原来数组的大小这个重要的信息。
除了 sizeof 之外,其他运算符作用到数组上的时候,都要发生这种转化,即使取下标
也不例外。
比如整型二维数组w[3][4],
先不要把 w 看作地址。把 w 看作三个四个元素的数组的组成的数组。
sizeof(w) 不转化
sizeof(w+0) 转化,这个和上面的结果的差异仔细观察
ww = w 转化
w[0][0] = 0 两次转化
w = NULL 无法转化
由于那么 w 是三个四个元素的数组组成的数组,那么它就可以隐式地转为
指向四个元素的数组的指针。
ww = w 的时候。做了一次隐式的类型转换,从 T [3][4] 变成 T (*)[4]。
11. 数组和指针的区别
11.0 假设a是数组,p是指针。比如 char a[5]; char *p;
数组和指针是完全不同的类型,当然有区别!!!
11.1 数组有点像label,本身不占空间,占空间的是数组元素。
指针本身占空间,大小为sizeof(T*),当然指向的内容也占空间。
11.2 a 和 &a 类型不同,但是“地址”相同,都是label标记的地址。
11.3 sizeof(a) 等于数组元素的大小 乘以 元素的个数
sizeof(p) 指针本身的大小,其值在32位机器上一般等于4。
11.4 数组本身不能改变,比如a=b或a++都是错误;指针可以改变。数组可以赋值给指针
11.5 函数形参数组完全等同于指针。形象说编译器把数组形参编译为指针形参,也可以说函数声明中不存在数组(形参或返回值)。
11.6 数组的数组和指针的指针完全不同,无法转换。