Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 这是我编的时钟程序，为什么指针有时会闪烁，我知道应该用双缓冲，但要怎么写啊，请各位大神说一下。。。

回复:
user: user-1
content: 仅供参考：#include <graphics.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dos.h> #include <conio.h> #include <time.h> #include <math.h> time_t t; char timestr1[30];//DDD MMM dd hh:mm:ss YYYY char timestr2[30];//DDD MMM dd hh:mm:ss YYYY char hhmmss[9]; int graphdriver,graphmode,page; int i,xo,yo,r0,r1,r2,r3,r4,r5,r6,r7; int x1,y1,x2,y2; int hh,mm,ss; double c,s; int xasp,yasp; void main() {     xo=60;yo=60;     r0=5; //轴     r1=20;//时针     r2=36;//分针     r3=45;//秒针     r4=50;//时刻度     r5=53;//分刻度     r6=55;//刻度外     r7=59;//表盘     graphdriver=VGA;     graphmode=VGAMED;     initgraph(&graphdriver,&graphmode,"D:\\BC\\BGI");     getaspectratio(&xasp, &yasp);     page=0;     timestr2[0]=0;     while (1) {         if (kbhit()) break;         time(&t);         strcpy(timestr1,ctime(&t));         if (strcmp(timestr1,timestr2)) {             strcpy(timestr2,timestr1);             hh=atoi(timestr2+11);             mm=atoi(timestr2+14);             ss=atoi(timestr2+17);             setvisualpage(page);             setactivepage(1-page);             cleardevice();             sprintf(hhmmss,"%02d:%02d:%02d",hh,mm,ss);             outtextxy(28,0,hhmmss);             pieslice(xo,yo,0,360,r0);             circle(xo,yo,r7);             for (i=0;i<60;i++) {                 c=cos(i*6*3.14159265/180);                 s=sin(i*6*3.14159265/180)*xasp/yasp;                 if (0==(i%5)) {                     x1=xo+r4*c;                     y1=yo+r4*s;                 } else {                     x1=xo+r5*c;                     y1=yo+r5*s;                 } 				x2=xo+r6*c; 				y2=yo+r6*s; 				line(x1,y1,x2,y2); 				if (((hh%12)*5+mm/12+45)%60==i) { 					x2=xo+r1*c; 					y2=yo+r1*s; 					setlinestyle(0,-1,3); 					line(xo,yo,x2,y2); 					setlinestyle(0,-1,1); 				} 				if ((mm+45)%60==i) { 					x2=xo+r2*c; 					y2=yo+r2*s; 					setlinestyle(0,-1,3); 					line(xo,yo,x2,y2); 					setlinestyle(0,-1,1); 				} 				if ((ss+45)%60==i) { 					x2=xo+r3*c; 					y2=yo+r3*s; 					line(xo,yo,x2,y2); 				} 			} 			page=1-page; 		}         delay(100);     }     getch();     closegraph(); }

user: user-2
content: 画图程序闪烁不一定是绘制速度的问题，所以双缓冲不一定能解决闪烁问题，很多闪烁问题可能是由于不断地背景切换造成的，可以从这方面找原因和解决方法

user: user-3
content: "我知道应该用双缓冲，但要怎么写啊" 你这个还真是矛盾呀, 又知道, 又不知道?  双缓冲也就把要绘制的东西先绘制到内存中, 再一次绘制到屏幕上.
user-0 提问: 哪本c语言书比较好一点~~

回复:
user: user-1
content: 比较推荐：《The C prime plus(第五版)》，其他书也不错。不过，这本书比较基础的。

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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-3
content: 推荐C primer plus 这本真的不错

user: user-4
content: c  primer

user: user-5
content: Kenneth和A.Reek的《c和指针》

user: user-6
content: 第一本好点。

user: user-7
content: C primer plus
user-0 提问: 这个应该怎么改？有点转不过来弯。

回复:
user: user-1
content: 因为当输出第一个文件的第一行后，ch1为\n，所以else语句块儿中的while条件一直为假。

user: user-2
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 whlie (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： whlie (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。
user-0 提问: 文思海辉第一届在线编程大赛：单词博弈。我的这么经典居然说错了

回复:
user: user-1
content: 这个题我没做，只简单看了下。 我觉得你的问题应该有两个：1、你要求甲乙两人都只删除最大单增序列以外的字符；2、最大单增序列可能不只一种组合。还有一点，最终一方获胜时，得到的字符串未必是最大单增序列。 比如字符串 baad，最大单增序列 ad、bd。如果甲删掉a或b，则必然乙胜利；而如果删掉d，则甲赢，最终的序列是b或a。

user: user-2
content: 那如果最大有序增长的子序列有2个，并且长度相同，你怎么办

user: user-3
content: 哎，同样郁闷中，测试用例失败。。。

user: user-0
content: 引用 7 楼 u012902350 的回复:思路：自己去掉一个字母后直接获胜，否则去掉一个字母，让对方在回合内无法获胜。直到找到一个递增子序列，求长度=（单词长度-子字符串），长度为奇数，甲胜，长度为偶数，乙胜。不知思路对不对？ 对的，我的思路错了。

user: user-4
content: 思路：自己去掉一个字母后直接获胜，否则去掉一个字母，让对方在回合内无法获胜。直到找到一个递增子序列，求长度=（单词长度-子字符串），长度为奇数，甲胜，长度为偶数，乙胜。不知思路对不对？

user: user-0
content: 引用 5 楼 YouNeverCanTell 的回复:测试失败是什么意思？思路应该是对的，自己验证了几个也没有问题。提示测试用例失败，可能有没有想到的，求大家解决我的疑惑？？

user: user-5
content: 测试失败是什么意思？思路应该是对的，自己验证了几个也没有问题。

user: user-0
content: 引用 3 楼 derekrose 的回复:那一定是题目审核方面你不达标。怎么个审核法啊？求指点啊？我不想死了还不知道为什么！

user: user-6
content: 那一定是题目审核方面你不达标。

user: user-0
content: 引用 1 楼 yfqvip 的回复:对于这种刚发的帖子，我总是毫不犹豫的顶了。如果火了就是个前排，可以混个脸熟，说不定谁好心就给粉了…稳赚不赔；如果沉了就感觉是我弄沉的，很有成就感，还能捞经验。哥哥，你积分那么多，肯定是高手给我这个新手点指点啊，不要磨灭了我的研究激情

user: user-7
content: 对于这种刚发的帖子，我总是毫不犹豫的顶了。如果火了就是个前排，可以混个脸熟，说不定谁好心就给粉了…稳赚不赔；如果沉了就感觉是我弄沉的，很有成就感，还能捞经验。
user-0 提问: 请大神帮忙。。。这是学校的期末课程设计，我是新手，实在不知道怎么改，。

回复:
user: user-1
content: 跟着编译器的错误提示，一点一点修改你的语法错误先。编程人永远都跳不过这一步的。

user: user-2
content: 编译器都跟你说的明明白白

user: user-3
content: 函数声明没有，全是基本语法错误。   那个报错点那个错误。自己动手。搞编程的   没有人能跳过调试和找bug。

user: user-4
content: 为何感觉好高端，我们大1就考试一些简单的题
user-0 提问: 《怎样用c++编程骑士飞行棋,偶是菜鸟级》

回复:
user: user-1
content: http://www.codeforge.cn/s/0/%E9%A3%9E%E8%A1%8C%E6%A3%8B

user: user-2
content: 大一就学习专业课了。  直接就课程设计。
user-0 提问: 自动化编程的都来看看

回复:
user: user-1
content: 有时去执行一个错误的决定总比优柔寡断或者没有决定要好得多。

user: user-2
content: 多了解一下吧，这个方向也不见得不好！如果能够提高C语言的能力，还是可以考虑。当然，你可以再试试其他的面试！

user: user-3
content: 引用 7 楼 xiaolanghh 的回复:恩 面试我的那位师兄就是介绍说是写测试程序，不出意外应该是做芯片测试的吧。请问这个技术性强吗?还有做这个好找工作吗？ 怎么说呢.技术不强. 挺好找工作吧,一大堆的硬件电子公司都与这相关. 具体我也不是很清楚. 反正上面我提到的公司待遇都很好,都是很牛的.

user: user-0
content: 引用 6 楼 Binzo 的回复:NI就是做芯片的公司啊，当然它也开发出了Labview，现在被TI收购了。  这类的公司很多（TI，Analog，Maxin，motor，Freescale，仙童）吧。一般去都是做销售或芯片测试。恩 面试我的那位师兄就是介绍说是写测试程序，不出意外应该是做芯片测试的吧。请问这个技术性强吗?还有做这个好找工作吗？

user: user-4
content: 是相对简单的工作，当然我这个说法是对C语言程序员而言的。在某些人看来，可能巨难。  比如，操纵和收集标准化的高级设备的数据，需要用到SECS协议，这可能需要你写一点代码来调一下标准SECS库。  没什么。

user: user-3
content: NI就是做芯片的公司啊，当然它也开发出了Labview，现在被TI收购了。  这类的公司很多（TI，Analog，Maxin，motor，Freescale，仙童）吧。一般去都是做销售或芯片测试。

user: user-4
content: 引用 3 楼 xiaolanghh 的回复:[quote=引用 1 楼 sinservice 的回复:] 是相对简单的工作，当然我这个说法是对C语言程序员而言的。在某些人看来，可能巨难。  比如，操纵和收集标准化的高级设备的数据，需要用到SECS协议，这可能需要你写一点代码来调一下标准SECS库。  没什么。这个行业的发展前景好吗？因为我看这方面的公司招人挺少的！我现在有点犹豫，怕以后如果公司出问题了，不太好找相关的工作[/quote]   你只要不断学习，还怕未来找不到工作。  现在北京，一个小孩，培训30课时的C++，要是好好学，都可以拿到8000.你怕什么？

user: user-5
content: 发展前景的问题超出了程序员的范畴

user: user-0
content: 引用 1 楼 sinservice 的回复:是相对简单的工作，当然我这个说法是对C语言程序员而言的。在某些人看来，可能巨难。  比如，操纵和收集标准化的高级设备的数据，需要用到SECS协议，这可能需要你写一点代码来调一下标准SECS库。  没什么。这个行业的发展前景好吗？因为我看这方面的公司招人挺少的！我现在有点犹豫，怕以后如果公司出问题了，不太好找相关的工作

user: user-0
content: 引用 楼主 xiaolanghh 的回复:最近在找工作，面试了一家小型公司，基本通过了面试。但具体不太清楚做什么的，貌似说是做自动化编程，就是用c编程测试测量一些产品的质量，好像跟嵌入式有点关系，说国外发展好的有NI公司，在网上查阅了一些资料，个人对这个行业还是不太了解，好像做这方面开发的公司挺少的，想请问下，这个行业现在怎么样，以及未来发展前景好吗？希望大家都说说自己的看法，当然有做这个行业的师兄介绍下最好了，小弟不胜感激这个行业的发展前景好吗？因为我看这方面的公司招人挺少的！我现在有点犹豫，怕以后如果公司出问题了，不太好找相关的工作
user-0 提问: 新手求指教，此题如何处理？

回复:
user: user-1
content: 引用 14 楼 u013151320 的回复:[quote=引用 13 楼 bijiaoben 的回复:] [quote=引用 10 楼 bijiaoben 的回复:] 单纯位数多不一定数字就大，比如前面输入了很多很多个0 引用 12 楼 u013151320 的回复:[quote=引用 11 楼 bijiaoben 的回复:] [quote=引用 9 楼 u013151320 的回复:] 提交到学校的题库里。。。被判定答案错误。。。怎么办？ 楼主你提交的代码是什么样的啊？[/quote]就用的楼上那段代码啊，那段代码确实能够判断，但是提交上去还是错误的呢[/quote] 代码要有自己写的，需要自己思考的，不能直接copy了别人的去用，至少你要先把别人的东西看懂，看看适不适合自己的使用。[/quote]看懂了啊。。。但是事实证明还是不对，不知道哪里出了错[/quote] 给你举个例子：字符串a“001”，字符串b“11”，那么用你提交的代码来处理的话，a大呢还是b大？ 你要先根据题目分析一下需求。首先你要检查输入的字符串中有没有‘0’~‘9’之外的非结束符字符，如果有的话，那么你的程序要提示输入错误。然后你要把2个字符串第一个有效数字之前的‘0’都过滤掉。再然后，才是按照这个代码中的方法进行比较。 我给你的提示你根本没看，你光看代码了

user: user-0
content: 引用 13 楼 bijiaoben 的回复:[quote=引用 10 楼 bijiaoben 的回复:] 单纯位数多不一定数字就大，比如前面输入了很多很多个0 引用 12 楼 u013151320 的回复:[quote=引用 11 楼 bijiaoben 的回复:] [quote=引用 9 楼 u013151320 的回复:] 提交到学校的题库里。。。被判定答案错误。。。怎么办？ 楼主你提交的代码是什么样的啊？[/quote]就用的楼上那段代码啊，那段代码确实能够判断，但是提交上去还是错误的呢[/quote] 代码要有自己写的，需要自己思考的，不能直接copy了别人的去用，至少你要先把别人的东西看懂，看看适不适合自己的使用。[/quote]看懂了啊。。。但是事实证明还是不对，不知道哪里出了错

user: user-1
content: 引用 10 楼 bijiaoben 的回复:单纯位数多不一定数字就大，比如前面输入了很多很多个0 引用 12 楼 u013151320 的回复:[quote=引用 11 楼 bijiaoben 的回复:] [quote=引用 9 楼 u013151320 的回复:] 提交到学校的题库里。。。被判定答案错误。。。怎么办？ 楼主你提交的代码是什么样的啊？[/quote]就用的楼上那段代码啊，那段代码确实能够判断，但是提交上去还是错误的呢[/quote] 代码要有自己写的，需要自己思考的，不能直接copy了别人的去用，至少你要先把别人的东西看懂，看看适不适合自己的使用。

user: user-0
content: 引用 11 楼 bijiaoben 的回复:[quote=引用 9 楼 u013151320 的回复:] 提交到学校的题库里。。。被判定答案错误。。。怎么办？ 楼主你提交的代码是什么样的啊？[/quote]就用的楼上那段代码啊，那段代码确实能够判断，但是提交上去还是错误的呢

user: user-1
content: 引用 9 楼 u013151320 的回复:提交到学校的题库里。。。被判定答案错误。。。怎么办？ 楼主你提交的代码是什么样的啊？

user: user-1
content: 单纯位数多不一定数字就大，比如前面输入了很多很多个0

user: user-0
content: 提交到学校的题库里。。。被判定答案错误。。。怎么办？

user: user-2
content: 引用 6 楼 u013151320 的回复:编出程序来看看，用字符数组然后比较位数，如果位数相同再从开头那位进行比较就有点复杂了啊。。。  复杂吗？顶多十来行吧

user: user-0
content: 编出程序来看看，用字符数组然后比较位数，如果位数相同再从开头那位进行比较就有点复杂了啊。。。

user: user-2
content: 引用 4 楼 M173475237 的回复:既然输入的是大数，。要保证数组的每个元素只储存一位的话，就要用字符数组了。不过10^1000。。嗯真够大的。 用动态分配吧。。输入多少位，就给分配多少。 10^1000也就char[1000]嘛，用不着动态

user: user-3
content: 既然输入的是大数，。要保证数组的每个元素只储存一位的话，就要用字符数组了。不过10^1000。。嗯真够大的。 用动态分配吧。。输入多少位，就给分配多少。

user: user-2
content: #include<stdio.h> #include<string.h> int main(){     char a[1024],b[1024];     scanf("%s%s",a,b);     if(strlen(a)>strlen(b)) printf("a>b\n");     else if(strlen(a)<strlen(b)) printf("a<b\n");     else{         int i=0;          while(a[i]==b[i]&&a[i]!='\0') i++;          if(a[i]>b[i])              printf("a>b\n");         else if(a[i]>b[i])              printf("a<b\n");         else               printf("a==b\n");     }     return 0; }   随便写写，不排除有错 如果可以用strcmp就更简单了

user: user-4
content: 先比较位数，如果位数相同再从高到底逐位比较

user: user-5
content: 引用 2 楼 user-5 的回复:[quote=引用 1 楼 truelance 的回复:] 先比较位数，如果位数相同再从高到底逐位比较 用std::string存储a,b[/quote] 还要判断是不是数，就是首位不能为0，所有位都要是数字

user: user-5
content: 引用 1 楼 truelance 的回复:先比较位数，如果位数相同再从高到底逐位比较 用std::string存储a,b
user-0 提问: C语言查找字符串中某字符第几次出现的位置

回复:
user: user-1
content: //给定字符串：this is java for you,java is good for programming! //打印最后一次出现字符串"for"的位置。 #include <stdio.h> #include <string.h> char s[]="this is java for you,java is good for programming!"; char f[]="for"; char *p,*q; int main() {     p=strstr(s,f);     if (NULL==p) {         printf("Can not find '%s' in '%s'!\n",f,s);     } else {         q=p+strlen(f);         while (1) {             p=strstr(q,f);             if (NULL==p) break;             q=p+strlen(f);         }         printf("The last location from 0 of '%s' in '%s' is %d.\n",f,s,q-s-strlen(f));     }     return 0; } //The last location from 0 of 'for' in 'this is java for you,java is good for programming!' is 34. //

user: user-0
content: 问题已经解决了，不过还是很感谢你，而且您的这种方法对我也有启发。

user: user-2
content: 对要查找的字符串反序，然后将标准的从前向后搜索子串的算法（比如KMP）改为从后向前，搜索反序后的那个字符串，即可。

user: user-3
content: 参考http://see.xidian.edu.cn/cpp/html/174.html  引用 楼主 u013155036 的回复:给定字符串：this is java for you,java is good for programming! 打印最后一次出现字符串"for"的位置。 求完整代码

user: user-4
content: 有个函数叫strstr
user-0 提问: 动态规划问题。

回复:
user: user-1
content: 引用 2 楼 M173475237 的回复:[quote=引用 1 楼 sinservice 的回复:] 不懂。  我接触的动态规划，是指编译器代码生成技术的树匹配技术和动态规划，不理解主贴的意思。 嗯。我说的是算法中很重要的一种。。 也就是常说的DP。 那个方程也叫状态转移方程[/quote] 《算法导论》

user: user-0
content: 引用 1 楼 sinservice 的回复:不懂。  我接触的动态规划，是指编译器代码生成技术的树匹配技术和动态规划，不理解主贴的意思。 嗯。我说的是算法中很重要的一种。。 也就是常说的DP。 那个方程也叫状态转移方程

user: user-2
content: 不懂。  我接触的动态规划，是指编译器代码生成技术的树匹配技术和动态规划，不理解主贴的意思。
user-0 提问: hist[*src++]++ 的执行顺序问题

回复:
user: user-0
content: 引用 楼主 ysmz4 的回复:hist[*src++]++，之中好像没有顺序点。那么两个++哪个先执行？还是说都有可能？（如果都有可能，那么这个问题显得没意义） 本来是期待hist[*src]++；src++；但是懒得调了

user: user-1
content: 第一个++ 操作数 src  第二个++ 操作数是hist[*src] 不是同一个对象 所以 谁先谁后 无所谓  也不会无意义

user: user-2
content: 这么纠结。要么就写个程序调试看看，要么就不这么写。

user: user-3
content: 自己去看置顶帖。 so没有意义的问题。

user: user-4
content: 都有可能,因为没有冲突，所以也不属于未定义。 hist[*src++]++ 的值，为 hist[*src] ;两个++ 都不影响这个。
user-0 提问: 【具体数学】VS【算法导论】2选1如何选择？

回复:
user: user-1
content: 前者是对问题建模的方法，后者是对已建模问题解决的方法。 相对来说，对初学者后者更实用，掌握以后能立刻感觉水平提高一个层次。 前者需要已经较高端的系统工程师/架构师才会用得上，对一般程序员有学了没用的感觉。  btw: 算法在 "其他技术论坛"->"高性能开发"

user: user-2
content: 多啃几遍算法导论！ 如果不懂，再回头认真看下数据结构！

user: user-3
content: 两本书的定位都不一样，有什么好比较的，基本如2楼所说。  《具体数学》可以算是kunth对自己的TAOCP的一个简单入门了，你如果打算学习TAOCP的话还是看看比较好。《算法导论》对一般程序员会更有用一些。
user-0 提问: 一个关于标准C的文件操作函数的很纠结的问题

回复:
user: user-0
content: 好吧，丢人了，这块知识不熟，还以为是什么自己不理解的代码错误呢！ 谢谢了！

user: user-1
content: if((fp_destine = fopen(destine,"w")) = NULL) //是==  最好这么写 if( NULL==(fp_destine = fopen(destine,"w")))
user-0 提问: 关于算法！

回复:
user: user-1
content: http://blog.csdn.net/xlm289348/article/details/9190999  排序详解

user: user-2
content: 要人解释每一行代码的意思，我觉得就是这样的学习方式让楼主“不知道该定义些什么，该用什么语句，怎么样的思想” 没人能代替你思考，除了抢你工作让你失业的竞争对手

user: user-3
content: 这个一百度不是一大堆么？ 而且基础C书籍上不是解释的很清楚么？
user-0 提问: 求大神看看这个代码哪错了：A+B ProblemIX

回复:
user: user-1
content: 这不是计数排序嘛。 是基数排序中的一趟排序。

user: user-2
content: 你的代码没问题啊 能跑出自己需要的结果，是不是你在输入数组a，b的时候 输入格式不对啊？代码我觉得写的太拖沓。
user-0 提问: ==========关于书上的一段话表示怀疑==============

回复:
user: user-1
content: 引用 13 楼 zhaokai115 的回复:也许他用的机器一个byte只有4位。。。。。    [quote=引用 11 楼 sinservice 的回复:] 书上没错，不要轻易怀疑书籍，毕竟是有些水平的人写的。  我给你看一个书上的错误。  在《数据恢复技术》（名字类似，有点忘了）：  说一个数小端是 0x12345678，转成大端就成为 0x87654321.  诸位看看错在哪里。[/quote] 0x78563412

user: user-1
content: 书没错啊，value的低8位是不变，高位清零。楼主应该自己动手写代码实验一下的

user: user-2
content: 楼主没错,书也没错 是上帝错了

user: user-3
content: 引用 3 楼 truelove12 的回复:[quote=引用 2 楼 max_min_ 的回复:] 是的！你理解是对的！书可能印刷或者本身有问题！  & 与 两个位都为1时，结果才为1  多谢版主大人了，这书我马上就扔垃圾箱里去了。 太多错误了，把关键字default直接译成默认，明明是左移操作翻译成右移。 总之错误太多，一看就知道是一个只懂英文不懂c的人翻译的，哎。。。  书名《C语言入门经典第4版》[/quote]  找版主赔你一本书吧！看12楼

user: user-3
content: 引用 12 楼 max_min_ 的回复:我的错！没仔细看上面是两段话  书上说 value是一个整数变量 value=value&0xFF; 其作用是使最右边的8位保持不变，其它位都设置为0 楼主说 我理解是0xff，二进制表示为11111111. 位与运算相同位都是1的情况下才是1.  都是对的啊！书上8位保持不变，1与1还是1,0与1还是0啊，所以不变！ 其他为都是x与0所以都是0啊  大哥，人家的书已经扔了！

user: user-4
content: 版主，搞笑的？

user: user-5
content: 可能是盗版书籍

user: user-6
content: 书没错误！ value & 0xff 指value的32位与二进制0000 ...省略... 1111 1111相与 value的高24位与0相与，必定为0，所以叫清零 低8位与1 &， 如果value中低八位中某位为0，与1后 还是0，  某位为1， 与1后 还是为1， 所以叫保留低8位

user: user-7
content: 完了，版主残害了一个身残志坚的有痣青年

user: user-8
content: 看起来是正确的啊！

user: user-9
content: 去把书捡回来吧…… 这段话完全正确，与1操作就是用来从一个二进制串里提取某一段的，百度一下“掩码”

user: user-10
content: 引用 13 楼 zhaokai115 的回复:也许他用的机器一个byte只有4位。。。。。    [quote=引用 11 楼 sinservice 的回复:] 书上没错，不要轻易怀疑书籍，毕竟是有些水平的人写的。  我给你看一个书上的错误。  在《数据恢复技术》（名字类似，有点忘了）：  说一个数小端是 0x12345678，转成大端就成为 0x87654321.  诸位看看错在哪里。[/quote]  对于标准C/C++，这是不可能的事情

user: user-11
content: 引用 13 楼 zhaokai115 的回复:也许他用的机器一个byte只有4位。。。。。    [quote=引用 11 楼 sinservice 的回复:] 书上没错，不要轻易怀疑书籍，毕竟是有些水平的人写的。  我给你看一个书上的错误。  在《数据恢复技术》（名字类似，有点忘了）：  说一个数小端是 0x12345678，转成大端就成为 0x87654321.  诸位看看错在哪里。[/quote]  那真是见鬼了。

user: user-12
content: 也许他用的机器一个byte只有4位。。。。。    引用 11 楼 sinservice 的回复:书上没错，不要轻易怀疑书籍，毕竟是有些水平的人写的。  我给你看一个书上的错误。  在《数据恢复技术》（名字类似，有点忘了）：  说一个数小端是 0x12345678，转成大端就成为 0x87654321.  诸位看看错在哪里。

user: user-13
content: 我的错！没仔细看上面是两段话  书上说 value是一个整数变量 value=value&0xFF; 其作用是使最右边的8位保持不变，其它位都设置为0 楼主说 我理解是0xff，二进制表示为11111111. 位与运算相同位都是1的情况下才是1.  都是对的啊！书上8位保持不变，1与1还是1,0与1还是0啊，所以不变！ 其他为都是x与0所以都是0啊

user: user-11
content: 书上没错，不要轻易怀疑书籍，毕竟是有些水平的人写的。  我给你看一个书上的错误。  在《数据恢复技术》（名字类似，有点忘了）：  说一个数小端是 0x12345678，转成大端就成为 0x87654321.  诸位看看错在哪里。

user: user-14
content: 引用 2 楼 max_min_ 的回复:是的！你理解是对的！书可能印刷或者本身有问题！  & 与 两个位都为1时，结果才为1 你一定是故意的

user: user-15
content: 引用 7 楼 user-17 的回复:[quote=引用 6 楼 a345485527 的回复:] [quote=引用 3 楼 truelove12 的回复:] [quote=引用 2 楼 max_min_ 的回复:] 是的！你理解是对的！书可能印刷或者本身有问题！  & 与 两个位都为1时，结果才为1  多谢版主大人了，这书我马上就扔垃圾箱里去了。 太多错误了，把关键字default直接译成默认，明明是左移操作翻译成右移。 总之错误太多，一看就知道是一个只懂英文不懂c的人翻译的，哎。。。  书名《C语言入门经典第4版》[/quote] 这是什么情况，我眼花了？ 一个数&1结果不变，&0结果是0，所以书上没有问题[/quote]我也这么觉得[/quote] 同花了。。

user: user-16
content: 引用value是一个整数变量 value=value&0xFF; 其作用是使最右边的8位保持不变，其它位都设置为0  这段话看起来是对的。

user: user-17
content: 引用 6 楼 a345485527 的回复:[quote=引用 3 楼 truelove12 的回复:] [quote=引用 2 楼 max_min_ 的回复:] 是的！你理解是对的！书可能印刷或者本身有问题！  & 与 两个位都为1时，结果才为1  多谢版主大人了，这书我马上就扔垃圾箱里去了。 太多错误了，把关键字default直接译成默认，明明是左移操作翻译成右移。 总之错误太多，一看就知道是一个只懂英文不懂c的人翻译的，哎。。。  书名《C语言入门经典第4版》[/quote] 这是什么情况，我眼花了？ 一个数&1结果不变，&0结果是0，所以书上没有问题[/quote]我也这么觉得
user-0 提问: 请教各位大神，cygwin下makefile中的recipe for target 'all' failed是什么原因？

回复:
user: user-1
content: 想请问下楼主解决这个问题了吗

user: user-2
content: lz想生成sys文件吗。

user: user-3
content: 出现以下信息： Makefile:15: recipe for target 'all' failed make: *** [all] Error 1 的原因是运行可执行文件（即执行./$(TARGET)这行）后返回的不是0 ，也即tdd.exe结束运行时返回的不是0 。  前面信息是tdd.exe打印的： Unity test run 1 of 1 .ledDriver/ledDriverTest.c:24:TEST(ledDriver, ledsOffAfterCreate):FAIL: Start here  ----------------------- 1 Tests 1 Failures 0 Ignored FAIL  LZ应检查该测试用例为何失败。

user: user-4
content: ./$(TARGET) 这句话 干啥？执行生成的可执行文件？ 这样不可以吧？没见过这种用法的
user-0 提问: c语言排序树的问题

回复:
user: user-0
content: 引用 3 楼 buyong 的回复:void insert_bst(BTREE t, int item){//递归构造二叉排序树 这是传值，不行 C语言传指针： void insert_bst(BTREE* pt, int item){//递归构造二叉排序树恩恩，自己慢慢调调好了，发现正是这个问题。

user: user-1
content: void insert_bst(BTREE t, int item){//递归构造二叉排序树 这是传值，不行 C语言传指针： void insert_bst(BTREE* pt, int item){//递归构造二叉排序树

user: user-2
content: 引用 1 楼 u011013370 的回复:24行调试的时候显示就有问题，是我自己添加想看看t有没有传递给in_order函数  具体一点  什么问题

user: user-0
content: 24行调试的时候显示就有问题，是我自己添加想看看t有没有传递给in_order函数
user-0 提问: 编译通不过。错在哪？

回复:
user: user-0
content: 引用 3 楼 cainiao366 的回复:试问这个程序好像不能得到楼主想要的功能 多谢提醒，改了之后OK了。 //lianxi7a.c 编写一个打开两个文件的程序。可以使用命令行参数或者请求用户输入来获得文件名 // a．让程序打印第一个文件的第一行、第二个文件的第一行、第一个文件的第二行、第二个文件的第二行，依此类推，直到打印完行数较多的文件的最后一行。 #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]) {     FILE *fp1,*fp2; 	int ch1,ch2; 	 	if(argc != 3) 	{ 	    printf("Error!\n"); 		exit(EXIT_FAILURE); 	} 	if((fp1 = fopen(argv[1],"r")) == NULL) 	{ 	    fprintf(stderr,"Can't open %s\n",argv[1]); 		exit(EXIT_FAILURE); 	} 	if((fp2 = fopen(argv[2],"r")) == NULL) 	{ 	    fprintf(stderr,"Can't open %s\n",argv[2]); 		exit(EXIT_FAILURE); 	} 	ch1 = getc(fp1); 	ch2 = getc(fp2); 	while(ch1 != EOF || ch2 != EOF) 	{ 	    while(ch1 != '\n' && ch1 != EOF) 		{     		putc(ch1,stdout); 			ch1 = getc(fp1); 		} 	   	if(ch1 == '\n') 	    { 	        putc(ch1,stdout); 		    ch1 = getc(fp1); 	    } 		while(ch2 != '\n' && ch2 != EOF) 		{     		putc(ch2,stdout); 			ch2 = getc(fp2); 		} 		if(ch2 == '\n') 		{     		putc(ch2,stdout); 			ch2 = getc(fp2); 		} 	} 	return 0; }

user: user-1
content: 试问这个程序好像不能得到楼主想要的功能

user: user-2
content: 引用 1 楼 user-3 的回复:编译通不过是由于下面这条语句导致的             ptc(ch2,stdout); ptc未定义，应该为             putc(ch2,stdout);  同意，楼主太不小心了，记得给我也加分啊。

user: user-3
content: 编译通不过是由于下面这条语句导致的             ptc(ch2,stdout); ptc未定义，应该为             putc(ch2,stdout);
user-0 提问: 新手报到，求C语言教学视频

回复:
user: user-1
content: 同意楼上，郝斌老师的视频讲得确实很清楚。

user: user-2
content: http://yun.baidu.com/s/123J42 郝斌老师的，讲的挺好，看看吧

user: user-3
content: programming paradigm，斯坦福

user: user-4
content: 看多遍不如自己写一段代码。

user: user-5
content: 视频毛多肉少。   费时间，还是自己看书，敲代码。

user: user-6
content: 个人经验是看书比较好。看视频一般只是入门阶段，想要精通还是看书比较好。推荐C Primer Plus

user: user-7
content: 个人认为看视频没用。。 读书吧。
user-0 提问: this 指针是read only吗？

回复:
user: user-1
content: 引用 2 楼 user-7 的回复:一个对象的this指针并不是对象本身的一部分，不会影响sizeof的结果。this指针是类的一个自动生成、自动隐藏的私有成员，存在于类的非静态成员函数中，指向被调用函数所在的对象的地址。说他是只读是正确的。 补习什么叫“成员”去。

user: user-1
content: this是rvalue，根本上就只能read，你要非认为read only那就read only吧。

user: user-2
content: 说点题外话，面试宝典这种书，面试前两天翻翻就行了 不能当做学习用书

user: user-3
content: 1) this指针和对象无关,不是对象的一部分。  只是在非静态成员函数的调用过程中，隐式传递的一个参数，是调用该函数的那个对象的地址。 在该函数调用过程中 this指针是不可修改的，指针的值，也是不会改变的。  对于成员函数的定义来数，是该函数的隐藏的第一个参数。 实际参数表里的参数，是更后面的参数。  其他地方不存在this指针。 也不是类的成员变量，类中一般没有这个数据。  2） D,E 只怕都是对的。  3）代码事例：    class A{    int x; public :    int getX()const{        //访问函数，隐藏参数 this，是函数的第一个参数；       //定义形式为 const A *const this;         return this->x;    }     void setX(int val){      // 修改函数，隐藏参数 this，是函数的第一个参数；      // 定义形式为 A *const this;           this->x =val;    }; };  int main{   A a;   int v=10;   v = a.getX(); // this == &a;   a.setX(v);    // this == &a;    A &r =a;    v = r.getX(); // this == &r == &a;   r.setX(v);    // this == &r == &a;    A *p = &a;      v = p->getX(); // this == p == &a;   p->setX(v);    // this == p == &a;     return 0;      }

user: user-4
content: 上联：说你行你就行不行也行 下联：说不行就不行行也不行 横批：不服不行

user: user-5
content: 面试就是对人的摧残

user: user-6
content: this是一个指针常量.

user: user-7
content: 一个对象的this指针并不是对象本身的一部分，不会影响sizeof的结果。this指针是类的一个自动生成、自动隐藏的私有成员，存在于类的非静态成员函数中，指向被调用函数所在的对象的地址。说他是只读是正确的。
user-0 提问: 着急求教c语言中的位域计算

回复:
user: user-1
content: struct       {         char A:1;         char B:2;         char C:3;               }testStruct; 结构体变量testStruct占用一个字节，A、B、C分别占用该字节的1位、2位和3位。即00 000 00 0，a.x = 2;那么根据联合体的特性，x的第一个字节的形式为：00 000 01 0

user: user-2
content: 000 01 0 A=0; B=1; C=0;  引用 楼主 xlz669112 的回复:union testUnion{ 	struct   	{ 		char A:1; 		char B:2; 		char C:3; 		 	}testStruct; 	int x; };  void func2() { 	testUnion a;  	a.x=2; 	printf("%d",a.testStruct.C); }
user-0 提问: 结构体，错误。。。error C2275: 'student' : illegal use of this type as an exp

回复:
user: user-1
content: 楼主先去看看声明和定义的区别吧

user: user-2
content: #include <STDIO.H> /*  *  *    项目：有5个学生，每个学生的数据包括学号、姓名、三门课的成……  *      *    日期：2013-12-12  *  *  *  */ struct student{     char name;     int number;     int score1;     int score2;     int score3; }stu[5];//上面只是定义了这个一个结构体，下面这里才是定义五个学生；   void main(void){     int i;//最好这样定义    for(i=0;i<5;i++){//i要从0开始，因为你定义的5个学生从stu[0]开始；         printf("请输入第%d个学生的姓名",i+1);//printf（）函数输出i，前面对应的是         scanf("%s",&stu[i].name);//%c是一个字符，%s才是字符串。     } }

user: user-3
content: 引用 4 楼 turingo 的回复:问题很多，都帮你改好了：   #include <stdio.h> /*  *  *  *   *    项目：有5个学生，每个学生的数据包括学号、姓名、三门课的成……  *    *      *     *    日期：2013-12-12  *      *  *       *  *        *  *         */ struct student {     char name[20];     int number;     int score1;     int score2;     int score3;  };  int main() {        struct student stus[6];     int i;     for (i=0;i<6;i++)     {         printf("请输入第%d个学生的姓名",i);         scanf("%s",stus[i].name);     }     return 0; }    [quote=引用 楼主 u013096814 的回复:] #include <STDIO.H> /*  *  *	项目：有5个学生，每个学生的数据包括学号、姓名、三门课的成……  *	  *	日期：2013-12-12  *  *  *  */ struct student { 	char name; 	int number; 	int score1; 	int score2; 	int score3;  };  void main() 	{	for (int i=1;i<6;i++) 	{ 		printf("请输入第%个学生的姓名",i); 		scanf("%c",&student[i].name); 	} }    结构体，错误。。。error C2275: 'student' : illegal use of this type as an exp[/quote] good

user: user-4

user: user-5
content: 问题很多，都帮你改好了：   #include <stdio.h> /*  *  *  *   *    项目：有5个学生，每个学生的数据包括学号、姓名、三门课的成……  *    *      *     *    日期：2013-12-12  *      *  *       *  *        *  *         */ struct student {     char name[20];     int number;     int score1;     int score2;     int score3;  };  int main() {        struct student stus[6];     int i;     for (i=0;i<6;i++)     {         printf("请输入第%d个学生的姓名",i);         scanf("%s",stus[i].name);     }     return 0; }  引用 楼主 u013096814 的回复:#include <STDIO.H> /*  *  *	项目：有5个学生，每个学生的数据包括学号、姓名、三门课的成……  *	  *	日期：2013-12-12  *  *  *  */ struct student { 	char name; 	int number; 	int score1; 	int score2; 	int score3;  };  void main() 	{	for (int i=1;i<6;i++) 	{ 		printf("请输入第%个学生的姓名",i); 		scanf("%c",&student[i].name); 	} }    结构体，错误。。。error C2275: 'student' : illegal use of this type as an exp

user: user-6
content: struct student {     char name;     int number;     int score1;     int score2;     int score3;   };//////这样是定义中自定义类型  就像int等数据类型 只不过这是自定义的 ///你觉得int[i]这样能能用吗？肯定不能啊  同样 ///你得定义变量   student s[10]; ///这样才能用   仔细想想自定义数据类型是什么意思
user-0 提问: 请问两人聊天的程序服务器端和客户端该如何通信

回复:
user: user-1
content: Server/Client代码参考实例，网上应该一片吧、、

user: user-2
content: server和每个client会有唯一的通道号连接，发送的时候把通道号记下来

user: user-3
content: 服务器端的多线程编程+自定义通信协议

user: user-0
content: 引用 1 楼 a345485527 的回复:群发？把所有socket存起来，一起发出去 刚明白我问的意思是两个客户端怎样用tcp相互通信，服务器起到了一个什么作用，如果是转发，是如何转发的，比如我所写的，服务器在监听，当accept一个新的socket后就给它回复，那我如何通知给另一客户端socket,这边的请求消息呢？

user: user-4
content: epoll or iocp,查查网络模型

user: user-5
content: 群发？把所有socket存起来，一起发出去

user: user-0
content: 引用 11 楼 derekrose 的回复:只能一个收一个发？ 不知道，还是有点糊涂。能不能有段服务器的代码？

user: user-6
content: 只能一个收一个发？

user: user-7
content: 将每个和服务器建立连接的客户端id和对应的socket保存起来。需要给哪个客户端转发信息时通过id来查找对应的scoket句柄，然后发送即可

user: user-0
content: 客户端的id是不是socket

user: user-0
content: 引用 6 楼 user-8 的回复:[quote=引用 3 楼 chyun7290 的回复:] [quote=引用 1 楼 a345485527 的回复:] 群发？把所有socket存起来，一起发出去 刚明白我问的意思是两个客户端怎样用tcp相互通信，服务器起到了一个什么作用，如果是转发，是如何转发的，比如我所写的，服务器在监听，当accept一个新的socket后就给它回复，那我如何通知给另一客户端socket,这边的请求消息呢？[/quote] 肯定通过每个客户端发送消息体中对应发送客户端对应的id识别啊！[/quote] 请问能不能给段小代码

user: user-5
content: 引用 5 楼 chyun7290 的回复:那我如何找b的socket呢？只有一个accept,谁请求就返回谁，难道每个ip绑定的socket只用建立一次。 accept返回后，把返回的socket和其对应的客户端id存起来，用数组，链表,或者map都可以 这样服务器就保存了所有与之连接的客户端，客户端断开后在把它从数组里面删掉 服务器只需要遍历存储所有socket的数组就可以找到客户端B对应的socket了

user: user-8
content: 引用 3 楼 chyun7290 的回复:[quote=引用 1 楼 a345485527 的回复:] 群发？把所有socket存起来，一起发出去 刚明白我问的意思是两个客户端怎样用tcp相互通信，服务器起到了一个什么作用，如果是转发，是如何转发的，比如我所写的，服务器在监听，当accept一个新的socket后就给它回复，那我如何通知给另一客户端socket,这边的请求消息呢？[/quote] 肯定通过每个客户端发送消息体中对应发送客户端对应的id识别啊！

user: user-0
content: 那我如何找b的socket呢？只有一个accept,谁请求就返回谁，难道每个ip绑定的socket只用建立一次。

user: user-5
content: 引用 3 楼 chyun7290 的回复:[quote=引用 1 楼 a345485527 的回复:] 群发？把所有socket存起来，一起发出去 刚明白我问的意思是两个客户端怎样用tcp相互通信，服务器起到了一个什么作用，如果是转发，是如何转发的，比如我所写的，服务器在监听，当accept一个新的socket后就给它回复，那我如何通知给另一客户端socket,这边的请求消息呢？[/quote] 可以自己定义通信的协议，客户A指明想要把这条数据发给谁，服务器收到后对其进行解析，发现是发给B的，就找到B的socket，然后再把A的数据转发一下
user-0 提问: C语言音乐播放器

回复:
user: user-0
content: 引用 48 楼 u014065169 的回复:介意让我看一下源码吗？/  源码地址：http://zyplayer.com/workShare/my-music-player-lbyy 我写的一个网站，毕业了C找不到工作，转Java了~写了个小网站

user: user-0
content: 引用 48 楼 u014065169 的回复:介意让我看一下源码吗？/ 源码在这里，http://123.57.75.37/workShare http://123.57.75.37/workShare/my-music-player-lbyy 我自己写的一网站，地址可能会改变~~俺的qq：806783409

user: user-0
content: 引用 34 楼 q745401990 的回复:不错哦， 楼主愿意把源码分享出来吗？ 源码已分享 地址：http://123.57.75.37/workShare （我自己写的一个网站，才刚起步，可能以后会变~~~）

user: user-1

user: user-2
content: 楼主好厉害。膜拜

user: user-3
content: 竟然是去年的帖子

user: user-4
content: 向跨年挖坟者致敬！

user: user-5
content: 引用 6 楼 u010047583 的回复:[quote=引用 3 楼 max_min_ 的回复:] 简单介绍下过程中使用的比较好的技术！ 用到了多线程下载歌曲和歌词，还有自己写的歌词文件分析代码、网页分析代码，还有就是链表、频繁的文件操作、各种控件的使用，调用另一个程序来播放指定的MV资源，基本就这些了，还有些细节的。。。[/quote] lz你真是个人才啊！ 引用 8 楼 u010047583 的回复:[quote=引用 4 楼 booirror 的回复:] 不错，楼主前途无量啊 还不是找不到工作~！~找个实习单位都还没找到。。。[/quote] 别灰心，是金子总会发光的！！！

user: user-6
content: 支持原创，楼主牛人一个！

user: user-7
content: 原创要收藏起来。

user: user-8
content: 楼主真牛人，赞一个

user: user-0
content: 引用 40 楼 u010047583 的回复:[quote=引用 39 楼 hsyyqq 的回复:] 楼主把这个链接当简历去面试吧 入职很多年的人也不一定写的出来。 真的么？？我感觉还是比较简单的。。。[/quote]界面的创建我是用的如鹏网的一个插件，但狠多东西还是自学的，可加群讨论！

user: user-9
content: 在某吧见到过你，给个赞吧。。

user: user-10
content: 楼主，界面是怎么做的

user: user-0
content: 引用 39 楼 hsyyqq 的回复:楼主把这个链接当简历去面试吧 入职很多年的人也不一定写的出来。 真的么？？我感觉还是比较简单的。。。

user: user-11
content: 楼主把这个链接当简历去面试吧 入职很多年的人也不一定写的出来。

user: user-12
content: 好强大啊

user: user-13
content: 来北京找工作肯定能找到的你。我也是明年毕业也准备找工作了！一起加油！期待。。。

user: user-14
content: 好吧，就下载和模糊搜歌的功能还算不错。  其他的ff音频解码 基本都提供了播放器该有的功能。  另外一款好的应用，界面也要好看。  楼主加油。

user: user-15
content: 很不错，我现在写个播放器还磕磕绊绊的
user-0 提问: 底层程序中如何取一个数组中一部分的数据

回复:
user: user-1
content: 用指针写一个循环；或者用memcpy这个函数

user: user-2
content: 楼主所谓的底层程序是什么意思？

user: user-3
content: char* p = buf; p += 199; // 第200个数据的地址  另外，要注意char[256]的有效下标是0到255。所以你其实需要199到255。

user: user-4
content: memcpy
user-0 提问: 二维数组和一维数组（字符串）strcmp的使用？

回复:
user: user-1
content: 多了一次i++，跳过了i=5的情况：  #include<stdio.h> #include<string.h> int main() {     char name[10][20]={0};     char *p;     char name1[20];     int i;     p=name1;     strcpy(name[5],"大中国");      strcpy(name1,"大中国");     printf("%s\n",p);     for(i=0;i<10;i++)     {         if(strcmp(name1,name[i])==0)         {             printf("zhaodaole\n");             break;         }     }     printf("i=%d\n",i);     return(0); }  引用 楼主 u012510962 的回复:以前一般都是用strcmp进行一维数组的比较，刚刚用它进行一维和二维的比较就出了错，求前辈指教！！  #include<stdio.h> #include<string.h> int main() { char name[10][20]={0}; char *p; char name1[20]; int i; p=name1; strcpy(name[5],"大中国");  strcpy(name1,"大中国"); printf("%s\n",p); for(i=0;i<10;i++) { if(strcmp(name1,name[i])==0) { printf("zhaodaole\n"); break; } else { i++; } } printf("i=%d\n",i); return(0); }  上面这个程序当执行“if(strcmp(name1,name[i])==0)”当i=5时，应该会跳出来吧？可是事实不是这样的。 求高手指教啊！！ 谢谢！！
user-0 提问: c语言配列地址问题求高手帮忙

回复:
user: user-1
content: 只是一个地址啊，他本身又没有存储空间，怎么交换

user: user-2
content: 你是想交换地址 还是···

user: user-0
content: *(ary+1)取的是ary[1]的数据  ary+1取的是 &ary[1]的地址.怎么就没这样的运算了.

user: user-3
content: 楼主对内存的概念还一无所知。

user: user-3
content: 地址是不能这样运算的。ary+j=tmp要改成*(ary+j)=*tmp还差不多。
user-0 提问: c语言问题求高手帮忙解答

回复:
user: user-1
content: char* message[]={"warning","syntax error","illegal value", "bus error","segmentation fault"}; 这里卖弄的几个字符串本身就是常量字符串，你是不能改变他们的。 你的第一种方法只是改变了指向他们的指针的值，并不是字串本身，所以是可行的，而第二种方法试图去改写常量字符串，结果肯定是失败啊

user: user-2
content: Strcpy的原型是：char *strcpy(char *dest, const char *src); 第二个参数是const，应该是不能改变的，而你的交换改变了第二个参数。 个人认为。
user-0 提问: 求助，有点被多维数组，指针给搞晕了

回复:
user: user-0
content: 引用http://download.csdn.net/detail/chenlei76/771659#comment 谢啦

user: user-1
content: http://download.csdn.net/detail/chenlei76/771659#comment

user: user-1
content: http://http://download.csdn.net/detail/chenlei76/771659#comment 传送门，仔细读一下

user: user-2
content: 开debugger看，从根源上理解。

user: user-0
content: 引用多级指针，该变量str1就是一个二维指针。str1是一个指针数组，即数组的元素都是一个char*类型的指针变量。char **str = strl; int **p;是一个二维指针（野指针）。 int (*p1)[2];是一个数组指针，即指向一个列数为2的二维数组，行数不定。其实该变量p1是一个一维指针。 你这个说的好像不对吧

user: user-3
content: 最后一句是输出“zxv”不好意思写错了

user: user-3
content: #include <stdio.h>//大致用法自己稍微归纳下，也不知道对不对！大家一起讨论下吧！欢迎大家指正 void main(void){     char *strl[5]={"aaaaa","cc","we","zxv","asdassad"}; //指针数组，只是指针是指向char类型的字符串。 	int b[3]={10,9,8};//一维数组。 	int a[2][3]={{1,2,3},{4,5,6}};//二维数组。 	char **p;//指向指针的指针。 	int (*p1)[3]; //数组指针。 	int (*p3)[3]; //数组指针。 	int *p2[2]; //指针数组，指针是指向int类型。  	p1 = a; //数值指针赋值，指针P1指向二维数组a[2][3] 	p3 = &b;//数值指针赋值，指针P3指向一维数组b[3] 	p2[0] = a[0]; //指针数组赋值，将指针数组p2[2]中的第一个元素指向二维数组中的第一行 	p2[1] = a[1]; //指针数组赋值，将指针数组p2[2]中的第二个元素指向二维数组中的第二行 	p=strl; //指向指针的指针赋值，将指向指针的指针指向str1[0]的地址  	/*指针数组的用法*/ 	printf("%s\n",strl[0]);//这样调用才是对的。相当于strl里面有5个字符串分别放入str[0]到str[4]  	/*数组指针的用法，指向二维数组*/ 	printf("%d\n",p1);//这样输出的P1指向的地址也就是a[0][0]的地址 	printf("%d\n",*p1);//这个同样是a[0][0]的地址 	printf("%d\n",&a[0][0]);// 这个可以验证上句话的真伪 	printf("%d\n",(*p1)[0]);//这个输出的a[0][0] 	printf("%d\n",(*p1)[4]);//这个输出的是a[1][1] 	printf("%d\n",(*p1[1]+1));//也可以这么使用  	/*数组指针的用法，指向一维数组*/ 	printf("%d\n",(*p3)[2]); //等价于b[2]； 	printf("%d\n",*((*p3)+2)); //等价于b[2]；	  	/*指针数组的用法，指向二维数组*/ 	printf("%d\n",*p2[0]); // 等价于a[0][0]； 	printf("%d\n",*p2[0]+1); // 等价于a[0][1]；  	/*指向指针的指针用法，指向指针数组*/ 	printf("%d\n",*p); //这是指向str1[0]的地址 	printf("%d\n",strl[0]); // 下面可以验证上述观点。 	printf("%s\n",*p);//输出字符串"aaaa" 	printf("%s\n",*(p+3));//输出字符串"aaaa" } 只是自己的愚见。。

user: user-4
content: char *strl[5]={"aaaaa","cc","we","zxv","asdassad"}; 多级指针，该变量str1就是一个二维指针。str1是一个指针数组，即数组的元素都是一个char*类型的指针变量。char **str = strl; int **p;是一个二维指针（野指针）。 int (*p1)[2];是一个数组指针，即指向一个列数为2的二维数组，行数不定。其实该变量p1是一个一维指针。

user: user-5
content: 多级指针很少超过两级。 我从来不用多维数组，因为和一维的没区别。写个类把业务逻辑包装好就行了。
user-0 提问: 字节对齐问题

回复:
user: user-1
content: 如果在嵌入式领域开发，对字节对齐看的比较重要。所以，如果按照arm的4字节对齐，那么该值为12.不够4字节的会填充，即在最后一个结构体成员j后填充3个字节，以符合4字节对齐。

user: user-2
content: 结果应该是12,  int 占4个字节,也就是8,   char占1个字节   也就是8+1=9,因为要补齐到结构中最大类型字节的倍数,最大类型为4,而9不是4的倍数,所以要补齐12才行.

user: user-3
content: struct X{ int i; int j; char k; }x; sizeof(x) = ? 这个问题就是个对齐的问题，如上述改为如下： struct X{ char i; int j; char k; }x; sizeof(x) = ? 和 struct X{ char i; char k; int j; }x; sizeof(x) = ? 这两个结果一样的？具体为什么可以去调试一下就懂了 要想节约最好按字符类型占空间的大小排列

user: user-4
content: 要掌握它的字节数，最好用紧凑模式，可以这样写：  #pragma  pack (push,1) struct X { int i; int j; char k; }x;  #pragma pack(pop)   那么sizeof(x)就是4+4+1了。  引用 楼主 u013137832 的回复:struct X { int i; int j; char k; }x; sizeof(x) = ? 想这一类的问题平时怎么解决？看了一些资料不是很懂

user: user-5
content: 看完这篇就全明白了： http://blog.csdn.net/21aspnet/article/details/6729724
user-0 提问: [急]用栈检验括号序列（文件操作）

回复:
user: user-1
content: #include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/     ELEMTYPE * base;     ELEMTYPE * top;     int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/     s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));     if (!s->base) return ERROR;     s->top=s->base;     s->stacksize=STACK_INIT_SIZE;     return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));         if (!s->base) return ERROR;         s->stacksize+=STACK_GROW_SIZE;         s->top=s->base+s->stacksize;     }     *s->top++=e;     return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *e=*(--s->top);     return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) {     if ((a=='('&&b!=')')       ||(a=='['&&b!=']')       ||(a=='{'&&b!='}')) {         return ERROR;     } else return OK; } int Count(SpStack *s) {     ELEMTYPE e[STACK_INIT_SIZE*2];     ELEMTYPE e1;     int i;      InitStack(s);     fgets(e,STACK_INIT_SIZE*2,stdin);     if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;     printf("%s\n",e);     for (i=0;e[i]!='\0';i++) {         switch (e[i]) {         case '(':         case '[':         case '{':             Push(s,e[i]);             break;         case ')':         case ']':         case '}':             if (StackEmpty(s)) {                 printf("%*s↖右括号多余\n",i+1,"");                 return(ERROR);             } else Pop(s,&e1);             if (!Comp(e1,e[i])) {                 printf("%*s↖左右匹配出错\n",i+1,"");                 return(ERROR);             }         }     }     if (!StackEmpty(s)) {         printf("%*s↖左括号多余\n",i,"");         return(ERROR);     } else {         printf("匹配正确\n");         return(OK);     } } void main() {     SpStack s;     Count(&s);     free(s.base); }

user: user-2
content: 栈的实现有问题...

user: user-0
content: 引用 3 楼 max_min_ 的回复:引用 2 楼 u013133423 的回复:[quote=引用 1 楼 user-4 的回复:] debug过了有什么问题吗？不会啊，你帮我看看。   fclose(fp); //这个丢到函数结尾看看[/quote]fscanf函数不是在文件关闭之前已将文件内容读到内存了吗(存到数组b)？

user: user-3
content: 引用 2 楼 u013133423 的回复:引用 1 楼 user-4 的回复:debug过了有什么问题吗？不会啊，你帮我看看。   fclose(fp); //这个丢到函数结尾看看

user: user-0
content: 引用 1 楼 user-4 的回复:debug过了有什么问题吗？不会啊，你帮我看看。

user: user-4
content: debug过了有什么问题吗？
user-0 提问: 计算器程序遇到困难就帮忙……衷心感谢

回复:
user: user-1
content: 引用 4 楼 u011873193 的回复:引用 2 楼 zhao4zhong1 的回复:单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。单步调试和设断点调试是程序员必须掌握的技能之一。这个没用过，不会用…… VS IDE中，编译链接通过后，按F11，然后根据需要按F11，F10，Shift+F11

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。单步调试和设断点调试是程序员必须掌握的技能之一。这个没用过，不会用……

user: user-1
content: http://www.easyx.cn

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。
user-0 提问: 关于二维数组作指针 如何调用问题

回复:
user: user-1
content: void convert(int *a[3]);  调用时直接用 convert(a); 多维数组做参数，除最高维外，都必须指定大小

user: user-2
content: main()函数里面调用convert()函数的时候，只需要直接传递数组a[]的首地址，也就是a就可以了。convert(a)。
user-0 提问: 请教下高手，C语言下一步做什么？

回复:
user: user-1
content: c专家编程。

user: user-2
content: <<数据结构与算法分析-C语言描述>> <<算法导论>>

user: user-3
content: 我是来看看大家怎么说的，我也很迷茫

user: user-4
content: 数据结构、、、

user: user-5
content: 我来看各位大神的回复！

user: user-0
content: [数据结构(C语言版)].严蔚敏_吴伟民.扫描版.pdf 栈，队列，链表，树。还算有个理解 图就难了

user: user-6
content: 下一步可以学习数据结构和算法，工具用Code::Blocks(http://www.codeblocks.org/)，它是跨平台的。  引用 楼主 u013125216 的回复:C程序设计_第三版_谭浩强 C和指计 C Primer Plus(第五版)中文版 看完了也按自己的思路（为什么说自己的思路呢，因为只是我自己感觉那些题和我编程后结果虽然是差不了多少的，以我目前的水平也只能认了）做了7，8成编程习题 下一步要做什么？ 学生管理系统？还是联系人管理系统？ 我曾经编过学生管理系统（增加学生，删除，保存成文件，读取文件等等用链表操作）。 顺便问一下在LINUX下的C和C++用个编程套件好啊？像WINdows下的VC6.0

user: user-7
content: 《Linux C编程一站式学习》

user: user-8
content: 当当一下这本书如何，《C语言课程设计案例精编》。 或者向C++前进。

user: user-9
content: 我看了78成，你说的第三本书，也踏踏实实的做了联系，等做完后我打算再把真这本书的内容总结一遍 顺便把大话数据结构看个大概，再总结一下数据结构顺便了解一下操作系统原理，我是个工作2年的新手，希望多交流

user: user-10
content: 根据所学做一个简单的自己感兴趣的东西，慢慢探索慢慢发现不足，进步很快的

user: user-11
content: <Linux内核情景分析>

user: user-12
content: c有很多好书可以看， 也可以涉猎些 操作系统  网络 这块的 linux下工具：vim qtcreator  eclipse  code::bloks emacs ==
user-0 提问: 各位大神 如何准确测定printf需要的时间呢

回复:
user: user-1
content: 所以我说是输出流的事情，不知道楼主想要测什么  引用 10 楼 zhao4zhong1 的回复:[quote=引用 7 楼 yiyefangzhou24 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] echo %time% yourprog.exe >output.txt echo %time% 你这个是整个程序的运行时间把？而且一个printf函数的时间恐怕只有到毫秒级的数量级[/quote] 我的意思是printf重定向到文件的速度远大于不重定向到文件而输出到console中的时间，如果console不断上卷的话，会更慢。[/quote]

user: user-2
content: 写3000次print测下时间／3000，不准是肯定的，cpu，io不可能只做你这个事情

user: user-3
content: 引用 7 楼 yiyefangzhou24 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] echo %time% yourprog.exe >output.txt echo %time% 你这个是整个程序的运行时间把？而且一个printf函数的时间恐怕只有到毫秒级的数量级[/quote] 我的意思是printf重定向到文件的速度远大于不重定向到文件而输出到console中的时间，如果console不断上卷的话，会更慢。

user: user-4
content: gettimeofday

user: user-5
content: 用write啊，时间统计有gettimeofday啊，反正你就是统计墙上时钟时间，又不统计cpu的us和sys.

user: user-1
content: 引用 6 楼 zhao4zhong1 的回复:echo %time% yourprog.exe >output.txt echo %time% 你这个是整个程序的运行时间把？而且一个printf函数的时间恐怕只有到毫秒级的数量级

user: user-3
content: echo %time% yourprog.exe >output.txt echo %time%

user: user-1
content: 什么叫测的时间不准？printf只是把输出推进输出流，他就返回了，你看到的输出是输出流做的事情，研究一下输入输出流的原理

user: user-0
content: 我的意思是，同样用上述方法；测得的printf时间不准。为什么呢。谢谢。

user: user-1
content: http://bbs.csdn.net/topics/340213238

user: user-1
content: CTime类

user: user-6
content: 别用printf
user-0 提问: 用scanf的一个问题,

回复:
user: user-0
content: 真是太感谢了,这么多人帮助我. 首先,我这个问题是只想在输入时超出缓冲长度的时候让它重新输入.但scanf这个函数无论读入字符数量限定与否,只要输入的类型正确且没有遇EOF,它的返回值都是1.所以想单纯用scanf的返回值来判断是否输入了过多的字符是不可能的了.  最终以最短小代码的4楼,赢的了我崇拜~~  引用 4 楼 angel_su 的回复:你可以加读一个字符判断，限定是必要的，防止输入太长数组越界操作...  scanf("%2s%c",sex, &c); while (c != '\n') {     fflush(stdin);     scanf("%2s%c",sex, &c);  } 这代码的想法别出心裁.真是太棒了.判断输入字符后面 的字符是否是换行,如果不是换行,那肯定是多输入了某些东西.代码矮小精悍.完成了最实用的功能.

user: user-1
content: $ cat test.c && gcc -o demo.exe test.c && ./demo.exe 5 #include <stdio.h> #include <string.h> #include <stdlib.h>  int main(int argc, char** args) {       unsigned int n;       char* buf,ws, format[32];       if(argc == 2)       {          if(sscanf(args[1], "%i", &n) != 1 || 0 == n)             return -1;           buf = (char*) malloc(n+1);          sprintf(format, "%%%is%%c", n);          if(buf)          {            do            {              if(scanf(format, buf, &ws) == 2)              {                 if(strlen(buf) == n && ws == '\n')                 {                   break;                 }              }               fflush(stdin);            }while(1);            printf("you finally get: %s", buf);            free(buf);          }       }       return 0; } //123 //1234 //123456 //12345 //you finally get: 12345

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-2
content: #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-3
content: 你可以加读一个字符判断，限定是必要的，防止输入太长数组越界操作... scanf("%2s%c",sex, &c); while (c != '\n') {     fflush(stdin);     scanf("%2s%c",sex, &c); }

user: user-4
content: 不好使是你没说清楚你想干嘛 什么是你所谓的规定字符

user: user-0
content: 1、用scanf("%2s",sex)直接限定； 这办法没好使,                  char sex[3]                 printf("性别："); 		while(scanf("%2s",sex)!=1)  fflush(stdin);

user: user-5
content: 1、用scanf("%2s",sex)直接限定； 2、最好是用getch/getchar一个字符一个字符的判断。  引用 楼主 xgywd 的回复:     char sex[3]     while(scanf("%s",sex)!=1)  fflush(stdin);  我想对输入的字符数进行检查,如果超过规定的字符就刷新重输入,但我这样做不行.具体怎么做才好呢.
user-0 提问: 感觉没有错，怎么运行结果是一个很大的负整数?请教下大家

回复:
user: user-1
content: a[i-3] = a[i-2]; a[i-2] = a[i-1]; a[i-1] = a[i];   这是在干什么？

user: user-2
content: 这个用递归是比较好实现的吧！

user: user-3
content: 怎么看怎么觉得         a[i-3] = a[i-2];         a[i-2] = a[i-1];         a[i-1] = a[i]; 这三行是多余的
user-0 提问: 求大神指教一下  must return a value

回复:
user: user-1
content: 函数需要返回一个HNODETYPE类型的值，或者你把原型改为void huffmantree(char *s2,char s3[])也可以。  引用 楼主 u013131780 的回复:HNODETYPE huffmantree(char *s2,char s3[]) {     HNODETYPE huffnode[MAXNODE];     HCODETYPE huffcode[MAXLEAF],cd;     int sum,i,j,n1,n2,x1,x2,p,k,c;     char s1[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};     char s5[MAXLEAF];     int ww[26]={0},n=0;     strcpy( s5,s2);     sum=strlen(s2);     for(i=0;i<26;i++) /*统计所有字符出现的频度*/     for(j=0;j<sum;j++)     if(s2[j]==s1[i]) ww[i]++;     n=strlen(s3);     for (i=0;i<2*n-1;i++) 	{ 		huffnode[i].weight=0;         huffnode[i].parent=-1;         huffnode[i].lchild=-1;         huffnode[i].rchild=-1; 	}     for(i=0;i<n;i++) /*分配给各叶结点权值*/     for(j=0;j<26;j++)     if (s3[i]==s1[j]) huffnode[i].weight=ww[j];     for (i=0;i<n-1;i++) /*构造哈夫曼树*/ 	{ 		n1=n2=MAXVALUE;         x1=x2=0;         for(j=0;j<n+i;j++) 		{  			if (huffnode[j].parent==-1 && huffnode[j].weight<n1) 			{ 				n2=n1;                 x2=x1;                 n1=huffnode[j].weight;                 x1=j;  			}             else             if (huffnode[j].parent==-1 && huffnode[j].weight<n2) 			{ 				 n2=huffnode[j].weight; x2=j;} 		}         huffnode[x1].parent=n+i;         huffnode[x2].parent=n+i;         huffnode[n+i].weight=huffnode[x1].weight+huffnode[x2].weight;         huffnode[n+i].lchild=x1;         huffnode[n+i].rchild=x2; 	}     for(i=0;i<n;i++) /*求每个叶结点的哈夫曼编码*/ 	{   		cd.start=n-1;         c=i;         p=huffnode[c].parent;         while (p!=-1) 		{    			if (huffnode[p].lchild==c)             cd.bit[cd.start]=0;             else             cd.bit[cd.start]=1;             cd.start--;             c=p;             p=huffnode[c].parent; 		}         for (j=cd.start+1;j<n;j++)         huffcode[i].bit[j]=cd.bit[j];         huffcode[i].start=cd.start; 	}     printf(" 各叶结点对应哈夫曼编码 : ");/*输出每个叶结点的哈夫曼编码*/     for(i=0;i<n;i++) 	{   		for(j=huffcode[i].start+1;j<n;j++)         printf("%d",huffcode[i].bit[j]);         printf(" "); 	}     printf("\n 电文的全部哈夫曼编码 : ");/*输出电文的全部哈夫曼编码*/     for(k=0;k<sum;k++)     for(i=0;i<n;i++)     if(s2[k]==s3[i]) 	{   		for(j=huffcode[i].start+1;j<n;j++)         printf("%d",huffcode[i].bit[j]);         printf(" "); 	}     printf("\n"); }  ____ error C4716: 'huffmantree' : must return a value

user: user-2
content: 你的函数没写返回值

user: user-3
content: //函数需要一个返回值 类型是HNODETYPE HNODETYPE huffmantree(char *s2,char s3[]) {   // do something      return (HNODETPE)RetVal; }
user-0 提问: Linux 下这段汇编 的几个疑问

回复:
user: user-1
content: 4.看错, 应该是0x8048000

user: user-1
content: 引用 6 楼 slutlifei 的回复:谢谢 zhao4zhong1 高人  gdb单步调试时，可以看到内存和寄存器的变化 你是怎么看到的？ 是使用其他工具的吗  再次 问题3 被高人解决   linux下 info reg可以看到寄存器的值,ni是单步执行 vc 下,有个窗口可以看寄存器

user: user-1
content: 1.上一函数栈顶esp由ebp保存,eax一般用来存返回值或入参,不用保存 2.xor异或 3.调三号中断 4.不是,变长指令每个指令占内存数不一样,好像没有一个字节的指令?~~

user: user-0
content: 谢谢 zhao4zhong1 高人  gdb单步调试时，可以看到内存和寄存器的变化 你是怎么看到的？ 是使用其他工具的吗  再次 问题3 被高人解决

user: user-2
content: int3 是进入调试的中断 在GDB中单步执行，看每步对内存和寄存器的影响。 layout src：显示源代码窗口 layout asm：显示反汇编窗口 layout regs：显示源代码/反汇编和CPU寄存器窗口 layout split：显示源代码和反汇编窗口

user: user-0
content: 这是一段Linux下的汇编哈 我只是把ATT格式改成了INTEL

user: user-3
content: "我查阅到ebx,ecx,edx,esi和edi一般都是放参数的，那么这段代码只push保存其中3个" 在win下这些参数会从右至左push进栈，这里我没看到，Linux下我不是太熟，不过貌似不会吧eax这种寄存器作为参数吧？，这是什么函数调用的汇编？

user: user-0
content: 非常感谢Ipcads 的热心回答 问题3,4还需等待高手解答  再加问一下问题1  你讲的eax,esp我明白了 我查阅到ebx,ecx,edx,esi和edi一般都是放参数的，那么这段代码只push保存其中3个， 后面ecx和edx为啥不保存，xor为啥也只有3个 不应该把这5个全赋0了再用？  eip好像是要指向正在运行指令的下一条，不是很清楚，但是不知为何这种情况下好像eip=0x8048002

user: user-4
content: 1 eax属于“易失存储器”，由于最后要放函数返回值，pop eax 无意义；4个pop后，esp 自动恢复，无需保存。 2 没错 3 调用3号中断（虽然我不知道3号具体是干嘛的） 4 不清楚，我还一直觉得是 0x8048000 。待大侠解答。
user-0 提问: 简单的C语言问题，虚心求教

回复:
user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-2
content: return((n<1||n>7) ? name[0] : name[n]);  n=1 时(n<1||n>7)为flase 返回的是name[n]即name[1]的内容，对应的字符串是Monday

user: user-3
content: static char *name[] 说明name是一个数组，数组的每个成员都是char *，即字符串指针 name[0]对应字符串 "Illegal day" 的首地址 name[1]对应字符串 "Monday" 的首地址

user: user-4
content: 指针即地址。只是输出的时候你%s输出会从指针指向的地址输出那段连续的内存里面的字符

user: user-5
content: 你的函数定义char* dayname()不就是说明返回一个指向char类型的指针吗？ 只是dayname[1]指向monday字符串的地址。

user: user-6
content: 返回的是指向monday的指针，这个指针就表示这个字符串， 用%s输出的时候，一次输出一串

user: user-7
content: 返回的就是指针，你理解的没错。字符串本身也可以理解成一个字符指针
user-0 提问: 新人求助（面试题）  局部变量地址问题

回复:
user: user-1
content: 引用 12 楼 zmlovelx 的回复:藏在深闺中的妹纸，如果带不出来就想泡很难。 变量也一样。

user: user-2
content: 返回了局部变量的地址，局部变量在函数结束时就消失了，因此对这个返回的地址进行操作是很危险的。 怎么改正：不要写这种无聊的代码。

user: user-3
content: 局部变量不能作为返回值返回，你研究下变量的作用于和生存周期就明白了

user: user-4
content: 引用 4 楼 max_min_ 的回复:1 传参代替 2 自己分配堆内存 3 static也可以 static刚看了这一章节，举个栗子： unsigned char * func(){  static unsigned char i = 0；         ++i;         return &i;  } 这就搞定了。

user: user-5
content: 如果没有被擦初，有可能能访问，但是不安全...菜鸟...请勿拍砖...

user: user-2
content: 这题是考static

user: user-6
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  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-7
content: 局部变量离开块作用域{}生命期就结束了。

user: user-8
content: 引用 17 楼 derekrose 的回复:使用智能指针 顶楼上 返回的函数指针封装进对象里，然后将释放写入析构函数。。然后对象的周期到了的时候，析构函数就会被调用，再然后那指针就被释放咯。。。好像智能指针就是这么搞的。

user: user-9
content: 使用智能指针

user: user-10
content: 这是作业题吧？

user: user-11
content: 感觉有点像 函数的返回值是个指针   嗯。在函数调用结束后，局部变量所占的内存被释放，虽然地址还在，只是地址里的内容就不好说了。。

user: user-8
content: 引用 10 楼 u012982053 的回复: 返回局部变量的地址值，但是这个地址指向的内容不能被操作，因为内存已经被释放 把最后句改为 因为内存已经不可预知咯。这样应该对了吧？

user: user-8
content: 以前一直以为不能使用， 原来还是能用嘛。就说。某个地址值指向的内存应该是固定的，还是能访问的。就是。。不可预知。

user: user-12
content: 藏在深闺中的妹纸，如果带不出来就想泡很难。 变量也一样。

user: user-8
content: 囧 刚刚没事去测试了下。。。发现能访问返回的地址 是否是因为系统不会擦除此地址指向的内存，只有当此内存再次被使用时，会被新的内容覆盖。这函数写出来 编译器会发出警告的， 说返回一个局部变量的地址。此内存不应该被这样使用，因为系统很可能将他分配给其他变量使用，这是一个不可预知的值。。。

user: user-8
content: 返回局部变量的地址值，但是这个地址指向的内容不能被操作，因为内存已经被释放

user: user-13
content: 局部变量不能将数据返回，想办法把局部变量的地址改成其他地方的地址，比如堆上的（malloc)、数据段上的（static，或全局变量）。

user: user-14
content: 又是作业题吧

user: user-15
content: 引用 4 楼 max_min_ 的回复:1 传参代替 2 自己分配堆内存 3 static也可以++1
user-0 提问: 关于指针的+1操作的问题

回复:
user: user-0
content: 引用 4 楼 max_min_ 的回复: //不管数组多长，这都是相差一个指针的长度的！ char *c[2] = {"1111111","22222222222"};  char *c1 = "1111111"; char *c2 = "22222222222"; 一针见血！我懂了版主~谢谢！

user: user-0
content: 引用 2 楼 user-3 的回复:sizeof(char*)==4 这肯定是没问题的。

user: user-1
content: //不管数组多长，这都是相差一个指针的长度的！ char *c[2] = {"1111111","22222222222"};  char *c1 = "1111111"; char *c2 = "22222222222";

user: user-2
content: 指针：32位机器上为4个字节

user: user-3
content: sizeof(char*)==4

user: user-0
content: @ max_min_