Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: c程序 报错诸多 求解答

回复:
user: user-1
content: 引用 4 楼 sonnig_8 的回复:谢谢楼三的程序（真的比我写的简单多了，惭愧Ing），楼二老师的方法我也用过，但是确实不太懂怎么修改，遇到错的地方直接删掉反而可以运行 错误代码如下（有点多...）： 200	3 [Warning] passing argument 1 of 'daochu2' from incompatible pointer type [enabled by default] 218	3 [Warning] passing argument 1 of 'daochu3' from incompatible pointer type [enabled by default] 262	3 [Warning] passing argument 1 of 'dayin2' from incompatible pointer type [enabled by default] 373	5 [Warning] passing argument 1 of 'shuru2' from incompatible pointer type [enabled by default] 374	5 [Warning] passing argument 1 of 'shuru3' from incompatible pointer type [enabled by default] 378	5 [Warning] passing argument 1 of 'dayin2' from incompatible pointer type [enabled by default] 384	4 [Warning] passing argument 1 of 'paixu' from incompatible pointer type [enabled by default] 391	4 [Warning] passing argument 1 of 'daochu2' from incompatible pointer type [enabled by default] 392	4 [Warning] passing argument 1 of 'daochu3' from incompatible pointer type [enabled by default] 	   [Error] ld returned 1 exit status 你在你代码最开头加/*,最后加*/，编译，通过。 然后将你代码中你认为不可能出错的部分放在/*...*/外，其余括在/*...*/里面，编译，若通过，逐步减少被/*...*/括住的内容；若不通过，逐步增加被/*...*/括住的内容，……

user: user-2
content: 我大一时写的代码。 与你的需求应该大体相同。 可以参考一下： http://download.csdn.net/detail/zidane_2014/9029619

user: user-1
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-3
content: 楼主，错误信息贴一下

user: user-0
content: 谢谢楼三的程序（真的比我写的简单多了，惭愧Ing），楼二老师的方法我也用过，但是确实不太懂怎么修改，遇到错的地方直接删掉反而可以运行 错误代码如下（有点多...）： 200	3 [Warning] passing argument 1 of 'daochu2' from incompatible pointer type [enabled by default] 218	3 [Warning] passing argument 1 of 'daochu3' from incompatible pointer type [enabled by default] 262	3 [Warning] passing argument 1 of 'dayin2' from incompatible pointer type [enabled by default] 373	5 [Warning] passing argument 1 of 'shuru2' from incompatible pointer type [enabled by default] 374	5 [Warning] passing argument 1 of 'shuru3' from incompatible pointer type [enabled by default] 378	5 [Warning] passing argument 1 of 'dayin2' from incompatible pointer type [enabled by default] 384	4 [Warning] passing argument 1 of 'paixu' from incompatible pointer type [enabled by default] 391	4 [Warning] passing argument 1 of 'daochu2' from incompatible pointer type [enabled by default] 392	4 [Warning] passing argument 1 of 'daochu3' from incompatible pointer type [enabled by default] 	   [Error] ld returned 1 exit status
user-0 提问: 关于c编写Webservice

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:gsoap对于c/c++处理webservice，绝对是主流 好的谢谢

user: user-1
content: gsoap对于c/c++处理webservice，绝对是主流

user: user-0
content: 因为就看到了gsoap，主要想知道一般c写的webservice主流都是用gsoap吗？还有其它选择吗，我怕如果太小众学习成本会很高

user: user-1
content: gsoap完全没问题
user-0 提问: C语言模拟密码输入(回显*),当没有输入内容,按退格键有蜂鸣声,如果有内容按退格键删掉最后那个字符

回复:
user: user-1
content: 引用 3 楼 赵4老师的回复:将所有printf改为cprintf 为什么，不需要吧

user: user-2
content: 将所有printf改为cprintf

user: user-3
content: 楼主，你不实现了么

user: user-4
content: http://www.cplusplus.com/articles/E6vU7k9E/   这里有好多哦。
user-0 提问: c语言中,当局部变量的地址赋给指针时,为什么其生存周期可以延长至整个程序结束

回复:
user: user-1
content: 肯定不行，出了作用域那块地址可能被从新写入其他数据。可以换成new。 int*fun(){         int* k = new int[12];         return k; } 这样把k的地址给出去，想什么时候释放就什么时候释放。

user: user-2
content: 以地原子→以原子

user: user-2
content: 人的肉身是在物理上以地原子的形式存在的, 人的生命周期到了, 这个人的灵魂消失了, 但要注意,销魂, 只是告诉上帝, 这块肉身我不用了, 您老收回去,   但并不代表这堆原子都不存在了,   原子是一直都在的,  通过电子显微镜, 当然可以继续观察到这堆原子.  但它们是什么东西, 就要看上帝有没有把它分配给其它肉身了, 如果没有分配 , 可能是万年不变, 如果被分配了, 那就不知道是什么畜牲了.  楼下的看了不许笑哈！

user: user-3
content: 菩萨保佑吧。

user: user-0
content: 引用 8 楼 xiaohuh421 的回复:变量是在内存中分配的地址保存的,  生命周期到了, 这个变量的内存释放了, 但要注意, 释放, 只是告诉系统, 这块内存我不用了, 你自己收回去,   但并不代表这个地址都不存在了,   这地址是一直都在的,  通过指针, 当然可以继续访问.  但他的值是什么东西, 就要看系统有没有把它分配给其它变量了, 如果没有分配 , 可能是万年不变, 如果被分配了, 那就不知道是什么东西了.  参考下面的代码, 题目中的代码称作代码1,下面的代码称作代码2. 在代码1中,k的内存是动态分配的 在代码2中,a指向的内存也是动态分配的,它的内存的周期是整个程序, 直到遇到free为止 从这个角度来说,代码1中的k的内存也是整个程序. k的内存和a所指向的内存的 不同点在哪呢,应该是 一个在栈里,一个在堆里(写到这 我自己居然懂了)  #include<stdio.h> #include<stdlib.h>  int* fun(){ 	int *p = (int*)malloc(4); 	*p = 12; 	return p; } int main(){ 	int *p = fun(); 	printf("%d\n", *p);  	getchar(); 	free(p); 	return 0; }

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:人的肉身是在物理上以地原子的形式存在的, 人的生命周期到了, 这个人的灵魂消失了, 但要注意,销魂, 只是告诉上帝, 这块肉身我不用了, 您老收回去,   但并不代表这堆原子都不存在了,   原子是一直都在的,  通过电子显微镜, 当然可以继续观察到这堆原子.  但它们是什么东西, 就要看上帝有没有把它分配给其它肉身了, 如果没有分配 , 可能是万年不变, 如果被分配了, 那就不知道是什么畜牲了.  楼下的看了不许笑哈！    我不笑,我赞赞赞呐~~~~~~~~~

user: user-4
content: 变量是在内存中分配的地址保存的,  生命周期到了, 这个变量的内存释放了, 但要注意, 释放, 只是告诉系统, 这块内存我不用了, 你自己收回去,   但并不代表这个地址都不存在了,   这地址是一直都在的,  通过指针, 当然可以继续访问.  但他的值是什么东西, 就要看系统有没有把它分配给其它变量了, 如果没有分配 , 可能是万年不变, 如果被分配了, 那就不知道是什么东西了.

user: user-5
content: 肯定不正规，你都把房子卖了，虽然房子还在那，但你还不时地进去看看，那肯定不合法，只不过，偶尔悄悄地进去没被发现罢了

user: user-0
content: 引用 2 楼 gss861225 的回复:应该是指针指向的地址还没有被其他数据覆盖的缘故吧。我也是这样想的,只是想知道这种写法是不是正规

user: user-6
content: 只能说，有可能能访问，不是一定能访问。

user: user-2
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-7
content: 野指针。。。

user: user-5
content: 不仅可以访问，还可以修改，只不过这种访问是不确定的 局部变量的地址都是在程序自己的堆栈中，当局部变量结束后，只要没有将该局部变量的内存地址给别的变量，其值仍然存在。但如果修改的话，是比较危险的，因为这个内存地址可能给了程序的其它变量，通过指针强行修改的话，可能会引起程序崩溃

user: user-1
content: 应该是指针指向的地址还没有被其他数据覆盖的缘故吧。
user-0 提问: 写一个宏定义函数

回复:
user: user-0
content: 引用 12 楼 adlay 的回复:[quote=引用 10 楼 tzp118 的回复:] [quote=引用 7 楼 adlay 的回复:] [quote=引用 5 楼 tzp118 的回复:] [quote=引用 1 楼 adlay 的回复:] #define EXTERN16BYTE(x)   ((x + 15) / 16 * 16)  可是我如果输入1089，按照您写的这个输出的是1104，可实际上需要输出的是1088[/quote] 你确定你要的是 1088？ 不是补位到 16 的整数倍吗，怎么能减位呢？[/quote]  题目说的是扩展到 临近 的16的整数位啊  临近的[/quote] 是的啊，但是扩展的意思是增加，扩展到临近的就是增加最少的位 你 1089 变成 1088 是减少了，不是增加撒 在实际的图像中，图像一行有 1089 个 BYTE 的数据，你那样扩展成 1088 就丢掉了一个 BYTE 的数据了，是不会允许的 小学语文老师要哭了[/quote]  哦，我明白了，谢谢啊

user: user-1
content: 引用 10 楼 tzp118 的回复:[quote=引用 7 楼 adlay 的回复:] [quote=引用 5 楼 tzp118 的回复:] [quote=引用 1 楼 adlay 的回复:] #define EXTERN16BYTE(x)   ((x + 15) / 16 * 16)  可是我如果输入1089，按照您写的这个输出的是1104，可实际上需要输出的是1088[/quote] 你确定你要的是 1088？ 不是补位到 16 的整数倍吗，怎么能减位呢？[/quote]  题目说的是扩展到 临近 的16的整数位啊  临近的[/quote] 是的啊，但是扩展的意思是增加，扩展到临近的就是增加最少的位 你 1089 变成 1088 是减少了，不是增加撒 在实际的图像中，图像一行有 1089 个 BYTE 的数据，你那样扩展成 1088 就丢掉了一个 BYTE 的数据了，是不会允许的 小学语文老师要哭了

user: user-2
content: 所谓的临近起码你也得说清楚怎么个概念，比如说差值最小：1089 到 1088 的差值最小，而不是 1104。如果只是按指定位宽对其的话，只能往大不能小。如果要实现 1089 和 1087 都输出 1088 的话，最好还是写个函数。

user: user-3
content: #define EXTEND(value) ((value + 8) >> 4 << 4) 之前那个不符合你的要求，试试这个

user: user-1
content: 引用 7 楼 adlay 的回复:[quote=引用 5 楼 tzp118 的回复:] [quote=引用 1 楼 adlay 的回复:] #define EXTERN16BYTE(x)   ((x + 15) / 16 * 16)  可是我如果输入1089，按照您写的这个输出的是1104，可实际上需要输出的是1088[/quote] 你确定你要的是 1088？ 不是补位到 16 的整数倍吗，怎么能减位呢？[/quote] 如果你不是要 “扩展到临近的16的倍数的整数” 只是想按四舍五入的方式找到临近的 16 的倍数的整数，那把 + 15 改成 + 8 吧

user: user-0
content: 引用 7 楼 adlay 的回复:[quote=引用 5 楼 tzp118 的回复:] [quote=引用 1 楼 adlay 的回复:] #define EXTERN16BYTE(x)   ((x + 15) / 16 * 16)  可是我如果输入1089，按照您写的这个输出的是1104，可实际上需要输出的是1088[/quote] 你确定你要的是 1088？ 不是补位到 16 的整数倍吗，怎么能减位呢？[/quote]  题目说的是扩展到 临近 的16的整数位啊  临近的

user: user-1
content: 引用 5 楼 tzp118 的回复:[quote=引用 1 楼 adlay 的回复:] #define EXTERN16BYTE(x)   ((x + 15) / 16 * 16)  可是我如果输入1089，按照您写的这个输出的是1104，可实际上需要输出的是1088[/quote] 你确定你要的是 1088？ 不是补位到 16 的整数倍吗，怎么能减位呢？

user: user-3
content: #define EXTEND(value) (value % 16 == 0 ? value : ((value >> 4) + 1) << 4)

user: user-0
content: 引用 1 楼 adlay 的回复:#define EXTERN16BYTE(x)   ((x + 15) / 16 * 16)  可是我如果输入1089，按照您写的这个输出的是1104，可实际上需要输出的是1088

user: user-4
content: （x   + 15 ) & ~0xFu

user: user-1
content: 要效率高一点还可以改成 (x + 15) & 0xFFFFFFF0

user: user-4
content: （x   + 15 ) & ~16U

user: user-1
content: #define EXTERN16BYTE(x)   ((x + 15) / 16 * 16)
user-0 提问: C语言中的 ...

回复:
user: user-1
content: 引用 10 楼 iyomumx 的回复:gcc扩展，不是标准 引用To initialize a range of elements to the same value, write `[first ... last] = value'. This is a GNU extension. For example,       int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };  GCC的扩展，VS2013下不合法

user: user-2
content: gcc扩展，不是标准 引用To initialize a range of elements to the same value, write `[first ... last] = value'. This is a GNU extension. For example,       int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

user: user-3
content: 大部分人这样写： char str[64] = { '\0' }; 我一般这样写： char str[64] = { 0 }; 你那种写法没见过，不过真的多余。上面这这两种写法也是全部置零。

user: user-4
content: 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。

user: user-5
content: 指定范围初始化？

user: user-5
content: C99 以及以后的标准？

user: user-0
content: 刚刚试了，确实是合法的

user: user-0
content: 不是伪代码，是dhcp客户端实现的源码里的。。

user: user-6
content: 表示真没见过这样写的，坐等大神回复

user: user-7
content: 这不是伪代码吗?为什么不自己在编译器上验证一下呢. 看书的时候要从前言看起,里面会有一些代码约定.

user: user-8
content: 这不会是伪代码吧，我从来都没见过
user-0 提问: C语言程序

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 同意一楼，楼主懂了吗？

user: user-3
content: a=077是8进制，即10进制的63，即16进制的0x3F，也即2进制的00111111 3的2进制提0x00000011。 b=a&3; 按位与： 00111111 00000011 ————— 00000011 结果b就是3。  然后b&=7，即b=b&7： 00000011 00000111 ————— 00000011 b还是3.
user-0 提问: 求组啊！帮帮我，我实在想不明白，为什么字符串会改变啊！怎么改都会变。帮帮忙。

回复:
user: user-0
content: 我知道是strtok改变了源字符串。 我已经知道是怎么回事了。没复制正确。谢谢了。

user: user-1
content: http://www.cnblogs.com/cobbliu/p/3393177.html  strtok改变了你的字符串！
user-0 提问: 关于宏定义大神啊

回复:
user: user-1
content: 如果 已经 #define 为宏了 或者已经是类型名，变量名，常量名，或者函数名了， 则#ifndef  为假，否为为真

user: user-2
content: 一定是定义过

user: user-3
content: 这样的写法保证此处 a 被定义，而且不会重复定义。

user: user-4
content: 意思是 如果没有定义a 那么就定义a  所以，最终定义了a

user: user-5
content: 引用 楼主 yff12321 的回复:#ifndef a     #define a  #endif 那么a有没有被宏定义过啊？是没有吗  肯定定义过，假如#ifndef a之前没有定义过a，那么这句话为真，则会执行 #define a，那就定义了a

user: user-6
content: #ifdef
user-0 提问: win7 64位驱动，编译后加载不成功

回复:
user: user-1
content: 用WDK的人应该不算多，当初我也只是跟着例子模仿过，当初加载驱动都是用EzDriverInstaller，用DebugView看调试信息，使用VS2008编译，编译后能成功加载。建议你找个办法检测驱动文件的正确性，并且加载失败是否有相关错误码
user-0 提问: C语言递归问题求助

回复:
user: user-1
content: 入栈的就是 临时变量 = n * 返回值

user: user-2
content: 需要把调用该函数的后面那条指令的地址入栈 第二次以后是把n*fact(n-1);入栈，即递归结束后，接着执行乘法操作；你得把所有计算操作拆成原子操作，看看程序的汇编代码就知道了

user: user-3
content: 按照你的逻辑，当然就是本次计算完fact之后的返回语句了，每次递归时都将返回语句压栈，然后再一层层返回

user: user-4
content: 1) 返回地址入栈没错,c=2指令对应的地址入栈,不是指令本身 2) return (n * fact(n - 1))换一下写法 int t =fac(n-1); return n*t; 这就是你要的下一条指令的地址 如果只是学递归,没必要深究这个的,
user-0 提问: c语言求助，有关 学生成绩管理系统

回复:
user: user-1
content: 自己百度，又不难写

user: user-2
content: 为什么要将平时成绩、期中成绩、期末成绩又定义一个结构体呢？

user: user-0
content: 其实是我不知道怎么用文件分类保存

user: user-0
content: struct student //结构体 { 	char name[20]; //姓名 	char number[20]; //学号 	char sex[2];//性别  	struct score 	{ 		double pinshi; //平时成绩      	double qizhong; //期中成绩     	double qimo; //期末成绩 	}score[5]; }s[60];  可以这么编吗，如果可以的话，那要肿么赋值诶

user: user-3
content: 百度学生信息管理系统C语言源码啊，挺多的，找找看吧。

user: user-0
content: 额额就是每门成绩又分别存有学生某门课的平时成绩、期中成绩和期末成绩，这个这个真心不太会啊

user: user-0
content: 大神们，我百度过了，然后自己也有做一份，但是实在是不造怎么把学生信息、课程信息和学生选课成绩信息这几个结合到一块，求解答

user: user-4
content: 一看就是课程设计，现在帮你实现了源码，不是在帮你……好好学习
user-0 提问: C语言 栈的问题求教

回复:
user: user-1
content: int DestroyStack(pLStack pLS) 这个函数不能改变pLS, 需要改为二级指针 如 int DestroyStack(pLStack *ppLS) {  *ppLS =NULL; } 这样, 如果是C++,改成引用 pLStack &pLS

user: user-0
content: 主函数中测试如下：	 pLStack pLS; InitLStack(&pLS); ... .... DestroyStack(pLS); if(StackEmpty(pLS)) { 	printf(" 栈空\n"); }  没有在StackEmpty(pLS)函数中，出现但是没有出现      printf("栈不存在!" );      ？？ 调试过，但是不懂为什么？？
user-0 提问: 求指导，照着PPT上做怎么

回复:
user: user-1
content: #include<stdio.h> void sort(int a[],int n) {  int i,j,t;    for(i=0;i<n-1;i++)    for(j=i+1;j<n;j++)    if(a[i]>a[j]) {        t=a[i];       a[i]=a[j];       a[j]=t;}	 } main() { int x[5],i; for(i=0;i<5;i++)  scanf("%d",&x[i]); sort(x,5); for(i=0;i<5;i++)  printf("%4d",x[i]); } 暂没有发现其他问题~

user: user-2
content: 1、{t=a[i];a[i]=a[j];a[j]=t}; 改为 {t=a[i];a[i]=a[j];a[j]=t;} 分号在大括号内 2、sort(x[],5); 改为 sort(x,5);
user-0 提问: 为何不能定义两个指针?

回复:
user: user-1
content: 看变量的内存地址是要加上 & 来取址。

user: user-2
content: 11楼说的有理

user: user-3
content: 指针未初始化，内容是随机值的，说不定指到哪里去了

user: user-4
content: 你就记住，指针必须被初始化 ----- NULL 或者 你直接用你定义的别的数据的地址 初始化   否则，这个指针的行为就是“未定义”的  如果此时这个指针指向了那些不允许显示的地址空间   就会报错  所以纠结为什么第一个可以第二个不行 是无意义的

user: user-5
content: 指针未赋初值， 指向未知位置， 内容随机。

user: user-6
content: #include <stdio.h> int main() {         int *i;         int *j;         printf("%p, %p\n", i, j);         return 0; }  楼主的的指针变量只是定义了，而没有初始化 我在VS2010上试了下：编译会警告，调试会出错，截图如下：

user: user-7
content: #include <stdio.h>  int main(void) {     /* i和j指针没有初始化是没有意义的 */     int* i;     int* j;     /* 可以这样初始化指针 */     int a = 2;     int* k = &a;     /* 也可以这样初始化指针 */     int* m = (int*)malloc(sizeof(int));     *m = 5;     printf("%p, %p\n", i, j);     printf("%p, %p\n", k, m);     printf("%d, %d\n", *k, *m);     /* 释放指针 */     if(m != NULL)     {         free(m);     }     return 0; }

user: user-8
content: 没有初始化的指针，值是随机的

user: user-9
content: 没有初始化的指针 内容是随机的

user: user-0
content: 引用 2 楼 user-10的回复:你只是定义一个指针，而没有对指针的值初始化，所以它可以是零值，也可以是任何值。 谢谢，理解了，不过为什么总是最后一个初始化成0

user: user-10
content: 你只是定义一个指针，而没有对指针的值初始化，所以它可以是零值，也可以是任何值。

user: user-0
content: 变成3个: #include <stdio.h>  int main() {         int *i;         int *j;         int *k;         printf("%p, %p, %p\n", i, j, k);         return 0; } 结果: 0x400440, 0x7fff208a9a70, (nil)
user-0 提问: 看不懂的指针，求大神解答

回复:
user: user-1
content: //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: 上面的三位也说明的比较好了，这个就是一个函数指针，函数指针是存放的的某个函数地址的。这个一般在程序运行调用的时候会比较常用，因为调用某个函数其实就是要调到对应函数所在的内存地址。而这个地址就放在函数指针里。  flashi_nor_device * (*probe_fcn) (volatile word *probe_addr);  //这种方法是定义一个函数指针：返回值是flashi_nor_device *类型，并且参数是volatile word *这种类型的变量； typedef  flashi_nor_device * (*probe_fcn) (volatile word *probe_addr);    //这是定义一个函数指针类型~即probe_fcn就是一个指针函数类型，你可以通过probe_fcn定义上述的指针变量。

user: user-3
content: 指向指针函数的函数指针，说白了，它是个指针，只不过它指向的是一个函数，而这个函数的返回值又是一个指针

user: user-4
content: flashi_nor_device * (*probe_fcn) (volatile word *probe_addr);  先把(*probe_fcn)  当作   funA 就是 flashi_nor_device * funA (volatile word *probe_addr);  这样子就认识了吧  而先把(*probe_fcn) 就是指针取值，probe_fcn是个函数指针。对于函数指针，可以去百度查查，到底是个什么东西就可以了

user: user-5
content: 函数指针  比如  int add(int  a, int  b); int (*p)(int,int) = add;  下面的就是一个函数指针 再如  int * get(char * str)  对应的函数指针就是   int * (*p)(char * )
user-0 提问: 新手请教printf("%t",a[i])输出的为什么是tttt

回复:
user: user-1
content: %t什么玩意

user: user-0
content: 引用 1 楼 user-2 的回复:引用printf("%t",a[i]);  %t ????? 哦，了解了，应该是 printf("%d\t",a[i])

user: user-2
content: 引用printf("%t",a[i]);  %t ?????
user-0 提问: 求解C相关

回复:
user: user-0
content: 感谢各位，明白了

user: user-1
content: 将16进制转成10进制, 除以2,  再转成word *型

user: user-2
content: base 是一个 word 类型的指针

user: user-3
content: & 取地址 高于 除 运算 (int) 类型强转  高于 除 运算 & 和 (int) 的运算结合方向是 从右到左  (int)&stamp_md5_hash/2  即 对stamp_md5_hash 这个变量取地址 ，将地址值强转为 int， 将这个int值 除以 2， 将除以2之后的值，做为一个(word *)指针

user: user-4
content: (int)&stamp_md5_hash 将stamp_md5_hash 地址转换成整型，接着除2取商，然后强制转换成word指针型，赋给base  楼主，你这是要做什么，为何这样操作，很危险
user-0 提问: 一个小小的关于指针的判断题

回复:
user: user-1
content: 合法与不合法全看你前面a、b定义的是什么类型。。。   int** a; int b; *a = &b;   上面这种类型就是合法的

user: user-2
content: 这个要看前面对这两个变量的定义，单单这个语句不能说对和错的

user: user-3
content: 只是不合法，没有错误，只是阅读性差一些

user: user-4
content: 《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！

user: user-5
content: *a=b 表示 a指针所指向的数据,等于b *a=&b 表示 a指针所指向的数据,等于b的地址

user: user-6
content: int main() { 	int* b; 	int**a=&b; 	int c=20; 	*a=&c;     cout<<"a:"<<a<<endl; 	cout<<"*a:"<<*a<<endl; 	cout<<"**a:"<<**a<<endl; 	system("pause"); } 运行一下这个你就明白了

user: user-7
content: int** a = new (int*); b = 000; *a = &b;

user: user-8
content: 修正一下，以免使用未初始化的指针： int * c; int ** a = &c; int b = 0; *a = &b; 结果是将b的地址负值给c

user: user-8
content: int ** a; int b = 0; *a = &b;

user: user-9
content: 你在定义指针并初始化 int b = 0；int * a = &b；  这么写可以！ 如果 你仅仅定义了 指针 int *a；  int b = 0；  *a = &b；  你的a都没有初始化 你用*a 肯定不合法！
user-0 提问: 实在看不懂的函数，指针与数组，求大神讲解

回复:
user: user-0
content: 引用 5 楼 ant2012 的回复:建议楼主对指针的学习一步步来，别上来就一个指向指针函数的函数指针 还有，指针就是一个变量，只不过它和别的变量的区别在于，别的变量存放的是变量类型的数据，它存放的是存放数据的内存地址（因此，所有指针变量的大小都是一样大）  楼主可以理解为，内存就是一排排连续的柜子，每个变量拥若干个柜子，柜子里可能存放的是文件数据（普通变量），也可能存放的是文件所在柜子的编号（指针变量），通过这个编号就能找到文件存放的柜子 感谢感谢

user: user-1
content: 建议楼主对指针的学习一步步来，别上来就一个指向指针函数的函数指针 还有，指针就是一个变量，只不过它和别的变量的区别在于，别的变量存放的是变量类型的数据，它存放的是存放数据的内存地址（因此，所有指针变量的大小都是一样大）  楼主可以理解为，内存就是一排排连续的柜子，每个变量拥若干个柜子，柜子里可能存放的是文件数据（普通变量），也可能存放的是文件所在柜子的编号（指针变量），通过这个编号就能找到文件存放的柜子

user: user-1
content: 引用 3 楼 yff12321 的回复:[quote=引用 1 楼 ant2012 的回复:] 楼主，prPtr = flash_nor_probe_table; 这句代码，你确定能编译通过？  prPtr为ProbeTbl结构体实例的对象，flash_nor_probe_table为包含多个ProbeTbl对象的数组的首地址，地址赋给对象？  应该将 ProbeTbl  prPtr; 改为 ProbeTbl  *prPtr;  //定义一个ProbeTbl类型指针，来承接数组的地址 对了ProbeTbl 不是这么弄的，是还有一个函数 typedef ProbeTbl *ProbeTbl_t; ProbeTbl_t prPtr; 这样合理了吗？[/quote]  这样可以 ProbeTbl_t是一个ProbeTbl的指针类型，声明出的变量即为指针

user: user-0
content: 引用 1 楼 ant2012 的回复:楼主，prPtr = flash_nor_probe_table; 这句代码，你确定能编译通过？  prPtr为ProbeTbl结构体实例的对象，flash_nor_probe_table为包含多个ProbeTbl对象的数组的首地址，地址赋给对象？  应该将 ProbeTbl  prPtr; 改为 ProbeTbl  *prPtr;  //定义一个ProbeTbl类型指针，来承接数组的地址 对了ProbeTbl 不是这么弄的，是还有一个函数 typedef ProbeTbl *ProbeTbl_t; ProbeTbl_t prPtr; 这样合理了吗？

user: user-0
content: 引用 1 楼 ant2012 的回复:楼主，prPtr = flash_nor_probe_table; 这句代码，你确定能编译通过？  prPtr为ProbeTbl结构体实例的对象，flash_nor_probe_table为包含多个ProbeTbl对象的数组的首地址，地址赋给对象？  应该将 ProbeTbl  prPtr; 改为 ProbeTbl  *prPtr;  //定义一个ProbeTbl类型指针，来承接数组的地址 会不会因为prPtr是结构体变量，而结构体的成员都是指针类型的所以默认prPtr也是指针类型的呢

user: user-1
content: 楼主，prPtr = flash_nor_probe_table; 这句代码，你确定能编译通过？  prPtr为ProbeTbl结构体实例的对象，flash_nor_probe_table为包含多个ProbeTbl对象的数组的首地址，地址赋给对象？  应该将 ProbeTbl  prPtr; 改为 ProbeTbl  *prPtr;  //定义一个ProbeTbl类型指针，来承接数组的地址
user-0 提问: xcode 编程出现问题

回复:
user: user-1
content: 引用 6 楼 qq_21362051 的回复:非常感谢，成功了，能不能给我讲下这个原理，我是菜鸟，求解，谢谢兄弟 饿，原理； 头文件的意义，就是重用，你两个.c文件都引用了那个头文件，编译的时候，两个.c编译为.o，里面都会有amount  accountBalance这两个变量的定义呢，且都是全局变量，所以在链接的时候会报 符号重复定义的错误"ld: 2 duplicate symbols for architecture x86_64"  这种错误，在c++等其他面向对象语言中一般不会发生， 你这里，因为两个.c应该是想要访问同一个变量amount；那么实际定义这个变量也就是申请其内存的地方只要一个就可以， 所以在头文件的定义中加上extern修饰(extern详情自己百度下吧)，这样所以通过transactions.h访问这俩变量的都是需要在链接的时候查找变量实际定义的，也就是transactions.c中没有加extern的 定义；

user: user-0
content: 是不是一个变量在别处定义的，在另一个文件就得在前加上extern？

user: user-0
content: 非常感谢，成功了，能不能给我讲下这个原理，我是菜鸟，求解，谢谢兄弟

user: user-1
content: amount  accountBalance 两个变量； transactions.h头文件中将变量定义 float 前面加上extern

user: user-0
content: 这个是main.c #include "transactions.h"  int main(void) {     initializeAccount();     getBalance();     //Perform first transaction     askCustomer();     updateAccount(amount);     getBalance();     //Perform second transaction     askCustomer();     updateAccount(amount);     addGift(5.0);     getBalance();     //Perform third transaction     askCustomer();     updateAccount(amount);     addGift(2.0);     getBalance();     thankYou();     return EXIT_SUCCESS; } 这个是transactions.c #include <stdio.h> #include <stdlib.h>  float accountBalance, amount; void initializeAccount(void){     accountBalance = 0.0; }  void addGift(float giftAmount){     accountBalance += giftAmount;     printf("Congratulations! A gift of $%.2f has been added to your account\n",giftAmount); } void askCustomer(void){     printf("Next transaction please...\n");     printf("Enter amount to credit (positive) or debit (negative):");     scanf("%f",&amount); }  void getBalance(void){     printf("\nThe current balance in the account is $%.2f\n", accountBalance); }  void updateAccount(float amount){     accountBalance += amount;     printf("The account was updated with $%.2f\n",amount); }  void thankYou(void){     printf("------  Thank you!  ------"); } 这个是transactions.h #include <stdio.h> #include <stdlib.h> #ifndef TRANSACTIONS_H_ #define TRANSACTIONS_H_ float accountBalance, amount;  void initializeAccount(); void getBalance(void); void askCustomer(void); void updateAccount(float value); void addGift(float giftAmount); void thankYou(void);  #endif /* TRANSACTIONS_H_ */  代码是从教学视频上的，应该没问题

user: user-1
content: 符号重定义，贴出你的代码

user: user-0
content: 重建了还是不好使啊

user: user-2
content: 重建所有
user-0 提问: KMP算法  完全看不懂唉

回复:
user: user-1
content: 静下心好好分析

user: user-2
content: http://blog.csdn.net/yutianzuijin/article/details/11954939 这个建议楼主仔细看看   说的还是比较清楚的

user: user-3
content: 求子串的Next数组 void getNext(char *str, int *next) { 	assert(str != NULL && next != NULL);  	int size = strlen(str); 	if(size == 0) 		return;  	int i = 0; 	int k = -1; 	next[0] = -1;  	while(i < size - 1) 	{ 		if(k == -1 || str[i] == str[k]) 		{ 			i++; 			k++; 			if(str[i] == str[k]) 			{ 				next[i] = next[k]; 			} 			else 			{ 				next[i] = k; 			} 		} 		else 		{ 			k = next[k]; 		} 	} }
user-0 提问: 新手求助   程序可以编译 但是无法运行

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 谢谢，谢谢。感谢你们

user: user-2
content: #include <stdio.h> //此函数判断质数 int prim(int u) { int i;     int prim = 1;  for (i = 0; i < u; i++)   // i不能为0 if ( u%i == 0 )  prim = 0;  return prim;  }     int main ()  {  	int u;  	int Pirm;  	  	scanf ("%d", &u );  	  	Pirm = prim(u);  	  	if ( Pirm == 1)  	 printf ("True");  	else  	 printf ("False");  	  	return 0;   }

user: user-3
content: 引用 楼主 kqsz127 的回复:#include <stdio.h> //此函数判断质数 int prim(int u) { 	int i;     int prim = 1; 	 	for (i = 0; i < u; i++) 		if ( u%i == 0 )    ----------------> 这个地方0做除数了 			prim = 0; 		 	return prim;  }     int main ()  {  	int u;  	int Pirm;  	  	scanf ("%d", &u );  	  	Pirm = prim(u);  	  	if ( Pirm == 1)  		printf ("True");  	else  		printf ("False");  		  	return 0;   } 1.prime函数写的有问题 2.程序结束前，没有getchar，运行完直接退出

user: user-4
content: 显示的啥错误？

user: user-0
content: 没用 value返回255

user: user-5
content: int main ()   {    int u;    int Pirm;        scanf ("%d", &u );        Pirm = prim(u);        if ( Pirm == 1)    printf ("True");    else    printf ("False");    getchar();     //试试这个    return 0;    }

user: user-6
content: 请汇报给微软！

user: user-0
content: 运行之后（win10系统）显示出现问题，导致程序停止正常工作

user: user-1
content: 在IDE中按F11键运行。

user: user-0
content: 没有啊，没有360； 而且其他的程序可以编译

user: user-1
content: 关闭UAC、防火墙、杀毒软件、……
user-0 提问: C语言的函数如何返回二维数组，并获取返回的二维数组大小

回复:
user: user-1
content: 你加两个参数（定义为指针或引用）用来返回数组的宽度和维数不就行了

user: user-1
content: 引用 2 楼 taoweiji2008 的回复:[quote=引用 1 楼 ant2012 的回复:] 你加两个参数（定义为指针或引用）用来返回数组的宽度和维数不就行了 我是从java过来的，不怎么会写C，希望你能够帮帮忙翻译一下。[/quote]  int** getInfo(int* height, int* length) { 	*height = 10; 	*length = 20; 	int **pp = (int**)malloc(*height * sizeof(int*)); 	for(int i = 0; i < *height; i++) 	{ 		pp[i] = (int*)malloc(*length * sizeof(int)); 	} 	return pp; }  int main() { 	int i, height, length; 	int** result = getInfo(&height, &length); 	printf("结果长度：%d\n", height); 	for(i = 0; i < height; i++) 	{ 		for(int j = 0; j < length; j++) 		{ 			printf("%d\n", result[i][j]); 		} 	} 	for(i = 0; i < height; i++) 	{ 		free(result[i]); 	} 	free(result); 	result = NULL; 	return 0; }

user: user-2
content: C语言没有JAVA那么灵活，像你的这个例子，如果用C语言实现还是很麻烦的，需要注意这几方面： 1、数组指针的传递； 2、数组的两个维度需要用单独的变量记录； 3、C语言动态申请的内存需要手动释放，而且动态二维数组的申请释放比较特殊；  因为这么搞比较麻烦，所以C语言一般不这么搞， 如果你的二维数组不大，还不如直接定义成全局变量。 没必要为了灵活，折腾死自己，写着费劲，也难以维护。  另外你的JAVA代码有一处似乎有问题，第二个for循环应该不能用result.length，而应该用result[0].length吧：  for (int j = 0; j < result[0].length; j++)

user: user-0
content: 引用 1 楼 ant2012 的回复:你加两个参数（定义为指针或引用）用来返回数组的宽度和维数不就行了 我是从java过来的，不怎么会写C，希望你能够帮帮忙翻译一下。
user-0 提问: array[0]+i 和 array[0]+1 怎么理解？

回复:
user: user-0
content: 引用 1 楼 ant2012 的回复:大哥，你在逗我么？ i是变量，1是常量 当然会出现这个结果了  散了吧…… a[0]  == 0, a[1]  == 1…… 原数组值特殊。一直误以为遍历了数组输出的，其实都是i的值。

user: user-1
content: 大哥，你在逗我么？ i是变量，1是常量 当然会出现这个结果了
user-0 提问: 读取文件提示null pointer assignment

回复:
user: user-1
content: #include <stdio.h> #include <dos.h> #include <stdlib.h>   typedef struct _goods { float price; int id;//编号 int leftnum;//剩余存量 int soldnum;//销售量 int income;//销售额 }GOODSINFO;   #define goodspath "c:\\goods.dat" #define GOODS 12  void goodsinit(GOODSINFO *);  int main() { GOODSINFO ps[GOODS] = {0};//原始货物信息 GOODSINFO pg[GOODS] = {0};//用于接收和显示货物信息 FILE *fp = NULL; int i = 0;  goodsinit(ps); //货物信息初始化  //货物信息写入 if ((fp=fopen(goodspath, "w")) == NULL) { printf("write file error"); exit(1); } for(i = 0; i < 10000; i++); //将货物信息写入文件 fwrite(ps, sizeof(GOODSINFO), GOODS, fp); //回溯指针 //	rewind(fp); //关闭文件 fclose(fp);  //读取货物信息 if ((fp=fopen(goodspath, "r")) == NULL) { printf("load file error"); exit(1); } //从文件读取货物信息 fread(pg, sizeof(GOODSINFO), GOODS, fp); //关闭文件 fclose(fp);  printf("%f", pg[0].price);  return 0; }   void goodsinit(GOODSINFO *pg) { int i = 0;  for (i=0 ; i<GOODS ; i++) { (pg + i)->id = i + 1; (pg + i)->leftnum = 50; (pg + i)->soldnum = 0; (pg + i)->income = 0; }  (pg + 0)->price = 2.5; (pg + 1)->price = 3.0; (pg + 2)->price = 2.5; (pg + 3)->price = 3.0; (pg + 4)->price = 3.5; (pg + 5)->price = 2.5; (pg + 6)->price = 3.0; (pg + 7)->price = 4.0; (pg + 8)->price = 2.5; (pg + 9)->price = 2.5; (pg + 10)->price = 5.0; (pg + 11)->price = 3.0;   }

user: user-0
content: 引用 1 楼 user-1 的回复: #include <stdio.h> #include <dos.h> #include <stdlib.h>   typedef struct _goods { float price; int id;//编号 int leftnum;//剩余存量 int soldnum;//销售量 int income;//销售额 }GOODSINFO;   #define goodspath "c:\\goods.dat" #define GOODS 12  void goodsinit(GOODSINFO *);  int main() { GOODSINFO ps[GOODS] = {0};//原始货物信息 GOODSINFO pg[GOODS] = {0};//用于接收和显示货物信息 FILE *fp = NULL; int i = 0;  goodsinit(ps); //货物信息初始化  //货物信息写入 if ((fp=fopen(goodspath, "w")) == NULL) { printf("write file error"); exit(1); } for(i = 0; i < 10000; i++); //将货物信息写入文件 fwrite(ps, sizeof(GOODSINFO), GOODS, fp); //回溯指针 //	rewind(fp); //关闭文件 fclose(fp);  //读取货物信息 if ((fp=fopen(goodspath, "r")) == NULL) { printf("load file error"); exit(1); } //从文件读取货物信息 fread(pg, sizeof(GOODSINFO), GOODS, fp); //关闭文件 fclose(fp);  printf("%f", pg[0].price);  return 0; }   void goodsinit(GOODSINFO *pg) { int i = 0;  for (i=0 ; i<GOODS ; i++) { (pg + i)->id = i + 1; (pg + i)->leftnum = 50; (pg + i)->soldnum = 0; (pg + i)->income = 0; }  (pg + 0)->price = 2.5; (pg + 1)->price = 3.0; (pg + 2)->price = 2.5; (pg + 3)->price = 3.0; (pg + 4)->price = 3.5; (pg + 5)->price = 2.5; (pg + 6)->price = 3.0; (pg + 7)->price = 4.0; (pg + 8)->price = 2.5; (pg + 9)->price = 2.5; (pg + 10)->price = 5.0; (pg + 11)->price = 3.0;   }   知道哪里错了，多谢！
user-0 提问: 关于用Visual Studio 2015写C语言遇到的问题~

回复:
user: user-1
content: scanf()报错是确确实实的  _CRT_SECURE_NO_DEPRECATE  或  _CRT_SECURE_NO_WARNINGS  可以修正。  偶尔在main()函数下出现“未声明的局部变量”是怎么回事呢

user: user-2
content: #pragma warning(disable:4996) ...

user: user-3
content: 引用 1 楼 cjqpker 的回复:其实问题不是出在Visual Studio 2015上，而是出在其所使用的编译器上。scanf报错不至于，顶多给警告。 需要注意额事项太繁杂了，不如好好再翻一本C语言的书。 平时遇到的问题，注意积累，多半这些问题，编译器都会提醒你的 默认情况下，scanf之类不安全的函数，直接给错误。

user: user-3
content: 看报错 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. 工程中定义宏 _CRT_SECURE_NO_WARNINGS.即可继续使用scanf

user: user-4
content: 搞不好人家的level设置是将警告作为错误。 引用 1 楼 cjqpker 的回复:其实问题不是出在Visual Studio 2015上，而是出在其所使用的编译器上。scanf报错不至于，顶多给警告。 需要注意额事项太繁杂了，不如好好再翻一本C语言的书。 平时遇到的问题，注意积累，多半这些问题，编译器都会提醒你的

user: user-5
content: 楼上说的很对

user: user-6
content: 其实问题不是出在Visual Studio 2015上，而是出在其所使用的编译器上。scanf报错不至于，顶多给警告。 需要注意额事项太繁杂了，不如好好再翻一本C语言的书。 平时遇到的问题，注意积累，多半这些问题，编译器都会提醒你的
user-0 提问: 函数参数的问题

回复:
user: user-1
content: 1.为什么传给getlines函数的参数p地址为0? 调用时参数写错了 2.函数的参数跟外部的变量重名,在函数内是对哪个进行操作? 重写程序不要让函数的参数跟外部的变量重名 3.如果自定义的函数和标准库里的函数重名,调用的是哪个?和参数有关系吗? 重写程序不要让自定义的函数和标准库里的函数重名

user: user-2
content: 1.为什么传给getlines函数的参数p地址为0?  这个得看该函数的定义了  2.函数的参数跟外部的变量重名,在函数内是对哪个进行操作?  用的是参数  3.如果自定义的函数和标准库里的函数重名,调用的是哪个?和参数有关系吗? 如果是C++的话，有重载机制，如果参数都一样的话，自定义的会将库函数覆盖

user: user-0
content: 引用 3 楼 ant2012 的回复:1.为什么传给getlines函数的参数p地址为0?  这个得看该函数的定义了 函数原型:int readlines(char *lineptr[], int maxlines);                 int getlines(char *p, int lim); 执行了下面两句: readlines (lineptr=0x601080 <lineptr>, maxlines=5000) at textsort.c:30 30	int len, nlines = 0; (gdb)  31	while((len = getlines(lineptr[nlines], MAXLEN)) > 0){ (gdb)  getlines (p=0x0, lim=100) at textsort.c:51  为什么传给指针p的地址是0啊?

user: user-0
content: 引用 1 楼 ashi198866 的回复:lineptr是一个指针数组，也没有看到你给里面的元素分配空间啊这样写不就是已经定义了一个指针数组啊?不是分配空间了啊,所以 " readlines (lineptr=0x601080 <lineptr>, maxlines=5000) "  这里有地址啊.

user: user-3
content: lineptr是一个指针数组，也没有看到你给里面的元素分配空间啊
user-0 提问: 三段代码的编译问题

回复:
user: user-1
content: bc++3.1 http://download.csdn.net/source/2805028

user: user-2
content: #include <graphics.h> 应该是TC下的图形库

user: user-3
content: 问题应该在于  setPixel 这个函数未定义吧，我猜

user: user-4
content: lz贴一下错误信息吧

user: user-5
content: #include 'device. h"， 应该为双引号  另外楼主，能把编译错误信息贴一下么
user-0 提问:    菜鸟入门

回复:
user: user-1
content: 应该是软件的问题，在我的vc6.0编译没问题

user: user-0
content: # include <stdio.h>  int main (void) {     float score;  	printf (“请输入您的成绩:\n”); 	scanf (“f%\n”, &score);  	if (score>100) 		printf (“这是在做梦！\n”); 	else if (score>=90 && score<100) 		printf (“优秀!\n”); 	else if (score>=80 && score<90) 		printf (“良好!\n”); 	else if (score>=60 && score<80) 		printf (“合格!\n”); 	else if (score>=0 && score<60) 		printf (“your没有及格!\n”); 	else 	    printf (“成绩太低无法统计!\n”); 		 	return 0; }

user: user-1
content: 引用 11 楼 qq_30797775 的回复:那冒昧的问一下你用的那个？或者说您觉得那个号用  vc6.0比较小，而且不用在调试时加system("pause")，比较方便，但其不支持一些新C++标准，如不支持long long 型，不能在vecotr中嵌套vector，不完全支持友元 vs比较新，功能全，就是软件大

user: user-2
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-0
content: 那冒昧的问一下你用的那个？或者说您觉得那个号用

user: user-1
content: vc6.0完整版，或者用vs

user: user-0
content: 哦，谢谢，有没有好点的版本给我推荐

user: user-3
content: 引用 6 楼 qq_30797775 的回复:# include <stdio.h>  int main (void) {     float score;  	printf (“请输入您的成绩:\n”);                  /*双引号必须是英文的*/ 	scanf (“f%\n”, &score);   /*应该是%f */     /*另外输入框不要加个\n，否则要多输入一行*/      	if (score>100) 		printf (“这是在做梦！\n”);             /*双引号*/ 	else if (score>=90 && score<100)    /*这里漏掉100分数*/ 		printf (“优秀!\n”);                           /*..........双引号..............*/ 	else if (score>=80 && score<90)    		printf (“良好!\n”);                           /*..........双引号..............*/ 	else if (score>=60 && score<80) 		printf (“合格!\n”);                              /*..........双引号..............*/ 	else if (score>=0 && score<60) 		printf (“your没有及格!\n”);                /*..........双引号..............*/ 	else 	    printf (“成绩太低无法统计!\n”);           /*..........双引号..............*/ 		 	return 0; } 改完之后的是这样的： # include <stdio.h> int main (void) {     float score; printf ("请输入您的成绩:\n"); scanf ("%f", &score);    if (score>100) printf ("这是在做梦！\n"); else if (score>=90 && score<=100) printf ("优秀!\n"); else if (score>=80 && score<90) printf ("良好!\n"); else if (score>=60 && score<80) printf ("合格!\n"); else if (score>=0 && score<60) printf ("your没有及格!\n"); else     printf ("成绩太低无法统计!\n"); return 0; } 另外劝一句不要用绿色版的了，我吃了两次绿色版的苦。

user: user-1
content: 贴一下完整代码

user: user-0
content: 不会，我才学了一点，想练练手。但是总是编译出错

user: user-1
content: 楼主，你会不会双引号写成单引号了，贴下代码

user: user-1
content: 楼主，你会不会双引号写成单引号了，贴下代码

user: user-4
content: 印象中VC6不支持中文路径，但没用过绿色版。把路径改成全英文试试。 另外，如果想好好学一下C的话，建议还是正儿八经装个版本高一点的吧，比如vs2010， VC6毕竟有点太老了。
user-0 提问: C语言菜鸟求助

回复:
user: user-1
content: double per,n; 	int sum=0; 	printf("Please input n:\n"); 	scanf("%lf",&n); 	if(n<=5) 	{per=(1-(n-1)/100)*10;sum=per*n;} 	else if(n<=20) 	{per=(1-(4+(n-5)*0.4)/100)*10;sum=per*n;} 	else if(n<=50) 	{per=(1-(10+(n-20)*0.15)/100)*10;sum=per*n;} 	else if(n<=300) 	{per=(1-(14.5+(n-50)*0.03)/100)*10;sum=per*n;} 	else 	{per=(1-(4+(n-5)*0.4)/100)*10;sum=per*n;} 	printf("sum=%d,per=%lf\n",sum,per);

user: user-1
content: 楼主，你的数学是谁教的呢 优惠x%，你在计算单价的时候，有没有除100，然后再用1 - 优惠率，然后在乘以原价呢

user: user-0
content: 编程时脑子太累，小晕而已，何必与他人相关联！ 从你的话语中，可以看出，你喜欢东扯西扯，德行不是很高。

user: user-0
content: 谢谢ant2012.。

user: user-0
content: 编程时脑子太累，小晕而已，何必与他人相关联！ 而且，这个真不是纯粹的数学问题，即使按我的程序运转，最后检查时无错误，显示时却出现极其离谱的数（无论输什么都是几十位数）请理解透计算机原理问题再准确回答，谢谢！

user: user-0
content: sum改成double还不行。哪位能帮着把程序改一下。谢谢！

user: user-0
content: sum改成double还不行。哪位能帮着把程序改一下。

user: user-2
content: sum 用double

user: user-0
content: 按各位指点的改了一下，还不行。请各位再帮忙看一下。 #include<stdio.h> void main() { double per,n; int sum=0; printf("Please input n:\n"); scanf("%If",&n); if(n<=5) {per=(1-(n-1)/100)*10;sum=per*n;} else if(n<=20) {per=4+(n-5)*0.4;sum=per*n;} else if(n<=50) {per=10+(n-20)*0.15;sum=per*n;} else if(n<=300) {per=14.5+(n-50)*0.03;sum=per*n;} else {per=10*(1-0.22);sum=per*n;} printf("sum=%d,per=%10f",sum,per) }

user: user-0
content: 按各位指点的改了一下，还不行。请各位再帮忙看一下。 #include<stdio.h> void main() { 	double per,n; 	int sum=0; 	printf("Please input n:\n"); 	scanf("%If",&n); 	if(n<=5) 	{per=(1-(n-1)/100)*10;sum=per*n;} 	else if(n<=20) 	{per=4+(n-5)*0.4;sum=per*n;} 	else if(n<=50) 	{per=10+(n-20)*0.15;sum=per*n;} 	else if(n<=300) 	{per=14.5+(n-50)*0.03;sum=per*n;} 	else 	{per=10*(1-0.22);sum=per*n;} 	printf("sum=%d,per=%10f",sum,per)

user: user-3
content: 输入double型数据时要用%lf

user: user-4
content: 另外根据你给的公式感觉300件以上老板略亏呀，优惠了100%+

user: user-4
content: scanf()里用%lf格式，最后的else里面怎么不是按公式写的？最后算sum怎么不用乘单价？
user-0 提问: 有一条C语言的语句看不懂，请高手帮我开脑洞

回复:
user: user-0
content: #define _INTSIZEOF(n)   ((int)(sizeof(n) +sizeof(nt)-1)/ sizeof(int)) * sizeof(int)) 二楼兄应该要这样写吧? 感谢一楼的，帮我开脑洞. 分数不多，没技术分了，各10分，意思意思。

user: user-1
content: 引用 3 楼 laery 的回复:#define _INTSIZEOF(n)   ((int)(sizeof(n) +sizeof(nt)-1)/ sizeof(int)) * sizeof(int)) 二楼兄应该要这样写吧? 感谢一楼的，帮我开脑洞. 分数不多，没技术分了，各10分，意思意思。 恩。

user: user-1
content: 写成这样的话， 估计你就明白了  #define _INTSIZEOF(n)   (sizeof(n) + sizeof(int) - 1) / sizeof(int)

user: user-2
content: sizeof(int) - 1 = 3，所以一个数 & ~(sizeof(int) - 1)，就是将那个数的最低的三位清0，那么这个数的二进制形式一定变成了xxxxxx000b所以一定是4的倍数。而将这底三位清0有可能将原数减小，最多减小3（清0的那三位原本都是1的情况），所以前面要+(sizeof(int) - 1)。
user-0 提问: Shuffling Machine

回复:
user: user-1
content: 帮结帖＋蹭分

user: user-0
content: 问题已解决，所以还是结帖吧

user: user-0
content: 修正一个地方 for(i=0;i<MAX;i++) {  scanf("%d",&order[i]); } 这部分语句因为我图方便声明oder[]的时候就已经初始化了
user-0 提问: 这个随机数程序为什么输出结果始终确定，能讲一下原理吗？？？

回复:
user: user-1
content: 我来把程序丰富一下，我们来观察一下细节：  #include<stdio.h> #include<stdlib.h> #include<time.h> #define TIMES 6000000   struct T{int key,value;};   void main() {     time_t t;     int i,k1,k2;     struct T a[12]; 	int dice1[6]={0}; 	int dice2[6]={0};      for(i=0;i<12;i++)     {         a[i].key=i+1;         a[i].value=0;     }     srand((unsigned)time(&t));     for(i=0;i<TIMES;i++)     {                   int v=(k1=rand()%6+1)+(k2=rand()%6+1);         a[v-1].value++; 		dice1[k1-1]++; 		dice2[k2-1]++; 	}     for(i=0;i<12;i++)         printf("%2d:%.2f\n",a[i].key,(double)a[i].value/TIMES);      for(i=0;i<6;i++) 		printf("dice1[%d] = %d\n",i+1,dice1[i]);  	for(i=0;i<6;i++) 		printf("dice2[%d] = %d\n",i+1,dice2[i]); }   执行结果：   由此可见，这个程序其实就是个掷骰子的程序，掷两个骰子，掷6000000次，观察骰子值的分布情况。 我的程序新增了对两个骰子单独的值的观察， 可以看到，当次数足够大时，rand函数可以保证每个骰子的值从1到6分布比较均匀， 那么两个骰子的值之和就完全符合正态分布的概率原则了，这是可以用概率的方法算出来的。 不是说随机数程序的结果就一定是随机的，如果是计算概率，那么结果就是确定的。 你可以观察一下，每次执行时a[i].value，每次也都有细微的差别，但是一除以6000000，就被掩盖了。

user: user-2
content: 本来就是大量实验之后结果就趋向某个确定的情况。

user: user-0
content: 引用 2楼user-3 的回复:k的取值为1-11，且每种可能性相同 次数越多，结果就越接近数学概率值它是用的哪个数学公式或模型啊？

user: user-3
content: k的取值为1-11，且每种可能性相同 次数越多，结果就越接近数学概率值
user-0 提问: fseek(fp, 0L, 1) 的疑问

回复:
user: user-1
content: 如果注释掉fwrite函数下面的fseek()函数，程序会死循环  这个问题可能是文件指针有两个，一个写指针，一个读指针，当写数据时，读指针不会动，这样就造成了读一个数据，读指针回到初始位置，而写数据时，读指针不变，这样就死循环了

user: user-1
content: 引用 3 楼 u013351484 的回复:[quote=引用 2 楼 ant2012 的回复:] 如果注释掉fwrite函数下面的fseek()函数，程序会死循环  这个问题可能是文件指针有两个，一个写指针，一个读指针，当写数据时，读指针不会动，这样就造成了读一个数据，读指针回到初始位置，而写数据时，读指针不变，这样就死循环了这样讲的话似乎可以解释地通，但读写文件时指向文件的那个fp指针又分为读指针跟写指针这个又不好理解了，还需要在以后查阅更多资料，谢谢啦~[/quote]  文件指针是用来标记当前读写数据在文件中的位置，至于是否存在读写指针，我也不太清楚，我在用fstream(c++中的文件流类)中有两个seek函数，seekg()和 seekp()，一个是定位读位置，一个是定位写位置

user: user-0
content: 引用 2 楼 ant2012 的回复:如果注释掉fwrite函数下面的fseek()函数，程序会死循环  这个问题可能是文件指针有两个，一个写指针，一个读指针，当写数据时，读指针不会动，这样就造成了读一个数据，读指针回到初始位置，而写数据时，读指针不变，这样就死循环了这样讲的话似乎可以解释地通，但读写文件时指向文件的那个fp指针又分为读指针跟写指针这个又不好理解了，还需要在以后查阅更多资料，谢谢啦~

user: user-1
content: fread((char *)&rec, sizeof(rec), 1, fp) 第一个参数不应该是(record *)&rec吗，为何是(char *)&rec？ 任何指针变量都是一样的，都存放的是内存地址，写成（int*）都行 楼主可以查看fread的函数定义： size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
user-0 提问: 指针作为函数返回值所在的内存区域

回复:
user: user-1
content: p3是指针变量，其指向的是"qwer2"字符常量，p1 = getStr1();时，p3把他的值（字符常量的地址）已经传给了p1，函数执行结束，p3变量释放 p4是数组，其保存了字符常量的内容（不是地址），当执行p2 = getStr2();时，p4仅仅是把p4数组的首地址给了p2，函数执行结束，p4数组被释放，所以p2保存的是一个无效的地址  说白了，p1得到的是字符串常量的地址，百p2得到 的是数组p4的地址，字符串常量的生命周期是整个程序的周期

user: user-2
content: p3是一个指针变量，这个指针变量在栈里，但是他指向的常量字符串不在栈里。
user-0 提问: 使用#ifndef跳过程序代码块的问题

回复:
user: user-0
content: 我明白了，谢谢七楼。

user: user-0
content: 一定要在main{}里面吗，为什么

user: user-1
content: 你的代码段写到了main函数外面，这样是不行的，兄弟。

user: user-0
content: 这是我的程序和出错提示。 #include<stdio.h> #ifndef _SKIP_  #define _SKIP_ 	int a=3;  	int * p=&a; 	printf("a=%d\tp=%p\n",a,p); 	printf("%d\n",*p); #endif void main(void) {         int a=3;         int * p=&a;         printf("a=%d\tp=%p\n",a,p);         printf("%d\n",*p);  	puts("hello,world!");  }  F:\my c project\c file\even.c(16) : error C2143: syntax error : missing ')' before 'string' F:\my c project\c file\even.c(16) : error C2143: syntax error : missing '{' before 'string' F:\my c project\c file\even.c(16) : error C2059: syntax error : '<Unknown>' F:\my c project\c file\even.c(16) : error C2059: syntax error : ')' F:\my c project\c file\even.c(17) : error C2143: syntax error : missing ')' before 'string' F:\my c project\c file\even.c(17) : error C2143: syntax error : missing '{' before 'string' F:\my c project\c file\even.c(17) : error C2059: syntax error : '<Unknown>' F:\my c project\c file\even.c(17) : error C2059: syntax error : ')' Error executing cl.exe.  even.exe - 8 error(s), 0 warning(s)

user: user-0
content: 二楼，好像是这样的，我的情况跟你描述的差不多，就是在跳过的代码块当中有定义局部变量，在#endif之后有使用到，你跳过了局部变量的定义，就导致变量未定义。可是如果不这样，那它是怎么跳过代码块的呢，或者说，它跳过代码块是什么意思？

user: user-1
content: 把编译错误的信息贴上来吧，也可能是编译器的问题。

user: user-1
content: 我写了个小例子，vs2010运行OK，请参考：   #include <stdio.h>  #define _SKIP_  void main() {  #ifndef _SKIP_ 	printf("Should be skipped!\n"); #endif   	printf("Hello World!\n"); }

user: user-2
content: 编译出错 ， 你要把错误信息贴出来  比如可能是你跳过的代码块当中有定义局部变量，在#endif之后有使用到，你跳过了局部变量的定义，就导致变量未定义

user: user-3
content: 编译什么提示？看起来没错的。 另外， 要绝对跳过可以：  #if 0 //  跳过的代码 #endif
user-0 提问: macbook终端上c程序编译后的out文件为何被killed？

回复:
user: user-0
content: 引用 1 楼 stupid_boy2007 的回复:gcc -c 只编译,不生成可执行文件，你应该用: gcc helloworld.c -o helloworld.out ./helloworld.out 现在最新的系统都使用clang了。  我按你说的做了，果然成功了，谢谢。 我记得昨天也生成过.out的，还是被killed，也不显示是是exec文件，今天就显示是exec文件了，不管怎么样，成功就好。谢谢了。

user: user-1
content: gcc -c 只编译,不生成可执行文件，你应该用: gcc helloworld.c -o helloworld.out ./helloworld.out 现在最新的系统都使用clang了。
user-0 提问: C语言求π的值

回复:
user: user-0
content: 引用 10 楼 ant2012 的回复:楼主，你应该是理解错了，直到最后一项的值小于给定阈值，那个小于给定阈值的值也加上，应该就对了嗯嗯，我再试一试！

user: user-1
content: 不过，楼主，当精度过小时，注意整形long越界的问题，long在32位机以上的操作系统占4个字节

user: user-1
content: 楼主，你应该是理解错了，直到最后一项的值小于给定阈值，那个小于给定阈值的值也加上，应该就对了

user: user-0
content: 引用 7 楼 user-2的回复:我是这么认为的：应该是大数吃小数的现象吧，可以考虑用khan's算法，我没验证过，只是想大概是这个原因 没听说过呢！

user: user-0
content: 你的编译运行的结果是什么样子的呢？

user: user-2
content: 我是这么认为的：应该是大数吃小数的现象吧，可以考虑用khan's算法，我没验证过，只是想大概是这个原因

user: user-1
content: 那就不清楚了，也有可能是算法的问题，你自己先用计算器算算

user: user-0
content: 0.01   对应的正确数字应该是     3.132157           但是运行得到的却是   3.121501

user: user-0
content: 错了，是测试数据的答案不一样!

user: user-1
content: 怎么会没有输出呢

user: user-0
content: 怎么没有输出了呢？                            —————————————————————你刚才的解答是正确的！惊醒梦中人！

user: user-1
content: b=b*(b+2);  错了 当b = 3时，b = 3*5没错，可是下一个循环，b = 15了，b = 15 * 17了。 改成 b=b*(i*2+1)
user-0 提问: C语言 内存

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: // 这种方式是禁止使用的 // 在自定义函数中 返回一个在函数中开辟空间的地址 // 因为此时的地址已经被系统销毁掉 char *test(void)  {     // char  name[] = "iPhone";      char * name = "iPhone";  //这样是可行的，想想为什么      printf("name = %p\n", name);      return name;  }

user: user-3
content: 你这是什么问题，请说清楚点吧！
user-0 提问: C语言结果对齐

回复:
user: user-1
content: printf Width Specification The second optional field of the format specification is the width specification. The width argument is a nonnegative decimal integer controlling the minimum number of characters printed. If the number of characters in the output value is less than the specified width, blanks are added to the left or the right of the values — depending on whether the – flag (for left alignment) is specified — until the minimum width is reached. If width is prefixed with 0, zeros are added until the minimum width is reached (not useful for left-aligned numbers).  The width specification never causes a value to be truncated. If the number of characters in the output value is greater than the specified width, or if width is not given, all characters of the value are printed (subject to the precision specification).  If the width specification is an asterisk (*), an int argument from the argument list supplies the value. The width argument must precede the value being formatted in the argument list. A nonexistent or small field width does not cause the truncation of a field; if the result of a conversion is wider than the field width, the field expands to contain the conversion result.  作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-2
content: 这个 tab键的宽度问题， 如果在linux 下，可以考虑用这种方式加大tab 宽度 设置为 4个字符宽度： tabs 4   echo 'tabs 4' >> ~/.profile

user: user-3
content: 在没对齐的地方再加\t就行了，请参考：   #include <stdio.h>  void main() { 	printf("Address\t\tType\tLength\tLength(Total)\tHandle\n"); 	printf("%8.8lX\t%2.2X\t%2.2X\t%4.4X\t\t%4.4X\t\n",0xFADB0,0,0x18,0x4c,0); }   在vs2010上的输出结果为：
user-0 提问: 通信协议

回复:
user: user-1
content: 两个字节的校验码，crc16校验概率比较大

user: user-2
content: #include <stdio.h> unsigned char b[]={'\x0a','\xaa','\xf0','\x00','\x00','\x01','\x05','\x55'}; unsigned short getus(unsigned char *p) {     unsigned short us;     unsigned char *pus;      pus=(unsigned char *)&us;     pus[0]=p[1];     pus[1]=p[0];     return us; } int main() {     printf("%04hx\n",getus(b));     printf("%04hx\n",getus(b+2));     printf("%04hx\n",getus(b+4));     printf("%04hx\n",getus(b)+getus(b+2)+getus(b+4));     printf("%04hx\n",getus(b+6));     printf("%04hx\n",~getus(b+6)+1);     if ((unsigned short)(getus(b)+getus(b+2)+getus(b+4))==(unsigned short)(~getus(b+6)+1)) {         printf("OK\n");     } else {         printf("ERR\n");     }     return 0; } //0aaa //f000 //0001 //faab //0555 //faab //OK //
user-0 提问: c语言中怎样把一个16进制的数直接输出成16进制的结果

回复:
user: user-0
content: 用putchar打印出来可以吗？

user: user-0
content: 引用 1 楼 jerry_dqh 的回复:不打印字符，你想怎么打印，要性能的时候也不能使用printf  打印出来的直接是16进制的结果，就不用字符串的方式打印出来

user: user-1
content: 不打印字符，你想怎么打印，要性能的时候也不能使用printf
user-0 提问: toupper

回复:
user: user-0
content: void upper(char *a) { while(*a) { *a = toupper(*a); a++; } }  这样应该更好

user: user-1
content: int toupper( int c );  参数c为输入变量

user: user-2
content: toupper的返回值是改变之后的值，参数是按值传递，不是引用传递 所以要另一个变量接收其返回的值，而这个变量的值就是变成大写后的值

user: user-3
content: int toupper(int c); // 将传入字符对应的大写字母作为返回值返回，楼主当然需要接收才能看到效果了 a[i] = toupper[i];

user: user-4
content: toupper(a[i]);的返回值才是变大写吧。你返回的值又没有保存起来
user-0 提问: 递归问题

回复:
user: user-0
content: 引用 4 楼 adusuccessfully 的回复:一楼的说的正确，i++，与j--，都是先参与运算，再自增或自减~~~ 从赵四老师的回复学了一招：Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。是这样的,改成++i, --j 可以正确运行. 谢谢各位!

user: user-1
content: 一楼的说的正确，i++，与j--，都是先参与运算，再自增或自减~~~ 从赵四老师的回复学了一招：Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。

user: user-2
content: 后置的++运算符是先用在加。谭浩强的教学还是有点用的。

user: user-3
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-4
content: 应该reverse(s, i+1, j-1);，否则会调用函数i,j才会改变，相当于一直用相同的参数调用函数
user-0 提问: 整数、实数编码问题

回复:
user: user-1
content: 所以 printf 的参数中，float  不是32 Bits，而是64Bits

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-2
content: http://bbs.csdn.net/topics/390676437

user: user-1
content: 输出时，printf  整数： 16Bits,32Bits 系统 32Bits以下整数：   包括 char(8Bits),short int (16Bits),int (32Bits 或者16Bits),long int(32Bits) 32Bits，16 Bits指针 其实也相当于整数 这一类参数 按照 int 长度计算 当 int 为 16 Bits时候， far *,long int 按照 32Bits 传递 否则，一律按照 int （unsigned int）传递   64Bits   超长整数 long long int (64 Bits) 按照64 Bits 传递  而 浮点数，16Bits,32Bits 系统，一般都是先传入浮点寄存器，然后传递到堆栈中（64Bits） 也就是说，其实 float,double 都是先转为 64Bits 浮点数(double)，然后传递

user: user-3
content: 浮点型存储格式和整形不一样，不要在printf中直接用整形格式输出浮点型数据，楼主可看看这个： http://wenku.baidu.com/link?url=L02xDSxpKp2tJSMbxQEvkyb_O_SPlvdwPvbrqULO94MNycea2bnDcpV8gRcDQh78mMTJ1ixYhZc_a84s4VbdPIlJGDwoJBMh-0mK_Vx5Gby
user-0 提问: unsigned char i=0x80;  	printf("0x%x\n", ~i>>3+1);//无符号16进制输出 	 char ci=0x80;  	

回复:
user: user-1
content: 楼主，对数据取返前，会将数据转换成整形，再取反

user: user-2
content: 你自己先确定各个操作符的优先级, 然后手动计算, 注意有符号的情况