Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言二维数组，指针偏移

回复:
user: user-1
content: a原本数据类型是 int [3][2],当对a进行算数运算时，转换成指针数据类型是int （*）[2]，因此a加1，指针偏移量是2 * sizeof （int)  一般是8字节，其中2是二维数，4是int字节大小。如果看成矩阵，即第二行首址

user: user-2
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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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-3
content: a 是数组首地址 a+1是一维数组a[1]的首地址

user: user-4
content: 引用 5 楼 Mutable714 的回复:请问四楼，为什么a+1会指向第二个一维数组@cysccnu  这是C编译器定好的规则，你也可以把这个3行2列的数组看成是三个字符串，每个字符串含2*4(int为4个字节)个字符，a指向第一个字符串，a+1就指向第二个字符串，实质上字符串数组也确实是这样排列的，只不过这里的元素是int，编译器按4个字节为单位来处理，而对于字符串，编译器按单个字节来处理。

user: user-5
content: a不是指 a[0][0] a+1 也不会是 a[1][0] a++当然不行 会有error  这点东西都是稍微看看书就能弄懂的

user: user-6
content: 引用 1 楼 lin5161678 的回复:a不是指 a[0][0] a+1 也不会是 a[1][0] a++当然不行 会有error  这点东西都是稍微看看书就能弄懂的+1

user: user-7
content: 引用 5 楼 Mutable714 的回复:请问四楼，为什么a+1会指向第二个一维数组@cysccnu  c语言语法就是如此，编译器也是如此编译，就像英语的语法一样 int a[4]   是4个int类型的数组，a+1代表数组中第二个元素，即a[1]，步距为一个int类型的长度，4字节 int a[4][4]  是4个int a[4]类型的数组，a+1代表数组中第二个元素，即a[1][0]，步距为一个int a[4]类型的长度，16字节 你要知道这里面有个步距的概念（姑且这么理解吧，具体术语是啥我也不知道）  如果这么说你还无法理解，那你就想想char a[4]和int a[4]，前者步距为1字节，后者步距为4字节

user: user-8
content: int (*a)[10]; /* 二维数组相当于两个一维数组,第一个一位数组存放的是第二维每个数组的首地址！ 因此对于*a说每一个元素占用空间是对应位置第二维所有元素的占用空间之和！ 如果是int型 第二维共十个元素，则在tc中 *a每个元素占20字节 而第二维每个元素占2字节 那么a+1世界上是在原地址基础上偏移20字节 */

user: user-0
content: 请问四楼，为什么a+1会指向第二个一维数组@cysccnu

user: user-4
content: 数组a[3][2]在内存中其实是按三个一维数组排列的，a是数组首地址，所以a+1指向第二个一维数组，也就是a[1][0]。a是数组名，不能用来赋值，所以不能用a++，可以用a+1
user-0 提问: C语言在linux下

回复:
user: user-1
content: 可以试试：strace LoanPutFile  进行追踪，例如：strace ps输出： execve("/bin/ps", ["ps"], [/* 57 vars */]) = 0 brk(0)                                  = 0x809b000 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7766000 access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory) open("/usr/lib/mpi/gcc/openmpi/lib/tls/i686/sse2/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory) stat64("/usr/lib/mpi/gcc/openmpi/lib/tls/i686/sse2", 0xbfd83cc0) = -1 ENOENT (No such file or directory) open("/usr/lib/mpi/gcc/openmpi/lib/tls/i686/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory) 。。。。还有很多

user: user-2
content: 执行一下看看，或者就反编译喽

user: user-3
content: 将某路径文件发送到另一路径？（远程传输） 看打印信息和cmd参数 猜测的

user: user-4
content: 楼上两位的反编译恐怕做不到，最多也就是反汇编。用man LoanPutFile看这个命令有没有说明。

user: user-5
content: 反编译？  拍照-显示-截图 lz顺便再打个码吧
user-0 提问: expected specifier-qualifier-list before 'gts_char_t'

回复:
user: user-1
content: 没错误  我在vs2010上运行了下  无错

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

user: user-3
content: gts_char_t 在哪里出现的？
user-0 提问: 高手们，怎样把开源库的错误码给其他人？

回复:
user: user-1
content: 自己封装错误码，在头文件中用宏或者枚举的方式定义所有的错误码，再做好错误码和函数返回值的注释，这就可以很清楚的知道返回值的意义了

user: user-1
content: 自己封装错误码，在头文件中用宏或者枚举的方式定义所有的错误码，再做好错误码和函数返回值的注释，这就可以很清楚的知道返回值的意义了

user: user-2
content: 既然屏蔽了A，就自己定义错误码吧，只要把问题描述清楚了就行，把错误码返回给客户让客户明白错误原因

user: user-3
content: 和用户协商好？或者统一重新定义
user-0 提问: 求教

回复:
user: user-1
content: 引用 9 楼 qq_25942099 的回复:[quote=引用 1 楼 user-6 的回复:] 调试！！！！   VC6.0   怎么才能调试[/quote] 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 1 楼 user-6 的回复:调试！！！！   VC6.0   怎么才能调试

user: user-0
content: 引用 7 楼 qq_25942099 的回复:[quote=引用 2 楼 robertbo 的回复:] 自己debug跟踪一下结果就出来了，楼主得补一下基础知识  int b[N]={9,1,4,2,3,6,5,8,7},i; printf("%4d",b[i]); 这块i还没有初始化呢怎么就是用了呢   有啊，for 里面不是赋值么[/quote]  看错了

user: user-0
content: 引用 2 楼 robertbo 的回复:自己debug跟踪一下结果就出来了，楼主得补一下基础知识  int b[N]={9,1,4,2,3,6,5,8,7},i; printf("%4d",b[i]); 这块i还没有初始化呢怎么就是用了呢   有啊，for 里面不是赋值么

user: user-2
content: 问题楼上都说了，以后注意在使用变量前看看是否需要初始化

user: user-3
content: 粗略目测是i的问题，在函数内定义的局部变量编译器是不会自动初始化为0的（全局变量会初始化为0），因此i的值是一个随机数，那么b[i]则会出现访问越界的现象，于是崩溃 改正方法，将i赋值，并保证此值不会让b[i]访问越界

user: user-3
content: 粗略目测是i的问题，在函数内定义的局部变量编译器是不会自动初始化为0的（全局变量会初始化为0），因此i的值是一个随机数，那么b[i]则会出现访问越界的现象，于是崩溃 改正方法，将i赋值，并保证此值不会让b[i]访问越界

user: user-4
content: void main() { int b[N]={9,1,4,2,3,6,5,8,7},i; printf("%4d",b[i]);  b[i]中的i没有赋值

user: user-5
content: 自己debug跟踪一下结果就出来了，楼主得补一下基础知识  int b[N]={9,1,4,2,3,6,5,8,7},i; printf("%4d",b[i]); 这块i还没有初始化呢怎么就是用了呢

user: user-6
content: 调试！！！！
user-0 提问: C语言fopen打开文件问题（莫名其妙的问题）

回复:
user: user-1
content: 我猜是不是要E:\\file

user: user-2
content: 是你理解错了，一点也不莫名其妙 FILE * 本身不是 NULL，其指向的结构体中某字段可以是 NULL，因为你还没使用它呢

user: user-3
content: 楼主研究FILE结构体的成员的值有何意义？ 用fread,fwrite,fseek,ftell这些函数通过指向FILE结构体的指针能操作文件不够用？  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-4
content: 看了楼上一堆人的回答还是没懂lz你想问啥

user: user-5
content: 不明白你在问什么问题的飘过

user: user-6
content: 文件指针的值不是有吗 有什么问题?

user: user-7
content: 楼主去学一下C语言下FILE结构的声明吧，网上搜一搜也可以找到相关的资料；建议了解一下即可。
user-0 提问: 好不容易在win8上安装了vc++6.0,但是这个运行结果怎么回事，求大神指教，是兼容性还是其他问题

回复:
user: user-1
content: 刚试过，中文逗号是和你一样的情况。

user: user-1
content: 你在命令行里输入的1，8 的逗号是中文的，要输入英文的逗号才可以。 也就是命令行状态下不要开启中文输入法。

user: user-2
content: scanf("%d%d",&a,&b);//输入两个用空格间隔的整数

user: user-3
content: win8下不要用VC6了，如果仅仅是学C/C++，推荐c-free，如果学习VC，可以装VS，推荐2010及以上版本

user: user-4
content: 除非是万不得已，比如维护旧项目，否则早点放弃vc6吧。

user: user-0
content: 前辈请问为什用vc++6.0打开初始界面选择“文件——打开”的时候会突然停止工作呢，一直是这样，是因为在win8上的兼容性问题吗，已经将兼容性改为兼容win8了，还请前辈指教，谢谢！

user: user-5
content: 运行结果的问题，1楼是正解，VC停止运行的问题，是VC6.0在WIN8上的必然结果，既然选择在Win8上用VC6.0，就应该默默忍受VC6.0崩溃
user-0 提问: C语言能不能做类似JS的网页脚本语言？

回复:
user: user-1
content: 引用 20 楼 zhao4zhong1 的回复:细胞虽然不能编程，但不妨碍由细胞构成的人能编程！ 有时候为了纠正由各种细胞构成的人编程出的错，需要改造其身上某些部位的若干相关的细胞。

user: user-1
content: 细胞虽然不能编程，但不妨碍由细胞构成的人能编程！

user: user-2
content: C主要用来系统编程。

user: user-3
content: 最简单的纯C语言做的WEB页面：  1.使用C语言调用系统API监控80端口；  2.凡是有连接80端口的，按照HTTP协议，返回一个HTTP头以及主体：<html>Hello World!</html>。  打完收工。

user: user-1
content: 虚拟机中的汇编语言是C/C++编的。

user: user-1
content: SQL语言是C/C++编的。

user: user-4
content: 语言都有自己适合的一块领域，在 web 开发中 java/asp.net/php 都比 c++ 更适合。 c++ 做 web 后台开发还可勉为其难（现在恐怕也没人这么用了），做前端脚本语言恐怕不行吧。 在 html5 中，默认的脚本语言是 JavaScript，这已经成为标准。

user: user-5
content: 引用 12 楼 Raffin 的回复:[quote=引用 9 楼 luciferisnotsatan 的回复:] JS用虚拟机，部署方便。不同的服务器只要一次性装完对应的虚拟机就行了。 C要编译不同的平台版本才能部署。  不同的语言有不同的用途，何必要通吃呢？不然直接用汇编来写代码，用什么C呀。  虚拟机要安装一个软件，这个软件不跨平台。 如果你要C跨平台，开发一个类似的“C虚拟机”不就行了。  语言作用都是类似的，同样的功能就应该用同样的语法。 汇编和C的关系，和C和JAVA，C#的关系不一样。[/quote]  那这还叫C么？微软开发了个基于。net的C++/CLR，除了用作native C++和.net粘合剂外，没什么人会用这东西作为开发语言。因为，用这个C++变种，还不如直接用C#。  为什么你觉得汇编会不一样的？为什么不能开发一个汇编编译器，创建一个汇编语言变种，然后把这个变种翻译成对应CPU汇编？  同样的道理，做WEB你打算用数据库么？为什么要用数据库，用SQL语言？干嘛不直接用C语言写个数据管理的库（这里不是指用C来开发一个数据库，而是一组动态库，静态库），提供各种函数来实现SQL做的事。

user: user-6
content: 引用 楼主 Raffin 的回复:讨论下C语言的应用吧，除了开发底层驱动外，还被应用到哪里比较多？ 在开发大型应用程序尤其是WEB程序时，C语言好像不像JAVA有能够快速开发的框架和工具。 大型应用程序？多大型？你即便淘宝，人家JAVA的功夫也都是放在自己改操作系统，自己剪虚拟机，高精尖的也都是放在C层面，跟你那什么Spring,Hibernate这些乱七八糟框架没半毛钱关系。  人家都是倾向于C做底层，上边再粘DSL之类的。比如搭个lua虚拟机，很简单，但你立马就能用lua写脚本了。再比如，ngix是基于C的，再写个模块，粘上lua，立马你也能用lua写web程序了

user: user-0
content: 引用 9 楼 luciferisnotsatan 的回复:JS用虚拟机，部署方便。不同的服务器只要一次性装完对应的虚拟机就行了。 C要编译不同的平台版本才能部署。  不同的语言有不同的用途，何必要通吃呢？不然直接用汇编来写代码，用什么C呀。  虚拟机要安装一个软件，这个软件不跨平台。 如果你要C跨平台，开发一个类似的“C虚拟机”不就行了。  语言作用都是类似的，同样的功能就应该用同样的语法。 汇编和C的关系，和C和JAVA，C#的关系不一样。

user: user-0
content: 引用 6 楼 sinservice 的回复:我刚写了一个 这么屌

user: user-7
content: 我刚写了一个

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:js是C/C++编的。  大神你是从事什么工作的？

user: user-0
content: 引用 2 楼 wangliangffaflgh 的回复:C语言其实可以做WEB开发，可以写CGI程序，但是这种技术已经比较老了 给你个链接关注下http://blog.sina.com.cn/s/blog_793598f80102v4mw.html  CGI我知道，原来也是用C语言写的。 但是CGI后来被SERVLET取代了，从代码上讲确实CGI比较麻烦。 我比较在意的是为什么没人用C语言去开发一些方便好用的工具，比如JSP和SERVLET。

user: user-8
content: C语言做底层硬件开发，嵌入式开发应用开始蛮多的

user: user-8
content: C语言其实可以做WEB开发，可以写CGI程序，但是这种技术已经比较老了 给你个链接关注下http://blog.sina.com.cn/s/blog_793598f80102v4mw.html

user: user-1
content: js是C/C++编的。

user: user-9
content: C语言除了搞硬件开发、系统开发，主要就是用来开发其它语言的，你可以随便说一门语言，不管C#、JAVA以及各种脚本语言python、Javascript、lua、以及各种标记语言HTML、XML、CSS，几乎都是跑在C语言的头上，由C语言来解析、解释、执行。

user: user-10
content: 最近再用，poco c++库。开打速度很快。有很多框架。什么，json xml http tcp 加解密 smtp 等常用功能框架都有的。

user: user-5
content: JS用虚拟机，部署方便。不同的服务器只要一次性装完对应的虚拟机就行了。 C要编译不同的平台版本才能部署。  不同的语言有不同的用途，何必要通吃呢？不然直接用汇编来写代码，用什么C呀。
user-0 提问: malloc和free问题

回复:
user: user-1
content: free Deallocates or frees a memory block.  void free( void *memblock );  Function Required Header Compatibility  free <stdlib.h> and <malloc.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  None  Parameter  memblock  Previously allocated memory block to be freed  Remarks  The free function deallocates a memory block (memblock) that was previously allocated by a call to calloc, malloc, or realloc. The number of freed bytes is equivalent to the number of bytes requested when the block was allocated (or reallocated, in the case of realloc). If memblock is NULL, the pointer is ignored and free immediately returns. Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by calloc, malloc, or realloc) may affect subsequent allocation requests and cause errors.  After a memory block has been freed, _heapmin minimizes the amount of free memory on the heap by coalescing the unused regions and releasing them back to the operating system. Freed memory that is not released to the operating system is restored to the free pool and is available for allocation again.  When the application is linked with a debug version of the C run-time libraries, free resolves to _free_dbg. For more information about how the heap is managed during the debugging process, see Using C Run-Time Library Debugging Support.  Example  /* MALLOC.C: This program allocates memory with  * malloc, then frees the memory with free.  */  #include <stdlib.h>         /* For _MAX_PATH definition */ #include <stdio.h> #include <malloc.h>  void main( void ) {    char *string;     /* Allocate space for a path name */    string = malloc( _MAX_PATH );    if( string == NULL )       printf( "Insufficient memory available\n" );    else    {       printf( "Memory space allocated for path name\n" );       free( string );       printf( "Memory freed\n" );    } }   Output  Memory space allocated for path name Memory freed   Memory Allocation Routines  See Also   _alloca, calloc, malloc, realloc, _free_dbg, _heapmin

user: user-2
content: 第一个用法完全错了  别说释放内存  有时候 程序崩溃都是完全正常的事情   第二个可以那样用 这种做法是 const 的范例使用方式了

user: user-2
content: 引用 1 楼 zmlovelx 的回复:第一个最好用free p[]; 不过内置类型的用free p也是可以的 第二个，只是部分限定，其内部还是有办法绕过修改的。别闹  你以为这是 new / delete? free 是函数好不好 ()  不能省略

user: user-3
content: 第一个不能完全释放吧，会泄露的。 第二个可以写点小代码试试。

user: user-0
content: 中括号我只在c++中delete p[]释放数组空间的时候看到啊。C语言中free也有这样的用法吗？ 第二个修改能跟我讲讲怎么实现吗？

user: user-4
content: 第一个最好用free p[]; 不过内置类型的用free p也是可以的 第二个，只是部分限定，其内部还是有办法绕过修改的。
user-0 提问: 求一个整数i的二进制

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！

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

user: user-3
content: 假设一个数字32bit长度，就是从0-31，(1 << j)  这个不就是只有第j位为1，其余都是0，所以((1 << j) & i就可以取出i的第j位
user-0 提问: 请问下VC6下载哪个SDK才能编译WINDOWS核心编程第四版的源码？

回复:
user: user-1
content: http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.1.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.2.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.3.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.4.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.5.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.6.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.7.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.8.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.9.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.10.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.11.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.12.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.13.cab http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.bat http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/Extract.exe Windows Server 2003 Platform SDK Full Download  支持VC6的最高版本的SDK

user: user-2

user: user-2
content: 当然是SDK6啦。
user-0 提问:  如何将无符号整形变量的5~7bit 置为二进制的'101'

回复:
user: user-1
content: 思路： 让你的这个数 & a 其中a为5到7位是0，其他位全是1 再将结果 & b 其中b是5-7位分别是101，其他位是0

user: user-2
content: 如果是32bits系统

user: user-2
content: 我想应该这样： a = (a & 0xFF1F) | 0x00A0 把这三位先清零 再或上101 不知道还有没有其他更好的法子。。。

user: user-3
content: 仅供参考#include <stdio.h>  #define WIRTE_UINT(des ,x ,pos ,len)  (                                   \     (des)                                                                 \     &                                                                     \        ~(                                /* 除要修改的位为0，其余都为1 */ \             (                                                             \                 (1<<(len))-1             /* 长度为len位的1             */ \             )                                                             \             <<(32-(pos)-(len))           /* 左移32-(pos)-(len)位       */ \         )                                                                 \     |                                                                     \         (                                                                 \             (x)                                                           \             <<(32-(pos)-(len))                                            \         )                                                                 \ ) #define READ_UINT(src ,pos ,len)      (                                   \     (                                                                     \         (                                                                 \             (unsigned)(src)                                               \         )                                                                 \         >>(32-(pos)-(len))               /* 逻辑右移32-(pos)-(len)位   */ \     )                                                                     \     &                                                                     \     (                                                                     \         (1<<(len))-1                     /* 长度为len位的1             */ \     )                                                                     \ )  int main()                              //                1111111111222222222233 {                                       //bit   01234567890123456789012345678901     unsigned int des = 0x661;           //      00000000000000000000011001100001     unsigned int r;      des = WIRTE_UINT(des ,3 ,28 ,2);    //      00000000000000000000011001101101     printf("des==0x%08X\n",des);     r = READ_UINT(des ,28 ,2);     printf("r==%d\n",r);     return 0; } //des==0x0000066D //r==3

user: user-4
content: 引用 2 楼 akirya 的回复:x &= 1010000 呃 写错了。 看 #1

user: user-4
content: x &= 1010000

user: user-5
content: 可以用mask的方法来做吧，对于UINT变量a a = (a | 0x000000E0) & 0xFFFFFFBF
user-0 提问: 求助，有没有什么C/C++的方法，可以直接把数据流程图映射为可执行模块。

回复:
user: user-1
content: LabView、UML、……属于企图使用“图形符号拖拽”代替“纯文本脚本语言”编程的系统。  推荐使用Source Insight软件维护大型（比如源代码超过5万行）项目。

user: user-0
content: @赵4老师 还是不是很明白呀，可能我层次还不够，完全不知道你说的是什么意思。

user: user-1
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-1
content: 再次证明图形符号拖拽式编程是一个神话！
user-0 提问: 谁能帮我分析一下下面的红色标注的代码的作用，为什么不要这一段代码会出错，它后面的代码为什么不能够运行下去。如果要运行需要其它的文件吗？

回复:
user: user-1
content: http://bbs.csdn.net/topics/390469280

user: user-1
content: 命令行参数个数不是4的时候，后续argv[n]的值都不确定。
user-0 提问: “驱动程序提供的例程”这句话中 “例程”具体是什么意思？

回复:
user: user-1
content: 驱动提供的API

user: user-2
content: 一段处理程序这个叫法听过没？你可以简单理解为函数调用！由于执行这段程序片不具有进程或线程上下文，因此不能称作进程或线程！

user: user-3
content: “例菜”是啥意思？

user: user-4
content: routine: 可理解为函数

user: user-5
content: routine

user: user-6
content: 可以更简单的理解为一个回调函数.

user: user-3
content: 常用的可供调用的子程序。

user: user-7
content: 相当于接口，或者更形象点，相当于BIOS的中断。

user: user-8
content: routines的中译吧 没什么特别意思
user-0 提问: 请教用汉字替换数字，写好的程序不知道哪里出了问题，求指点

回复:
user: user-1
content: #include "stdafx.h" #include<stdio.h> #include<stdlib.h> #include<cstring> #include"locale"//这个头文件里有setlocale函数 void Convert(wchar_t *a);  int main() { 	setlocale(LC_ALL, "chs");//设置语言为中文，否则文件中存在的中文会变成乱码 	FILE *fp; 	wchar_t str[30]; 	char *p; 	if ((fp = fopen("D:\\file_test.txt", "r")) == NULL){//以只读打开 		printf("打开文件失败!\n"); 		exit(0); 	} 	fgetws(str, 30, fp); 	for (int i = 0; i<30; i++){ 		if (str[i] >= 48 && str[i] <= 57) 		{ 			Convert(&str[i]); 		} 	} 	fclose(fp);  	if ((fp = fopen("D:\\file_test.txt", "w")) == NULL){//以只写打开 		printf("打开文件失败!\n"); 		exit(0); 	} 	fwprintf(fp, str); 	fclose(fp); 	return 0; } void Convert(wchar_t *a) { 	switch (*a){ 	case L'1': 		*a = L'一'; 		break; 	case L'2': 		*a = L'二'; 		break; 	case L'3': 		*a = L'三'; 		break; 	case L'4': 		*a = L'四'; 		break; 	case L'5': 		*a = L'五'; 		break; 	case L'6': 		*a = L'六'; 		break; 	case L'7': 		*a = L'七'; 		break; 	case L'8': 		*a = L'八'; 		break; 	case L'9': 		*a = L'九'; 		break; 	} }

user: user-2
content: 汉字占两个或多个字节，怎么可能直接替换
user-0 提问: 网络流量控制

回复:
user: user-0
content: to u011391040 您好  “http://bbs.pediy.com/showthread.php?t=173871” 这个上面貌似没有讲关于流量控制的吧!

user: user-1
content: 网络流量查看比较简单，可以通过winpcap提供的借口或者原始套接字实现，流量控制可以通过ndis驱动或者wpfwang驱动来实现，可以参考http://bbs.pediy.com/showthread.php?t=173871。
user-0 提问: 开心的小明。。。求算法思路，望大神指点一下，谢谢

回复:
user: user-1
content: 引用 8 楼 Raffin 的回复:补充下，先根据j1到jk排序 然后计算v1到vk，取最接近价格总和的，如果v1加到v(n-1)超过了价格总和，则跳过v(n-1)，继续累加vn，直到遍历到k。  物品1：重要度3，价格500，乘积1500 物品2：重要度4，价格100，乘积400 物品3：重要度1，价格1000，乘积1000 物品4：重要度4，价格300，乘积1200 物品5：重要度2，价格400，乘积800  排序后是物品1，物品4，物品3，物品5，物品2，假设总价格不能超过1000元。 按照这个排序，价格分别是500元，100元，1000元，300元，400元。 那么最优解就是500+100+300，即900元，也就是物品1，物品4和物品5，重要度*价格乘积最大，达到3500。  我当时做这道题的时候也是这么想的，但是发现实际中不能这么做，因为有可能会出现以下情况： 剩余钱数：1000 物品1：重要度4，价格1000，乘积4000 物品2：重要度5，价格400，乘积2000 物品3：重要度5，价格500，乘积2500 排序应该是物品1>物品3>物品2 按你的方法是购买物品1 但明显应该购买物品3+物品2利益最大  所以还是老老实实应用单纯形法好了。。。

user: user-2
content: 引用 1 楼 user-7 的回复:这不是典型的线性规划吗, 最常用的算法应该是单纯形法 就是这样！

user: user-3
content: 引用 9 楼 qq_25645261 的回复:[quote=引用 8 楼 Raffin 的回复:] 补充下，先根据j1到jk排序 然后计算v1到vk，取最接近价格总和的，如果v1加到v(n-1)超过了价格总和，则跳过v(n-1)，继续累加vn，直到遍历到k。  物品1：重要度3，价格500，乘积1500 物品2：重要度4，价格100，乘积400 物品3：重要度1，价格1000，乘积1000 物品4：重要度4，价格300，乘积1200 物品5：重要度2，价格400，乘积800  排序后是物品1，物品4，物品3，物品5，物品2，假设总价格不能超过1000元。 按照这个排序，价格分别是500元，100元，1000元，300元，400元。 那么最优解就是500+100+300，即900元，也就是物品1，物品4和物品5，重要度*价格乘积最大，达到3500。  我当时做这道题的时候也是这么想的，但是发现实际中不能这么做，因为有可能会出现以下情况： 剩余钱数：1000 物品1：重要度4，价格1000，乘积4000 物品2：重要度5，价格400，乘积2000 物品3：重要度5，价格500，乘积2500 排序应该是物品1>物品3>物品2 按你的方法是购买物品1 但明显应该购买物品3+物品2利益最大  所以还是老老实实应用单纯形法好了。。。[/quote]  是这样的，多谢提醒。 那你看这样行不行，算出重要度/价格最高的，然后排序（也就是性价比最高的）。

user: user-4
content: 从现实角度来看，怎么会有人买个东西弄的这么蛋疼，肯定强迫症患者晚期0.0

user: user-3
content: 补充下，先根据j1到jk排序 然后计算v1到vk，取最接近价格总和的，如果v1加到v(n-1)超过了价格总和，则跳过v(n-1)，继续累加vn，直到遍历到k。  物品1：重要度3，价格500，乘积1500 物品2：重要度4，价格100，乘积400 物品3：重要度1，价格1000，乘积1000 物品4：重要度4，价格300，乘积1200 物品5：重要度2，价格400，乘积800  排序后是物品1，物品4，物品3，物品5，物品2，假设总价格不能超过1000元。 按照这个排序，价格分别是500元，100元，1000元，300元，400元。 那么最优解就是500+100+300，即900元，也就是物品1，物品4和物品5，重要度*价格乘积最大，达到3500。

user: user-3
content: 引用 6 楼 Raffin 的回复:首选需要对所有物品的重要度*价格的乘积进行排序，由于你并没有明确每样东西的价格和重要度，所以我假设j1到jk是按照重要度*价格降序排列的。 这时问题变成j1到jk要尽可能的多，并且价格总和不能超过某个值（本题里是30000）。 j1到jk要尽可能的多的同时还要压制价格，那么每样东西的数量只可能是1，因为数量多并不能帮助你提升重要度*价格的总和。 这时你只要计算v1+v2+……vn，让他最接近30000就行了（注意这里的v1是j1到jk排序后的j1里的v1）。 好像单样物品价格很高时这么算有问题，加上这件物品价格会超，如果去掉这件物品又不是最优解。希望有高人修正补充。

user: user-3
content: 首选需要对所有物品的重要度*价格的乘积进行排序，由于你并没有明确每样东西的价格和重要度，所以我假设j1到jk是按照重要度*价格降序排列的。 这时问题变成j1到jk要尽可能的多，并且价格总和不能超过某个值（本题里是30000）。 j1到jk要尽可能的多的同时还要压制价格，那么每样东西的数量只可能是1，因为数量多并不能帮助你提升重要度*价格的总和。 这时你只要计算v1+v2+……vn，让他最接近30000就行了（注意这里的v1是j1到jk排序后的j1里的v1）。

user: user-0
content: 顶一下

user: user-5
content: 这是01背包吧，多了个要记录选择物品 下午回过一直不成功

user: user-6
content: 百度：“背包问题”。完结。

user: user-7
content: 这不是典型的线性规划吗, 最常用的算法应该是单纯形法
user-0 提问: 这个栈销毁代码有没有危险

回复:
user: user-1
content: 单处理器下没问题

user: user-2
content: malloc和free对应才能行。

user: user-3
content: 引用 2 楼 zhao4zhong1 的回复:CPU的内存保护机制对次有例外确保其没有危险。 对此

user: user-4
content: 怎么会不停free的?

user: user-5
content: 保证不会在这个情况做*top的话那没啥问题

user: user-3
content: CPU的内存保护机制对次有例外确保其没有危险。

user: user-6
content: 栈不是用数组做的吗，为什么还需要循环释放呢，直接找到起始地址 free 一下就行了吧。
user-0 提问: 在pthread中，joinable的thread如果不使用thread_join等待其自然结束 占用的资源比使用后少

回复:
user: user-1
content: 你创建了PTHREAD_CREATE_JOINABLE的线程，却不用pthread_join.既然不用join就创建detach线程吧。 要joinable线程要调用pthread_join之后才会回收资源。还有一个问题就是你用的pthread的win32版本，可能效果会不一样，它是用windows的线程模型实现的，join等待就需要让线程进入等待状态，会使用内核对象。  最好试试linux的pthread,开多个线程.还是要说一下,joinable本来就是要用来等待的，却不等待，用法本身就有问题。  http://linux.die.net/man/3/pthread_create   Only when a terminated joinable thread has been joined are the last of its resources released back to the system. When a detached thread terminates, its resources are automatically released back to the system: it is not possible to join with the thread in order to obtain its exit status. Making a thread detached is useful for some types of daemon threads whose exit status the application does not need to care about. By default, a new thread is created in a joinable state, unless attr was set to create the thread in a detached state

user: user-2
content: 个人认为, 是否join线程与内存消耗多少没什么关系. 你的实验多多少少说明了这个问题. 我想官方说线程需要join是有原因的,个人在实验C++标准库提供的std::thread类时,发现如果不等线程完成, 就关闭应用, 调试时会弹出错误对话框. 为防止出现这种情况, 我都会detach那些不去等待的线程.
user-0 提问: 在解决离散型问题，基本GA和基本PSO算法的比较？

回复:
user: user-1
content: 百度搜相关关键字。

user: user-2
content: 请问，pso优化pts算法降低系统峰均比，程序怎么写，跪求大神。万分感激。

user: user-0
content: 引用 5 楼 user-3 的回复:[quote=引用 4 楼 u013599381 的回复:] [quote=引用 1 楼 user-3 的回复:] 我研究过, 1.GA是比较复杂的，PSO相对简单 2.PSO可能陷入局部最优（特别是对于多峰函数），GA能找到全局最优。 3.PSO收敛速度会快一些，毕竟它简单，不像GA要交叉、变异 综合以上，推荐你好好研究GA-PSO，将交叉和变异的思想引入到PSO中，这样能综合两者的优点！  谢谢亲~这么详细的介绍~现在在研究一个和TSP相近的离散组合优化问题，初试PSO算法，加入了交叉操作，却发现多次迭代得出的结果还不如GA，特别容易陷入局部最优。按编的情况来说，原以为pso是该更快更好的得到结果的。。。所以很困惑……看来初学者还有很长的路要走啊！[/quote] PSO就是能容易陷入局部最优，有个好的粒子找到最好解后，大家都往它那儿跑。。所以就容易陷入。 可以有3种混合思想来改进 1.混沌粒子群 2.免疫粒子群 3.遗传粒子群（交叉可以采用实数交叉，把变异也一起引入，这样效果会大大改变）[/quote]  谢啦~这三种思想会尝试加入的！继续研究和实验，以后再和您交流啦~

user: user-3
content: 引用 4 楼 u013599381 的回复:[quote=引用 1 楼 user-3 的回复:] 我研究过, 1.GA是比较复杂的，PSO相对简单 2.PSO可能陷入局部最优（特别是对于多峰函数），GA能找到全局最优。 3.PSO收敛速度会快一些，毕竟它简单，不像GA要交叉、变异 综合以上，推荐你好好研究GA-PSO，将交叉和变异的思想引入到PSO中，这样能综合两者的优点！  谢谢亲~这么详细的介绍~现在在研究一个和TSP相近的离散组合优化问题，初试PSO算法，加入了交叉操作，却发现多次迭代得出的结果还不如GA，特别容易陷入局部最优。按编的情况来说，原以为pso是该更快更好的得到结果的。。。所以很困惑……看来初学者还有很长的路要走啊！[/quote] PSO就是能容易陷入局部最优，有个好的粒子找到最好解后，大家都往它那儿跑。。所以就容易陷入。 可以有3种混合思想来改进 1.混沌粒子群 2.免疫粒子群 3.遗传粒子群（交叉可以采用实数交叉，把变异也一起引入，这样效果会大大改变）

user: user-0
content: 引用 1 楼 user-3 的回复:我研究过, 1.GA是比较复杂的，PSO相对简单 2.PSO可能陷入局部最优（特别是对于多峰函数），GA能找到全局最优。 3.PSO收敛速度会快一些，毕竟它简单，不像GA要交叉、变异 综合以上，推荐你好好研究GA-PSO，将交叉和变异的思想引入到PSO中，这样能综合两者的优点！  谢谢亲~这么详细的介绍~现在在研究一个和TSP相近的离散组合优化问题，初试PSO算法，加入了交叉操作，却发现多次迭代得出的结果还不如GA，特别容易陷入局部最优。按编的情况来说，原以为pso是该更快更好的得到结果的。。。所以很困惑……看来初学者还有很长的路要走啊！

user: user-3
content: 第一张图是GA-PSO的。。

user: user-3
content: 基于GA-PSO算法求解TSP问题的最短总距离为463.6541km,而用GA求解最短总距离为624.7155km，距离缩短了161.0614km,进而缩短了交通的费用，从而我们可以知道GAPSO算法比GA算法的寻优能力更强，所找到的解更好； 其次，我们从两个图的最终规划路线果来看，发现GA-PSO算法规划的路线比较平稳，没有特别长的路线，而在GA规划的路线中，发现了好几条较长的路线，并且路线之间的交叉是有好几个，然后GA-PSO只有一个，这就说明了，GA-PSO所找到规划路线，远远优胜于GA规划的路线。

user: user-3
content: 我研究过, 1.GA是比较复杂的，PSO相对简单 2.PSO可能陷入局部最优（特别是对于多峰函数），GA能找到全局最优。 3.PSO收敛速度会快一些，毕竟它简单，不像GA要交叉、变异 综合以上，推荐你好好研究GA-PSO，将交叉和变异的思想引入到PSO中，这样能综合两者的优点！
user-0 提问: 为什么窗口总是不显示？

回复:
user: user-1
content: 楼主是叫大家帮他猜一猜. 我猜:代码内部是不是出现死循环了!

user: user-2
content: 无图无真相，没码没办法； 求看看具体代码。

user: user-3
content: 请查看窗口的消息响应函数的执行出现了问题。我想应该是这样的。。。

user: user-4
content: 把代码发来看看

user: user-5
content: Setting a Breakpoint on a Message Received by a Windows Function You can set message breakpoints to stop the debugger when a particular WndProc function message is received.  Note   Message breakpoints work only on x86- or Pentium-based systems.  To set a breakpoint on a message   From the Edit menu, click Breakpoints.  The Breakpoints dialog box appears.  Click the Messages tab.   In the Break At WndProc text box, type the name of the Windows function.  If you are setting a breakpoint during a debug session, the list contains the exported functions in your project.   In the Set One Breakpoint For Each Message To Watch list box, select the message.   To set another breakpoint, press ENTER, and then repeat steps 3 and 4.  The Breakpoints list displays the currently active breakpoints.  Click OK to set the breakpoints.  Note If you interrupt execution while Windows or other system code is running, the results can be unpredictable.
user-0 提问: 请求告知这个警告的原因

回复:
user: user-1
content: 没写强转，就是隐式转换。但从字符指针到整数的隐式转换，将产生警告。

user: user-2
content: #include <stdio.h>  int main() { 	int i; 	int n=0; 	char s[20]="3264"; 	for (i = 0;s[i] && s[i] >= '0' && s[i] <= '9'; ++i) 		n = n * 10 + (s[i] - '0'); 	printf("%d", n); 	return 0; }

user: user-3
content: 好奇异的程序 数组s未初始化； 对数组成员进行诡异的赋值

user: user-4
content: s[20] = "3264"; s[20]只是一个字符的位置，而且还是越界的，你赋值给它一个字符串是要闹哪样？

user: user-5
content: 数组不能整体赋值，具体请看三楼，还有其他的回答。 编译应该会出错，不是警告。

user: user-6
content: s[20] = ’3‘（单引号），这样才是正确的，因为第每一个元素是char型的  另外，s[20]是指的里面的21个元素，而你的申请的s只有20个元素，从s[0]到s[19]  如果想复制字条串，用strcpy_s  如果觉得麻烦，建议用标准模板库里的string，这样就非常方便了

user: user-7
content: char s[20]; s[20] = "3264";  越界了。而且s[20]是char类型，却赋了个字符串给它。  如果你想复制字符串的话，用strcpy

user: user-8
content: 如果楼主弄明白了，请告诉我一声，顺便也给点分。

user: user-9
content: int main(void) {     int n, i; 	char s[] = {'3','6','2','4'};      n = 0;     for (i = 0; s[i] >= '0' && s[i] <= '9' ; ++i)         n = n * 10 + (s[i] - '0');     printf("%d", n);  	system("pause");     return 0; } 你看这样行不

user: user-10
content: char s[20]="3264";  //数组的初始化语句应该是这样，不能分开变成你代码里的两条语句。
user-0 提问: 关于switch的循环，求帮助

回复:
user: user-0
content: 引用 2 楼 neverthinkaboutit 的回复:如楼上的... while(1)		 //永真循环 { 	scanf("%d", &choose);			//接受输入数据 	if(choose > 5 || choose < 0)		//判断输入是否合法 	{ 		printf("input error, please input again.!");		 		continue;		//本次结束，进入下次循环，再输入 	} 	switch(choose) 	{ 		case 0:return 0;		//如果为零则退出,结束输入，结束条件 		case 1:... 		case 2:... 			... 		default:... 	} } 好的我试试，谢谢

user: user-0
content: 引用 1 楼 a1193561652 的回复:do {     scanf(...);     switch(choose);     case...     case...     case... }while(choose>5)试试do...while循环。 好的，我试试，谢谢。

user: user-1
content: 用goto语句应该也可以把

user: user-2
content: 如楼上的... while(1)		 //永真循环 { 	scanf("%d", &choose);			//接受输入数据 	if(choose > 5 || choose < 0)		//判断输入是否合法 	{ 		printf("input error, please input again.!");		 		continue;		//本次结束，进入下次循环，再输入 	} 	switch(choose) 	{ 		case 0:return 0;		//如果为零则退出,结束输入，结束条件 		case 1:... 		case 2:... 			... 		default:... 	} }

user: user-3
content: do {     scanf(...);     switch(choose);     case...     case...     case... }while(choose>5)试试do...while循环。
user-0 提问: 下面这段代码，为什么保存后，再读取，除了最后一个录入的其他都是乱码。

回复:
user: user-0
content: 虽然没能解决我的问题，还是谢谢各位的回答，以下是我在网上找来的答案，希望能给其他有类似问题的提供参考： void open_file(struct book *arr,char *p)//打开文件 { while(count<BOOKS&&fread(arr+count,sizeof(struct book),1,fp)==1) count++; }

user: user-1
content: 楼主添加几个记录，然后打开相应的文件查看，看看里面的内容，我打开之后就出现乱码 （我是换了一下头文件，让程序运行，"stdjar.h"哪有？） 之前也写了一个类似这样的程序，也出现过这个问题。 请楼主细心看看，对比一下： 1.写入一个或几个记录，保存退出，打开看看文件中的记录是什么样的 2.再次运行，再添加一个或几个记录，保存，对比文件中的记录格式是不是一致 我写的那个是读取文件记录多了一个'\n',导致格式不一致，然后就乱码了！

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 fopen(...,"wb"); fseek fwrite fclose  fopen(...,"rb"); fseek fread fclose我感觉也是这个读取和写入有问题，这位老师的回答我也能大概看明白，可是写不出来，新手对fseek不是很了解，望大神能把这两个代码写出来，万分感谢。

user: user-2
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 fopen(...,"wb"); fseek fwrite fclose  fopen(...,"rb"); fseek fread fclose
user-0 提问: void loadimage(IMAGE *,LPCTSTR,int,int,bool）

回复:
user: user-1
content: 表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串

user: user-2
content: 如果你的工程是多字节字符集，LPCTSTR就是const char * 如果你的工程是Unicode字符集，LPCTSTR就是const wchar_t * 总之这个参数就是需要传入一个字符串的意思
user-0 提问: 问几个算法复杂度的问题

回复:
user: user-1
content: >其实这些定理是不是在离散数学里面说明的 不是。本身是解析数论的东西，但是这几个结论直接拿来用就是了。  >至于那个原文。。。就是我一开始说的那个几句话- - 你转述的就已经不是原文了。

user: user-0
content: 引用 4 楼 FancyMouse 的回复:>其实这些定理是不是在离散数学里面说明的 不是。本身是解析数论的东西，但是这几个结论直接拿来用就是了。  >至于那个原文。。。就是我一开始说的那个几句话- - 你转述的就已经不是原文了。  引用 4 楼 FancyMouse 的回复:>其实这些定理是不是在离散数学里面说明的 不是。本身是解析数论的东西，但是这几个结论直接拿来用就是了。  >至于那个原文。。。就是我一开始说的那个几句话- - 你转述的就已经不是原文了。     这是原文。。。。不知道中文版的翻译有没有跑偏。。。

user: user-0
content: 引用 2 楼 FancyMouse 的回复:>比如：Eratosthenes的算法为什么时间复杂度是NloglogN? 筛是因为n(1/2+1/3+1/5+1/7+...)，里面是所有质数的倒数和。这个有Mertens定理说括号里是O(loglogn)的（而且是确界）。  >为什么要这样表示呢 因为就是那个结果  >难道在算法分析的情况中，这种情况不用分类讨论的吗？ 你原来那个题不看原文不好说。但是一般做算法的时候只看数据足够大的时候的表现。  >怎么才能更好地学好算法分析呢？ 静下心来看数学，不要忘了写代码。  额，其实这些定理是不是在离散数学里面说明的，但是我不是一名计算机专业的学生，是不是要先学离散数学学这些就快一点的？至于那个原文。。。就是我一开始说的那个几句话- -，我也摸不着头脑

user: user-1
content: >比如：Eratosthenes的算法为什么时间复杂度是NloglogN? 筛是因为n(1/2+1/3+1/5+1/7+...)，里面是所有质数的倒数和。这个有Mertens定理说括号里是O(loglogn)的（而且是确界）。  >为什么要这样表示呢 因为就是那个结果  >难道在算法分析的情况中，这种情况不用分类讨论的吗？ 你原来那个题不看原文不好说。但是一般做算法的时候只看数据足够大的时候的表现。  >怎么才能更好地学好算法分析呢？ 静下心来看数学，不要忘了写代码。

user: user-2
content: 学一学数学。
user-0 提问: 请教一下各位学习C语言的平台问题？

回复:
user: user-1
content: 用VS当然比较好

user: user-2
content: 我都试过,还是推荐vc++ 2010

user: user-0
content: 引用 3 楼 hxl199109 的回复:vc++ 6.0 版本有点老，开始还是挺适合的，VS太大了，是集成了多种开发语言的IDE，还是比较 方便的 谢谢推荐。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装 谢谢老师的回答

user: user-0
content: 引用 1 楼 user-5 的回复:gcc 或 clang 吧。 另外 c++ 和 c 不是先后关系，如果你的最终目的是学 c++，不需要先学 c 的，实际上不学可能反而更好一些。 感谢回答。

user: user-3
content: http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装

user: user-4
content: vc++ 6.0 版本有点老，开始还是挺适合的，VS太大了，是集成了多种开发语言的IDE，还是比较 方便的

user: user-5
content: gcc 或 clang 吧。 另外 c++ 和 c 不是先后关系，如果你的最终目的是学 c++，不需要先学 c 的，实际上不学可能反而更好一些。
user-0 提问: return之后，函数里的语句还要继续执行吗？

回复:
user: user-1
content: return (*p)++;  == int res = *p; (*p)++; return res;

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-3
content: 执行了，这个语句就是return的一部分。但return语句之后（也就是分号以后）的语句则不再执行。

user: user-4
content: 无论软硬件，后门是肯定有的，斯若登都知道。  所以有自主论！

user: user-2
content: 引用 18 楼 u013585046 的回复:CPU、编译器、调试器也不能迷信，眼睛有时也会欺骗人！  真相是如此扑朔迷离， 所以有远见卓识的人就更显珍贵！ 不可知论！

user: user-4
content: CPU、编译器、调试器也不能迷信，眼睛有时也会欺骗人！  真相是如此扑朔迷离， 所以有远见卓识的人就更显珍贵！

user: user-5
content: 引用 3 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→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-6
content: 因为return (*p)++; 是一个语句，编译器会把这个语句翻译成多行汇编代码，所以这些汇编代码会整体执行。 相当于是把 *p 的值放到寄存器中返回（返回值通常放到寄存器中），然后把原来内存地址中对应的值自增1。如果你想利用这个自增的值，你只能用*p来取得，而不能从寄存器的返回值中取，因为返回值是原来的值。

user: user-7
content: 会的，具体自己写个程序试一下就知道了！！

user: user-8
content: 会执行的！ ++在return之前完成的

user: user-9
content: 补充一下：  楼主可以看一下这篇经典的文章：http://bbs.csdn.net/topics/370153775  里面提到了像++这种运算符产生的作用什么时候体现出来

user: user-10
content: 这个问题不用纠结，直接一个跨号就解决了

user: user-11
content: 函数返回的值是*p的值。 同时， 传入的参数值会加1. int param = 10; int res = fun(¶m); 结果是res = 10, param = 11; 可以尝试一下。

user: user-12
content: 扑哧…… ++什么时候成了语句

user: user-13
content: ++会在分号之前完成，会执行的

user: user-14
content: 当然会执行了

user: user-15
content: 会执行的，如楼上的回答。 语句：return (*p)++; (*p)++是一个表达式，其值为(*p)，执行完++操作了，将（*p）的值返回。 一个小例程测试一下 #include <stdio.h>  int fun(int *p) { 	return (*p)++; }  int main() { 	int x = 1; 	int y = fun(&x); 	printf("x = %d,y = %d\n", x, y); 	return 0; }

user: user-16
content: 会的，具体自己写个程序试一下就知道了！！

user: user-9
content: 执行的，因为会执行完return的整条语句，楼主可以写了测试一下，看*p的值有没变化就知了

user: user-17
content: 会执行到分号
user-0 提问: C语言中的linked list segmentation fault求教

回复:
user: user-1
content: 参考代码： http://pan.baidu.com/s/17yIcQ

user: user-2
content: 再定义一个 node* previous = nullptr，每次 current = current->next 之前，让 previous = current。当 current 满足条件时，此时的 previous 就是提供插入位置的节点。 不知道 insertNode 是怎么调用的，一般都是接受链表头节点指针吧，这样 lptr 应该是 node* 才对，不需要二重指针。  free 是释放资源，要是能确定资源确实不需要了，就可以释放。主楼的这个插入函数，插入链表的节点明显要活的比插入函数本身长才行，肯定不能再函数退出前释放掉的。

user: user-3
content: 你的逻辑比较混乱。 //如果当前结点数据的next data比d大，在当前结点之后加入         if ((*current)->next->data >= d)         {             newnode->next = (*lPtr)->next;             (*current)->next = newnode;             break;         }  这部分如果current是空 或者current->next为空，就segmentation fault，使用前要先判断是否为空     free(newnode)  你刚才为节点申请的内存，最后释放了，那插入链表中的节点，以后访问就是非法访问了

user: user-0
content: 多谢回复。 针对您提的第二个问题， 如果是在当前指针判断，那么如何在当前指针使用时调用上一个指针的next（我是不会用才这样的）？另外我不确定×lptr和current的用法是否重复。。最后的free的话，函数结束了难道不该free吗？  我C语言只接触了一个月，因为时间关系基础不怎么好。以前会点Python。现在看到指针啊，malloc什么的头都是大的。。

user: user-2
content: 链表为空的时候，current 应该是 null 吧，循环直接访问其数据不就挂了吗。  free(newnode); 以后新建的节点就不存在了，不是白插入了吗。 楼主的插入逻辑有点奇怪，总是用当前节点的下一个节点来判断，多此一举啊，直接用当前节点判断同时保持上一个节点指针多好啊。
user-0 提问: 关于C语言中指针变量的命名及赋值的问题

回复:
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: 顶楼上的，楼主可以看看！

user: user-3
content: 参考一下——http://blog.csdn.net/u012421456/article/details/20296865  ——http://blog.csdn.net/u012421456/article/details/21803797
user-0 提问: gets()函数疑问

回复:
user: user-1
content: 引用 3 楼 user-2 的回复:楼上的兄弟，我觉得楼主理解的没啥问题。反而是你说了一大通没听明白你到底在说什么。。。  You are fucking right,我错了,楼主想得对

user: user-2
content: 楼上的兄弟，我觉得楼主理解的没啥问题。反而是你说了一大通没听明白你到底在说什么。。。

user: user-1
content: 就算char *p之后不远处真有个'\0'字符,之前读到的内容也都是垃圾值,char *p的第一个字符是字符串'abc'的地址而不是字符'a'. char p[40]就不同,40个单元里面存的是确确实实的字符'abc'等

user: user-1
content: gets(p)表示从p的地址开始读取字符直到遇到'\n'为止,然后gets(p)函数会把换行符替换成'\0' 如果你这样写 char * p="abc"; 那么指针p的内容是字符串'abc'的地址,之后能不能遇到换行符全凭运气,所以是行不通的,虽然gets()的原型是 char * gets(char * s) 但并不是说指针p可以随便声明,char *p和char p[40]的区别在这道题上就体现出来了 char *p与char p[40]既有相同点又有不同之处
user-0 提问: 无法解析的外部命令，看看我这缺的是什么.lid

回复:
user: user-0
content: 新建的时候，我就设置为win32项目——控制台应用程序——在向导里点的是空项目——然后新建了c++文件

user: user-1
content: 不知道楼主新建工程时的工程设置是啥，该代码在控制台下测试能输出正确结果，应该是你工程设置或者编译环境的问题

user: user-2
content: 无法解析的什么命令，为什么不写完整。 估计是工程类型没设对
user-0 提问: 数组方面的一个程序问题，求指导？

回复:
user: user-0
content: 感谢指导，还要自己多去思考才行。。。。 学的太死了。。

user: user-1
content: *(*board + i)和**board+i是一样的吧，都是先board+1然后在**。

user: user-2
content: 兄弟，你知道数组和指针的区别吗?你的根本问题在这里。 数组不是指针。你弄明白这句话就懂了，不要求答案，自己证明的才是自己的。

user: user-3
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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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-4
content: **board就是board[0][0]，也就是1啊。。。 书上的原话真是lz说的那样？- -

user: user-5
content: 楼主不妨试下输出**board的值，该值是数组中第一个元素的值，也就是1 把这个值放到循环中，加上i的值（i=0,1,2,3,4,5,6,7,8） 就会得到（board:1,2,3,4,5,6,7,8,9）

user: user-6
content: 这样是可以的啊。  #include <stdio.h> int main(void) { 	char board[3][3] = { 		{'1', '2', '3'}, 		{'4', '5', '6'}, 		{'7', '8', '9'} 	}; 	 	 	for(int i = 0; i < 9; i++) 		printf("board: %c\n", **board + i); 	return 0; }
user-0 提问: c primer plus 第十一章11.8命令行参数 关于这一小节的疑问

回复:
user: user-1
content: 要把文件的路径全部写出来 如果你用的是windows的话。例如，Desktop/asd.exe这表示桌面的asd可执行程序

user: user-2
content: 给一个c的main函数传递参数是可以的    但就不是你写代码的部分了 一个c的程序，只有一个主函数，这个主函数运行起来后，就会形成一个进程   你给这个主函数传递参数，其实就是要从系统的角度给这个进程通信    在windows系统下有两个办法 要么就像楼上给你的连接那样 还有个傻瓜办法就是用鼠标拖    你可以新建一个txt文件  然后把这个文件用鼠标拖动到你的project上   然后松开鼠标  你的程序就开始运行了   这个时候你的这个程序的主函数接受到的参数就是这个txt文件

user: user-3
content: http://bbs.csdn.net/topics/390469280
user-0 提问: 自定义函数从主函数定义的数组中取出两个数相加，请问add这个方法怎么写?谢谢！！

回复:
user: user-1
content: int add(int *a,int *b) { 	//两个数相加arr[1]+arr[2]，将结果存在arr[1]中 	*a += *b; } 按题设要求，其实可以不用返回值，结果保存在array[1]中。

user: user-2
content: #include<stdio.h>  int add(int *a,int *b) {     (*a)=(*a)+(*b);//两个数相加arr[1]+arr[2]，将结果存在arr[1]中     return (*a); } void main() {     int arr[3]={1};     int *p=&arr[1];     int *q=&arr[2];      printf("please input\n");     printf("opr1: ");     scanf("%d",&arr[1]);     printf("opr2: ");     scanf("%d",&arr[2]);     add(p,q);     printf("%d",*p);//输出结果 }

user: user-3
content: *a+=*b;

user: user-4
content: 直接加呀,有什么问题？
user-0 提问: 有关指针的问题

回复:
user: user-1
content: 哪里都有你。

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

user: user-3
content: 左值指示对象，而值不是。 这个问题和地址没有多大关系，表达式(int *) 0x123bb2的结果是一个值，一个指针类型的值，或者说指针值，但并不指示对象，但是表达式* (int *) 0x123bb2的结果是一个左值，指示一个对象。 大学里的教育通常是杯具。很多人歪着嘴又是地址又是变量啥的，解释不了这个问题。 如果需要变量啥的，下面这个表达式需要多少变量？： int x; *&*&*&*&*&*&*&*&*&*&*&*&*&*&x = 0;

user: user-4
content: 赋值可以是这样：*p=&a 也可以是*p=2

user: user-2
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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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-5
content: (int*)0x123bb2，好了，0x123bb2这个值被强制转换成了一个指针变量，这个指针变量保存着的值是多少？是0x123bb2 那么这个指针指向的地址就是0x123bb2。指针变量所保存着的地址值，就是该指针指向的地址。 就像(int)0x123bb2一样，0x123bb2这个值被强制转换成了一个int变量，这个Int变量保存着的值是多少？是0x123bb2

user: user-0
content: 引用 1 楼 user-6 的回复:在0x123bb2前加(int*)，就把它变为了储存整型的地址；再在前面加一个*，就可以对这个地址存储的内容进行操作了。在问题里就是对其赋值为2。还有什么不懂的吗？ 也就是说，(int *)强制转化的意思是把这个地址转化为一个存储int类型的内存区域？但是网上大多数说的是这个是把它强制转化为一个指针变量啊，指针变量内部没有所指向，就是这迷糊，如果按您这种解释的话，是可以解释通的，我的理解就是*0x123bb2 = 2,但我知道这个肯定不对，却又不知为何

user: user-6
content: 在0x123bb2前加(int*)，就把它变为了储存整型的地址；再在前面加一个*，就可以对这个地址存储的内容进行操作了。在问题里就是对其赋值为2。还有什么不懂的吗？
user-0 提问: 如何用for循环实现文件路径动态变化

回复:
user: user-1
content: 你需要用到sprintf函数

user: user-2
content: PIMAGE img[N]; int i; char fn[256]; for(i=0;i<N;i++) {    img[i] = newimage();    sprintf(fn,".\\pukeImage1\\%d.jpg",i+1);    getimage(img[i],fn); }
user-0 提问: UVA401字符串的题但是WA了好几次

回复:
user: user-1
content: 引用 3 楼 Sean10 的回复:[quote=引用 1 楼 user-1 的回复:] int is_mirror  for(i=0;i<n/2;i++){  奇数长度最中间那个字符不判？ 我查到的一些AC的解题报告这里也是直接略过的。[/quote] reverse略过没问题。mirror能略？

user: user-0
content: 引用 1 楼 user-1 的回复:int is_mirror  for(i=0;i<n/2;i++){  奇数长度最中间那个字符不判？ 我查到的一些AC的解题报告这里也是直接略过的。

user: user-0
content: 引用 1 楼 user-1 的回复:int is_mirror  for(i=0;i<n/2;i++){  奇数长度最中间那个字符不判？ 中间那个也要判吗，不是一定满足的吗

user: user-1
content: int is_mirror  for(i=0;i<n/2;i++){  奇数长度最中间那个字符不判？
user-0 提问: 求所有组合情况 用C语言解决

回复:
user: user-1
content: 仅供参考：//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈，并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息     int s[256];     int i;     memset(s,0,sizeof(s));     memset(count,0,sizeof(count));     m=strlen(str);     if (w<1 || m<w) w=m;     while(*str) {         s[*str]++;         str++;     }     n=0;     for (i=0;i<256;i++)         if (s[i]) {             map[n]=i;             count[n]=s[i];             n++;         } } void Find(int depth) {//递归式回溯法生成全排列     if (depth==w) {         int i;         for (i=0;i<depth;i++) putchar(map[stack[i]]);         putchar('\n');     } else {         int i;         if (v && depth>0) {             for (i=0;i<depth;i++) putchar(map[stack[i]]);             putchar('\n');         }         for (i=0;i<n;i++)             if (count[i]) {                 stack[depth]=i;                 count[i]--;                 Find(depth+1);                 count[i]++;             }     } } void main(int argc,char**argv) {     if (argc<2) {         printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);         return;     }     if (argc>=3) w=atoi(argv[2]);     if (-1==w) v=1;     Make_Map(argv[1]);     Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //

user: user-2
content: 参考：http://www.jb51.net/article/54443.htm  排列组合问题