Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: int a['10'];  这样编译不会报错，sizeof测试数组长度也是有值，为什么呢？

回复:
user: user-1
content: 字母在编译器看来是整形得！编译器会把它翻译成字母对应的asll吗

user: user-2
content: 引用 1 楼 JiangWenjie2014 的回复:multi-character character constant  具体的值是多少由编译器自己决定。

user: user-3
content: '10' 会自动转化成整形，具体值是多少就要看ANSII表

user: user-0
content: 我明白了，‘10’在内存中由于小端存放所以是的是30 31，然后系统对他用四个字节进行解析!所以得到的值是12592！谢谢各位的帮助

user: user-0
content: 为什么‘10’=0x3130  ？怎么转换的十六进制？

user: user-4
content: multi-character character constant

user: user-5
content: '10'等同于'1'，所以应该是0x31，楼主试试看是不是？

user: user-6
content: 1. int a[N]    N是一个整形，“10”  是1个字符串   而你写成 ‘10’   如： char c = ‘10’;   int i = c; 此时的 i = 48    也就是c = ‘10’  截断了  变成 c = ‘0’ 单字符写成2个字符....  2.写成‘10’，会转换成整形，所以sizeof（a）就有数撒

user: user-7
content: 警告是有的：warning: multi-character character constant 编译器会把字符转换成整数，‘10’ = 0x3130 = 12592

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

回复:
user: user-1
content: 底层指令相同是对的 但是在底层架构的上面还有一层操作系统层，要知道你的程序是跑在os层，而不是直接在底层架构上跑的，简单的理解就是，os是负责连接你程序和底层的架构的。  所以不同的操作系统在沟通你的程序和底层是有所不同的，造成了这种问题

user: user-2
content: 引用 5 楼 gscaiyucheng 的回复:[quote=引用 1 楼 luciferisnotsatan 的回复:] 你编完的东西实在操作系统上运行的。windows提供的系统函数和ubuntu一样么？ 如果你不用操作系统提供的任何东西，那程序应该是可以在硬件上运行的。不错这也就没有为什么不能在ubuntu上运行这回事了，压根和ubuntu没任何关系。  也就是说：百度上面说的生成可执行的机器语言代码，这个机器语言代码其实还是要调用操作系统的给的接口是吗？麻烦您了[/quote] 是的。 其实在你代码能调系统API之前，先要系统能认识你这个文件是可执行文件，并把它执行起来。可执行文件的格式，window和linux是不一样的。

user: user-0
content: 引用 1 楼 luciferisnotsatan 的回复:你编完的东西实在操作系统上运行的。windows提供的系统函数和ubuntu一样么？ 如果你不用操作系统提供的任何东西，那程序应该是可以在硬件上运行的。不错这也就没有为什么不能在ubuntu上运行这回事了，压根和ubuntu没任何关系。  也就是说：百度上面说的生成可执行的机器语言代码，这个机器语言代码其实还是要调用操作系统的给的接口是吗？麻烦您了

user: user-3
content: 编译方式以及系统调用决定了

user: user-4
content: 操作系统对自己可执行文件的调度方式是不一样的，参考http://www.it165.net/os/html/201409/9304.html，而Windows下的exe文件的处理又是另外一种方式。

user: user-2
content: 你写的是操作系统上跑的程序，不是操作系统本省。

user: user-2
content: 你编完的东西实在操作系统上运行的。windows提供的系统函数和ubuntu一样么？ 如果你不用操作系统提供的任何东西，那程序应该是可以在硬件上运行的。不错这也就没有为什么不能在ubuntu上运行这回事了，压根和ubuntu没任何关系。

user: user-5
content: 引用 楼主 gscaiyucheng 的回复:如题，在网上查了下  百度上说：高级语言经编译最终生成可执行的机器码文件  wiki上说：有一些编译器输出的代码，将运行于与编译器所在相同类型的计算机和操作系统之上，这种编译器叫做本地编译器  疑问： 1.如果最终生成可执行文件里面都是机器码，也就是机器可以识别的代码，指的是指令集吗？ 2.如果是cpu指令集，那么同一台X86架构的计算机装的双系统(windows,ubuntu)，在windows下编译生成的文件为什么不能在ubuntu下不能运行呢？  希望有大侠指点一下，非常感谢 有空参考我的博文：http://blog.csdn.net/binaryhead/article/details/41083927，希望对你有帮助。
user-0 提问: c生成dll文件

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……

user: user-2
content: 两种方法： 1.自己定义一个头文件，包含C文件函数； 2.定义一个.def文件，导出函数名

user: user-3
content: C++写成   extern "C " _stdcall  int   fun_xxxx(int a){return 0;};  C写成   _stdcall  int   fun_xxxx(int a){return 0;};  主要有原因是，Windows  API 函数都不是 （_cdcel ）C调用约定 而是 _stdcall 调用约定 所以 Windows 上的每种开发语言，几乎都支持这种调用约定生成的函数。  如果想再可靠些, 可以写成  WINAPI int  fun_xxxx(int a){return 0;}; WINAPI 是 windows.h 中定义了的一个宏，代表 WINAPI 的调用约定。   生成DLL的几种方法：      1)命令行方式 ，可以直接命令行编译生成 .dll 这必须了解，编译的细节，         在这个时代只有那些愿意深入学习的人          才会用命令行方式编译      2) 修改编译选项，这个也必须有一个已经创建的工程，才能修改      3)在VC（VS）开发环境里，直接创建一个 .dll 工程，创建新的 .c,.cpp 或者添加现有的 .c 到 这个工程             这里，创建.dll 工程的时候，有几个选项，每个选项会产生一种类型的 dll。

user: user-3
content: C 语言对函数名的改编很简单，往往只是在前面加一个 下划线 因为C语言没有函数重载，所以每个编译后的函数名和代码里的函数名非常一致。 C++ 有函数重载，做不到编译后的函数名和代码里的函数名一致 所以有一套比较复杂的名字改编规则，而且每个编译器做法不同 C++要想达到C的效果，往往 要 在函数前面，加 extern “C” 让编译器像C那样生成 函数名字。  linux 有 共享库 后缀是 .so 这是linux 系统的动态库  效果 等同于 DOS ,windows 上的.dll C语言的 DLL 有几种办法生成，最简单的是让 VC自动生成一个框架，然后把 .c 文件添加进去 而写def 对于生成 .dll 是最直接，最能够清晰控制生成的dll 中输出函数的方式  一般来说，写成   C++ extern "C " _stdcall  int   fun_xxxx(int a){return 0;}; 这种方式是不用担心 生成的函数，其它语言不能调用的  一般  .def 这么写就可以了 ;xxx.def Libray  xxx      EXPORTS  fun_xxxx      ;

user: user-0
content: 引用 3 楼 lm_whales 的回复:dll 和对应的头文件，没关系 提供头文件是为了更方便使用 dll  .c 如果不包含 main ,可以很简单的生成  dll 单一 .c 如果没有引用其他文件定义的函数函数（包括库函数），不需要额外的头文件，就可以生成   dll 如果引用了别的文件定义的函数，则通常必须有对应的头文件 （可能还需要.lib .obj 文件）  。。。。。头文件内容，有时候，可以复制过来，这样就不用 包含头文件了， 不过通常都是包含头文件的，因为包含头文件更简单，更不容易出错。 可为什么我生成不了呢？还有，我想再问一个问题，就是我用c生成dll和用c++生成dll，对于python有什么不同（语法和传递函数），我在网上看的大都是c生成的，

user: user-3
content: dll 和对应的头文件，没关系 提供头文件是为了更方便使用 dll  .c 如果不包含 main ,可以很简单的生成  dll 单一 .c 如果没有引用其他文件定义的函数函数（包括库函数），不需要额外的头文件，就可以生成   dll 如果引用了别的文件定义的函数，则通常必须有对应的头文件 （可能还需要.lib .obj 文件）  。。。。。头文件内容，有时候，可以复制过来，这样就不用 包含头文件了， 不过通常都是包含头文件的，因为包含头文件更简单，更不容易出错。

user: user-0
content: 引用 1 楼 user-4 的回复:建一个 dll 的工程，把你的 c 文件放进去，定义函数导出，编译我用vs试的，但是它需要头文件，我这个没有，只有.c

user: user-4
content: 建一个 dll 的工程，把你的 c 文件放进去，定义函数导出，编译
user-0 提问: 赋值地址的问题~~

回复:
user: user-1
content: 引用 4 楼 pokerLee 的回复:[quote=引用 2 楼 u011337306 的回复:] LZ没有发现p[n]本身就是一个地址？而p[n] = str[n]其实就是对二维数组某一行首地址赋值给p[n] 如果你将p = str， 仅仅只是给p[0]赋值了！！！我想请教为什么要做这么一个赋值？原因是什么呢？[/quote] LZ你要看后面函数传递的是指针，而这些函数对指针所做的修改，也就是对数组str的修改，如果要使用str，当然可以！但楼主要看清这段代码的意思，如果使用str，并且当成一个二维数组来理解，是不是使得代码变得晦涩、难以理解？尤其注意origin_put(p,n)，这里就已经将整个str二维数组传递进去了！这样子是不是就可以随便对str的某一行进行修改了？这样子很方便的！这样子赋值就是将二维数组变成一维指针数组，方便对二维数组的修改以及函数参数的传递，不知道LZ还有问题没？   switch(command[0])    {    case 'a': puts("put originally:");      origin_put(p,n); break;    case 'b': puts("put in order of ascii:");     ascii_put(p,n);  break;    case 'c': puts("put in order of string's length:");  length_put(p,n); break;    case 'd': puts("put in order of first word's length:"); word_put(p,n);   break;    case 'e': break;

user: user-2
content: 因为后面一堆函数的参数都是p而非str

user: user-0
content: 引用 2 楼 u011337306 的回复:LZ没有发现p[n]本身就是一个地址？而p[n] = str[n]其实就是对二维数组某一行首地址赋值给p[n] 如果你将p = str， 仅仅只是给p[0]赋值了！！！我想请教为什么要做这么一个赋值？原因是什么呢？

user: user-3
content: 应该是与函数的参数有关。  例如 origin _put(p, n);  第一个参数的类型是一个指针数组，用p正好。 而如果使用str，类型就不相符了，会有警告或者错误。  如果在设计origin _put()时，直接把形参定为二维数组，这也是不行的，严格说是不方便的。  所以origin _put()的形参应该是指针数组，而不是二维数组。那么在主函数调用时就要做一个小处理。

user: user-1
content: LZ没有发现p[n]本身就是一个地址？而p[n] = str[n]其实就是对二维数组某一行首地址赋值给p[n] 如果你将p = str， 仅仅只是给p[0]赋值了！！！

user: user-4
content: *p[10]是一个一维数组，里面存有10个char*变量，可以说是10个c字符串。 我猜函数length_put(p,n)的第一个参数应该是一维字符串数组，如果不用p[n] = str[n],那么这个地方就不好写了。 比如你写成length_put(str,n),这个结果应该不正确，因为str是一个元素为char（而不是字符串char*）的二维数组。 如果你写length_put(str[1],1)应该能输出第一行（str[1]被处理为一个字符串），但只能输出一行，失去了length_put（）函数的使用意义，当然也可以使用循环来输出，只是这样就要多写几行代码。 个人观点，仅供参考，希望有用。

user: user-5
content: 估计是后面调用函数内部会对p进行改变，str[]保存原来的串
user-0 提问: static？

回复:
user: user-1
content: 这样也可以  //b.cc int *M()   {     static int a=2;     int *b=&a;     return b;   } int main()   {     cout<<*M()<<endl;   }

user: user-0
content: 引用第一个得到的是一个垃圾值，也就是不确定值。不要范低级错误。 1.a.cc 程序用gcc编译通过，但是，有陷阱。 对么？  2.b.cc 变量：a，b，必须两个都是static。 否则，程序也有陷阱。 对么？

user: user-0
content: 引用第一个得到的是一个垃圾值，也就是不确定值。不要范低级错误。 1.a.cc 程序用gcc编译通过，但是，有陷阱。 对么？  2.b.cc 变量：a，b，必须两个都是static。 否则，程序也有陷阱。 对么？

user: user-2
content: 第一个得到的是一个垃圾值，也就是不确定值。不要范低级错误。

user: user-2
content: 这种写法 好像这个： int i = 0; const int * const j = i;

user: user-3
content: 静态变量有两个特点 １．生存起和程序一样长。 ２．无外部链接属性。

user: user-4
content: 哥， 你还是好好看书吧。 这个跟引用是一个道理。
user-0 提问: 在C语言中，else不是与最近的一个if结合么？为何我这里不是

回复:
user: user-1
content: #include<stdio.h> int main(){     int year,month,day=0;     printf("input year,month:\n");     scanf("%d,%d",&year,&month);  if(month==2 && (year%4==0 && year%100!=0 || year%400==0))         day=29;     else day=28;     if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)          day=31;     if(month==4||month==6||month==9||month==11)         day=30;         printf("days=%d",day);     return 0; } 非得要这样就把润年的放在前面

user: user-2
content: 多个条件语句换成else if 比较符合逻辑

user: user-3
content: LZ顺序语句和条件语句没学好`

user: user-4
content: 楼主是有些逻辑问题，像二楼说的，前面的if全作废，几乎是无用的

user: user-5
content: 我是个菜鸟，赞同二楼的讲法。

user: user-6
content: 二楼是重点，要实现这个，可以用switch，也可以 #include<stdio.h> int main(){ 	int year,month,day=0; 	printf("input year,month:\n"); 	scanf("%d,%d",&year,&month); 	if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) { 		day=31; 		goto Print; 	} 	if(month==4||month==6||month==9||month==11) { 		day=30; 		goto Print; 	} 	if(month==2 && (year%4==0 && year%100!=0 || year%400==0)) { 		day=29; 		goto Print; 	}	 	else  		day=28; 	Print:  	printf("days=%d",day); 	return 0; }

user: user-7
content: 是与最近的没有结合的else结合

user: user-8
content: 二楼说得对，就最后那个if else有用，days不是28就是29 ，前面不管咋样都被覆盖了

user: user-9
content: LZ怎么输入的？

user: user-10
content: 跟你的件有关系，

user: user-11
content: 后边两个if前要加 else  否则那个最后的else 就和前边两个if没关系了，也就是除了月份是2并且是闰年以外的所有情况。而你的意图是除了上边那些情况之外的所有情况

user: user-12
content: 逻辑问题。。。

user: user-13
content: 引用 楼主 w82076322 的回复:#include<stdio.h> int main(){ 	int year,month,day=0; 	printf("input year,month:\n"); 	scanf("%d,%d",&year,&month); 	if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)  		day=31; 	if(month==4||month==6||month==9||month==11) 		day=30; 	if(month==2 && (year%4==0 && year%100!=0 || year%400==0)) 		day=29; 	else day=28; 	printf("days=%d",day); 	return 0; }   在执行过程中，总会执行到day=28，输出结果于是总是28. 这段代码来自《C语言编程技巧分析》（清华大学出版社   高禹 主编  2014年1月第一版） 不要改成if-else if，我会那种方法，只想知道这段代码为何总执行else 看2楼的，仔细想想吧，编译器除了优化外，都会按照程序员写出来的程序语句翻译的。

user: user-14
content: 逻辑问题，不是语法问题  3楼说得对

user: user-15
content: if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) day=31;  else if(month==4||month==6||month==9||month==11)day=30;  else  if(month==2 && (year%4==0 && year%100!=0 || year%400==0))day=29;  else day=28;

user: user-16
content: 楼主的逻辑也不对哦，     if(month==2 && (year%4==0 && year%100!=0 || year%400==0))         day=29;     else day=28; ===>     if(month==2 && (year%4==0 && year%100!=0 || year%400==0))         day=29;     else if(month==2) day=28; 或者 ===>     if(month==2)          if (year%4==0 && year%100!=0 || year%400==0))             day=29;         else             day=28;

user: user-16
content: 输入 2000,2 输出就是29啊 注意要输入逗号哦！

user: user-17
content: 确实是只和最近的if结合，所以你的day只能是29，或者28。 前面的几个if全部作废了。 即使前面是赋值31，后面的if和else会重新赋值

user: user-18
content: 当month == 1,3,4,5,6,7,8,9,10,11,12时 if(month==2 && (year%4==0 && year%100!=0 || year%400==0))条件不满足就执行else语句day=28;
user-0 提问: 各路大神 求助 我现在想自学c语言  准备备考明年2级  求支招

回复:
user: user-1
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-2
content: 多练习就可以了，

user: user-3
content: 不管怎么说：要想学习一门知识，首先你需要了解这个语言的特点（c语言嘛：你最关键的是要了解它的语法特点，比如：关键字的使用！）。。当你把所有的基本语法都了解后。。然后，就是多练习。。。多做例题。。。。这些都做完了你也就基本掌握了。。

user: user-4
content: http://blog.csdn.net/u012421456/article/details/40681247 如果只是2级考试，看谭浩强的书吧，考试的题里有些真是。。。 视频，入门可以看郝斌的，网上一搜就有

user: user-5
content: 如果只是考级，做真题吧。

user: user-6
content: 理论和实践相结合吧，首先搭建一个环境，编辑器、编译器；找一个好一点的编译器和编辑器会让你的学习事半功倍。

user: user-7
content: 貌似2级没什么用吧，C语言的视频、书籍网络上一大把……
user-0 提问: 指针数组的初始化----《C和指针》

回复:
user: user-1
content: 少输入了一个＊，字符串作为数据的元素，返回的是地址 #include<stdio.h> // #include<string.h> int main()  { char const *keyword[]  = {          "do",         "for",         "if",         "while" };     return 0; }

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

user: user-3
content: 书没错   根据楼主指示重新看了这一篇幅，发现应该是楼主断章取义了。。。。    这里人家都说了【这个数组可以用于.......】没说是【这个指针数组.....】  作者实际的意思是值后边p165页的这一部分   希望能够解除对大家的误导  PS：@楼上所有大神   当然，怀疑书的精神配得上32个赞

user: user-4
content: LZ看的是中文还是英文？ 哪个出版社的？ 有无官方网站？ 网站上有无勘误表？

user: user-0
content: 引用 9 楼 u013163178 的回复:你的是不是盗版啊 正版啊～

user: user-5
content: 引用 9 楼 u013163178 的回复:你的是不是盗版啊  确实是书错了，不是盗版。

user: user-6
content: 你的是不是盗版啊

user: user-0
content: 引用 6 楼 mujiok2003 的回复:char const* keyword[] 恩，现在搞清楚了，是书的错误

user: user-0
content: 引用 5 楼 u010059138 的回复:[quote=引用 4 楼 SKY962464 的回复:] [quote=引用 3 楼 u010059138 的回复:] [quote=引用 2 楼 SKY962464 的回复:] [quote=引用 1 楼 u010059138 的回复:] char const keyword[]????   指针数组？？？？？？？  哪里是指针你告诉我 《C和指针》这本书p163页这么写的，我也觉得不太对，应该是书印错了。。。[/quote] 你在仔细看看？ 这么经典的书应该不会犯这么低级的错误的 char *  keyword[]这个才是指针数组[/quote] 的确实这书错了，就是因为经典我才怀疑的，即使我测了一边证实是书错了我还是怀疑，所以我发帖的。。。我觉得应给是书的印刷错误吧[/quote]  书就是用来怀疑- 验证的[/quote] 这话有道理，不能相信别人做好了的结果，要相信你做出来的结果

user: user-7
content: char const* keyword[]

user: user-8
content: 引用 4 楼 SKY962464 的回复:[quote=引用 3 楼 u010059138 的回复:] [quote=引用 2 楼 SKY962464 的回复:] [quote=引用 1 楼 u010059138 的回复:] char const keyword[]????   指针数组？？？？？？？  哪里是指针你告诉我 《C和指针》这本书p163页这么写的，我也觉得不太对，应该是书印错了。。。[/quote] 你在仔细看看？ 这么经典的书应该不会犯这么低级的错误的 char *  keyword[]这个才是指针数组[/quote] 的确实这书错了，就是因为经典我才怀疑的，即使我测了一边证实是书错了我还是怀疑，所以我发帖的。。。我觉得应给是书的印刷错误吧[/quote]  书就是用来怀疑- 验证的

user: user-0
content: 引用 3 楼 u010059138 的回复:[quote=引用 2 楼 SKY962464 的回复:] [quote=引用 1 楼 u010059138 的回复:] char const keyword[]????   指针数组？？？？？？？  哪里是指针你告诉我 《C和指针》这本书p163页这么写的，我也觉得不太对，应该是书印错了。。。[/quote] 你在仔细看看？ 这么经典的书应该不会犯这么低级的错误的 char *  keyword[]这个才是指针数组[/quote] 的确实这书错了，就是因为经典我才怀疑的，即使我测了一边证实是书错了我还是怀疑，所以我发帖的。。。我觉得应给是书的印刷错误吧

user: user-8
content: 引用 2 楼 SKY962464 的回复:[quote=引用 1 楼 u010059138 的回复:] char const keyword[]????   指针数组？？？？？？？  哪里是指针你告诉我 《C和指针》这本书p163页这么写的，我也觉得不太对，应该是书印错了。。。[/quote] 你在仔细看看？ 这么经典的书应该不会犯这么低级的错误的 char *  keyword[]这个才是指针数组

user: user-0
content: 引用 1 楼 u010059138 的回复:char const keyword[]????   指针数组？？？？？？？  哪里是指针你告诉我 《C和指针》这本书p163页这么写的，我也觉得不太对，应该是书印错了。。。

user: user-8
content: char const keyword[]????   指针数组？？？？？？？  哪里是指针你告诉我
user-0 提问: extern,static存储类型？

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

user: user-2
content: static说明生存期是全局的，也就是直到程序结束运行变量才消失。而extern说明链接属性，他们唯一联系起来的就是static变量没有extern链接属性。

user: user-3
content: 7楼正解啊！

user: user-4
content: 操作系统是内存大管家，它负责分配内存给程序，当然也负责回收已分配的内存。当程序结束后(退出后)，程序占有的所有内存都被操作系统回收。被操作系统回收，也就是说内存释放了。

user: user-5
content: 楼上都讲比较清楚了，  核心值不愿意改变的用static  extern 用在声明  如头文件中。  然后包含XX.h  就好了

user: user-6
content: extern,static存储类型的变量初始化后，对于一般程序来说，他们所占用的内存会在程序结束时被释放（对于大多数程序来说，不是关机）。另外，static 生命的全局变量的生命周期是编译单元，比如头文件中初始化了一个static变量，而这个头文件被两个.cpp文件引用，这时这个变量在两个编译单元中被视为两个不同的变量（或者讲是两个不同的内存单元），但不会出现链接错误（如果你在头文件初始化的是一个非静态的全局变量，编译器就会在链接程序时报重定义错误，是链接的时候才报错），而extern 声明的变量与此不同，意思是说这个变量在别的编译模块中定义了，编译时不会报错，链接的时候会在其他编译单元中搜寻这个变量，并进行链接。 简单讲讲效果上不同：static全局变量在两个编译单元中引用时，我们改变一个编译单元中的变量，另一个编译单元中不会变化（即在编译单元中是唯一的）。 而extern全局变量在一个编译单元中被改变时，另一个编译单元中也会改变（即在程序中唯一）。 另外，现代编译器拥有代码优化功能，当两个编译模块中从始至终都没有改变过的static全局变量，会被编译器优化为同一块内存，但是在代码中有改变的话，编译器就会为其分配两个不同的内存。 建议参考一下《编译原理》。 个人观点，仅供参考，希望有用

user: user-7
content: 不对。。。。

user: user-8
content: 存储生存期(static ,automatic 和 allocaed)和  符号的连接属性(linkage: extern/static)是两个不同的概念。  请自己翻一番标准:

user: user-8
content: 引用 5 楼 mujiok2003 的回复:[quote=引用 3 楼 Daffodiles 的回复:] 3.auto存储类型，只可以用在函数体内(块内)。可以省略不写。 对么？ 不对， 全局变量也可以auto[/quote] 错了，请忽略。

user: user-8
content: 引用 3 楼 Daffodiles 的回复:3.auto存储类型，只可以用在函数体内(块内)。可以省略不写。 对么？ 不对， 全局变量也可以auto

user: user-9
content: 程序结束后就会释放了，不会等到关机；

user: user-0
content: 3.auto存储类型，只可以用在函数体内(块内)。可以省略不写。 对么？

user: user-0
content: 1.int a; 变量：a，前面没任何存储类型。它是什么存储类型？ 2.extern存储类型，在块内，块外。 它们的链接有什么不同？

user: user-10
content: extern 不是 extern的意思是，这个变量或者函数在别的地方定义过了 这里只是声明一下 如果用到了 就到那个定义过它的地方找它 static是 static限制了变量或者函数的范围  让它们变成了文件或者函数范围  而且会一直存在  直到你的程序完全执行结束，也就是main执行结束了  然后就会把static返还给计算机了---------不需要关机，程序结束就被释放了   只要程序结束，任何你程序里存在的东西都会释放
user-0 提问: 关于二维指针的问题

回复:
user: user-1
content: 到21行，每一个Tmp.pTest[i]都指向了一个stTest1。 但你的stTest1中只有指针，所以还是需要分配内存才能使用，例如strcpy之类。 逻辑上，你这里其实有三层指针。

user: user-1
content: #include<iostream>  using namespace std;  struct stTest1 {     char *szUserid;     char *szUserName; };  struct stTest2 {    struct stTest1 **pTest; };  int main() {    struct stTest2 stTmp;    stTmp.pTest = (struct stTest1**)malloc(100*sizeof(struct stTest1*));    for(int i=0;i<100;++i){        stTmp.pTest[i] = (struct stTest1*)malloc(sizeof(struct stTest1));        stTmp.pTest[i]->szUserid = NULL;//此处仍需分配内存才能使用     }    return 0; }

user: user-2
content: 我编译你的，VS报： 运行时内存操作错误 操作了不属于自己的内存 你看我写的你满意不？  struct stTest1 { 	char *szUserid; 	char *szUserName; };  struct stTest2 { 	struct stTest1 **pTest; };  int main() { 	struct stTest2 stTmp; 	stTest1* ptest1 = (struct stTest1*)malloc(sizeof(stTest1)); 	ptest1->szUserid = (char *)malloc(50*sizeof(char)); 	ptest1->szUserName = (char *)malloc(50*sizeof(char)); 	stTmp.pTest = &ptest1; 	strcpy(((stTest1*)(*stTmp.pTest))->szUserid,"001"); 	strcpy(((stTest1*)(*stTmp.pTest))->szUserName,"xxoo"); 	printf("%s\n",ptest1->szUserid); 	printf("%s",ptest1->szUserName); 	system("pause"); 	return 1;  }
user-0 提问: 用VS2010运行C语言程序，运行结果闪一下就没了

回复:
user: user-1
content: 在工具栏上添加“开始执行（不调试）的按钮，如图片中所示，这样就不会一闪而过~~~（

user: user-2
content: 加个getchar();就OK了。

user: user-3
content: 最好在cmd窗口中输入以下命令： cd /d “exe程序所在盘符和目录” “exe程序”

user: user-4
content: ctrl-F5

user: user-5
content: 加一句system("pause"); 或者while(1);

user: user-6
content: 引用 14 楼 delandi 的回复:[quote=引用 6 楼 mujiok2003 的回复:] 多少年了， 还有那么多人加getchar(), system("pause")， 难道真当调试器是摆设？ 不好意思哈，我是新手[/quote] 不是说你，说的是那些回帖的人。

user: user-0
content: 引用 6 楼 mujiok2003 的回复:多少年了， 还有那么多人加getchar(), system("pause")， 难道真当调试器是摆设？  不好意思哈，我是新手

user: user-0
content: 引用 12 楼 zhouxiaofeng1021 的回复:加 #include<stdlib.h> system("pause"); 或者 getchar(); getchar();  你说的第一种方法可以，运行完出来按任意键继续，要的就是这种效果哈，谢谢你 我用VS2010的win32控制台应用程序

user: user-7
content: 加 #include<stdlib.h> system("pause"); 或者 getchar(); getchar();

user: user-6
content: 引用 10 楼 binaryhead 的回复:[quote=引用 9 楼 mujiok2003 的回复:] [quote=引用 8 楼 binaryhead 的回复:] [quote=引用 6 楼 mujiok2003 的回复:] 多少年了， 还有那么多人加getchar(), system("pause")， 难道真当调试器是摆设？ 你设想一下楼主使用情形，极有可能使直接运行可执行程序，此时调试器还真帮不上忙呢。[/quote] 直接运行也可托到一个控制台中，修改代码实在是下下之策[/quote] ，十分同意。增加的代码与应用的逻辑毫无关系，所给楼主讲明一闪而过的原因，指导他学会使用cmd.exe是根本方法。[/quote] en.

user: user-8
content: 引用 9 楼 mujiok2003 的回复:[quote=引用 8 楼 binaryhead 的回复:] [quote=引用 6 楼 mujiok2003 的回复:] 多少年了， 还有那么多人加getchar(), system("pause")， 难道真当调试器是摆设？ 你设想一下楼主使用情形，极有可能使直接运行可执行程序，此时调试器还真帮不上忙呢。[/quote] 直接运行也可托到一个控制台中，修改代码实在是下下之策[/quote] ，十分同意。增加的代码与应用的逻辑毫无关系，所给楼主讲明一闪而过的原因，指导他学会使用cmd.exe是根本方法。

user: user-6
content: 引用 8 楼 binaryhead 的回复:[quote=引用 6 楼 mujiok2003 的回复:] 多少年了， 还有那么多人加getchar(), system("pause")， 难道真当调试器是摆设？ 你设想一下楼主使用情形，极有可能使直接运行可执行程序，此时调试器还真帮不上忙呢。[/quote] 直接运行也可托到一个控制台中，修改代码实在是下下之策

user: user-8
content: 引用 6 楼 mujiok2003 的回复:多少年了， 还有那么多人加getchar(), system("pause")， 难道真当调试器是摆设？ 你设想一下楼主使用情形，极有可能使直接运行可执行程序，此时调试器还真帮不上忙呢。

user: user-6
content: 在输出语句后面加个断点或者CTRL + F5 直接运行

user: user-6
content: 多少年了， 还有那么多人加getchar(), system("pause")， 难道真当调试器是摆设？

user: user-8
content: 引用 4 楼 user-9 的回复:[quote=引用 2 楼 delandi 的回复:] [quote=引用 1 楼 user-9 的回复:] 在return  之前  加上一句    system("pause");   error C3861: “system”: 找不到标识符[/quote] 我一直使用都没有添加头文件的啊  你试试 添加上头文件 #include<system.h>  如果不行试试 getchar();  前提是  你说的是DOS窗口[/quote] 不要说DOS窗口好不好，控制台窗口如何？

user: user-9
content: 引用 2 楼 delandi 的回复:[quote=引用 1 楼 user-9 的回复:] 在return  之前  加上一句    system("pause");   error C3861: “system”: 找不到标识符[/quote] 我一直使用都没有添加头文件的啊  你试试 添加上头文件 #include<system.h>  如果不行试试 getchar();  前提是  你说的是DOS窗口

user: user-8
content: 引用 2 楼 delandi 的回复:[quote=引用 1 楼 user-9 的回复:] 在return  之前  加上一句    system("pause");   error C3861: “system”: 找不到标识符[/quote] 太乐了， 要不你试试在return  之前  加上一句  getchar();

user: user-0
content: 引用 1 楼 user-9 的回复:在return  之前  加上一句    system("pause");   error C3861: “system”: 找不到标识符

user: user-9
content: 在return  之前  加上一句    system("pause");
user-0 提问: 指针 数组 数据转换问题

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:unsigned char sz[5][20],*p; p=(unsigned char *)pMyStruct; for (i=0;i<5;i++) {  memcpy((void *)&sz[i][0],(void *)((unsigned char *)p+i*20),20); }  谢谢

user: user-1
content: unsigned char sz[5][20],*p; p=(unsigned char *)pMyStruct; for (i=0;i<5;i++) {  memcpy((void *)&sz[i][0],(void *)((unsigned char *)p+i*20),20); }
user-0 提问: 求C语言大神，时间紧迫

回复:
user: user-0
content: 已收藏^_^

user: user-0
content: 大神啊，写的很好呢，但是因为第二题是个H难度的题目，可不可以在实行的时候有文字步骤呢。还有哪些地方有易错点？求大神救救渣渣

user: user-1
content: 第一题参考http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E7%9F%A9%E9%98%B5%E5%8A%A0%E5%87%8F%E4%B9%98%E8%BF%90%E7%AE%97%20c%E6%BA%90%E4%BB%A3%E7%A0%81&rsv_pq=fc57f95100009881&rsv_t=8cb1hRRi96zpgFGEqfi9zkpuRJjwEGaud71ppMLuXu9bHQRifRnz&rsv_enter=0&rsv_sug3=5&rsv_sug4=74&inputT=8518

user: user-1
content: 仅供参考//输入一个小于200的字符串，将该字符串以“_”分割成小于20的字串。请输出原串和子串。 //请注意以下测试用例： //·输入空串 //·输入长度为9的字符串 //·输入长度为19的字符串 //·输入长度为20的字符串 //·输入长度为38的字符串 //·输入长度为205的字符串 //·理论上还应该考虑输入串中包含_如何处理的逻辑（这个在我的代码中没有体现） #include <stdio.h> #include <string.h> char s[201]; char d[11][21]; int i,L,n; void main() {     fgets(s,201,stdin);     L=strlen(s);     if ('\n'==s[L-1]) {s[L-1]=0;L--;}     for (i=0;i<L;i++) {         d[i/19][i%19]=s[i];         if (i!=L-1 && 18==(i%19)) {             d[i/19][19]='_';             d[i/19][20]=0;         }     }     d[i/19][i%19]=0;     if (i>0 && 0==(i%19)) {         n=i/19;     } else {         n=i/19+1;     }     printf("s=\"%s\"\n",s);     for (i=0;i<n;i++) {         printf("d[%2d]=\"%s\"\n",i,d[i]);     } }

user: user-0
content: 应该不是吧，我们老师现在哪有时间上网，你会吗，关键是第二题。

user: user-1
content: 引用 3 楼 mengjiegao_ 的回复:你怎么知道是作业，不会写啊 没准人家就是你的老师。

user: user-0
content: 你怎么知道是作业，不会写啊

user: user-2
content: 作业自己做吧

user: user-3
content: 参考 http://blog.csdn.net/gaowen1860/article/details/4725794
user-0 提问: 谁拿了最多奖学金 这一题的文件调用有问题 请大神帮帮改一下

回复:
user: user-1
content: 仅供参考 /*************************************************************************     > File Name: tyvj_1002.cpp     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月13日 星期四 16时10分40秒  ************************************************************************/  #include<iostream> #include<vector> using namespace std;  struct student { 	string name; 	int aver_result; 	int class_result; 	char leader; 	char west; 	int npaper; }; struct award { 	int naward;//奖金数目 //	int times; 	string name; }; void sum_award(struct student & stu, struct award &v) { 	v.naward = 0; 	//v.times = 0; 	v.name = stu.name; 	//院士奖学金 	if(stu.aver_result > 80 && stu.npaper >=1) 	{ 	//	v.times++; 		v.naward += 8000; 	} 	//五四等奖学金 	if(stu.aver_result > 85 && stu.class_result > 80) 	{ 	//	v.times++; 		v.naward += 4000; 	} 	//成绩优秀奖 	if(stu.aver_result > 90) 	{ 	//	v.times++; 		v.naward += 2000; 	} 	//西部奖学金 	if(stu.aver_result > 85 && stu.west == 'Y') 	{ 	//	v.times++; 		v.naward +=1000; 	} 	//班级贡献奖 	if(stu.class_result > 80 && stu.leader == 'Y') 	{ 	//	v.times++; 		v.naward +=850; 	} } int sum_of_award(struct award *p, int N) { 	int sum = 0; 	for(int i = 0; i < N; ++i) 	{ 		sum = sum + p[i].naward; 	} 	return sum; }  //寻找奖金最高的人 struct award find(struct award *p,int N) { 	struct award tmp; //	tmp.times = 0; 	tmp.naward= 0; 	for(int i =0 ; i < N; ++i) 	{ 		if(p[i].naward > tmp.naward) 		{ 			tmp.naward = p[i].naward; 		//	tmp.times = p[i].times; 			tmp.name = p[i].name; 		} 	} 	return tmp; }  int main() { 	int N; 	cin >> N; 	struct student *stu = new struct student[N]; 	struct award *p = new struct award[N]; 	for(int i = 0; i < N; ++i) 	{ 		cin >> stu[i].name; 		cin >> stu[i].aver_result; 		cin >> stu[i].class_result; 		cin >> stu[i].leader; 		cin >> stu[i].west; 		cin >> stu[i].npaper;         sum_award(stu[i],p[i]); 	} 	auto sum = sum_of_award(p,N); 	auto tmp = find(p,N); 	cout << tmp.name << endl; 	cout << tmp.naward << endl; 	cout << sum << endl; }

user: user-2
content: 请楼主参考 http://www.pudn.com/downloads464/sourcecode/others/detail1950857.html http://huobumingbai.blog.51cto.com/1196746/425898
user-0 提问: 杭电 2012

回复:
user: user-1
content: 求s的表达式错了，应该是i而不是x

user: user-0
content: …我郁闷了一夜没看出来

user: user-2
content: 试试这个 /*************************************************************************     > File Name: isperimer.cpp     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月12日 星期三 22时50分48秒  ************************************************************************/  #include<iostream> #include<vector> using namespace std;  bool isprimer(int n) { 	int i; 	bool state = true; 	for(i = 2; i < n; ++i ) 	{ 		if(0 == n % i) 		{ 			state = false; 			break; 		} 	} 	return state; }  int main() { 	int x,y,z; 	int i; 	vector<int> v; 	bool state = true; 	vector<bool> result; 	cin >> x >> y; 	while (x !=0 && y !=0) 	{ 		for(i = x; i <= y; ++i) 		{ 			z = i*i + i + 41; 			state = isprimer(z); 			if(state == false) 				break; 		} 		result.push_back(state); 		state = true; 		cin >> x >> y; 	} 	for(vector<bool>::iterator iter = result.begin();iter != result.end(); ++iter) 	{ 		if(true == *iter) 			cout << "OK" << endl; 		else 			cout << "Sorry" << endl; 	} 	return 0; }

user: user-3
content: s=x*x+x+41 这个不是应该s=i*i+i+41?

user: user-0
content: y-x+1表示定义域內所有整数 count=y-x+1说明所有的都是素数  输出OK。  scanf我那种写法也行吧

user: user-4
content: if(count==y-x+1) 貌似词不达意  另外 !(x==0&&y==0) 最好写成 (x!=0||y!=0) 可读性更好一点

user: user-0
content: Problem Description 对于表达式n^2+n+41，当n在（x,y）范围内取整数值时（包括x,y）(-39<=x<y<=50)，判定该表达式的值是否都为素数。    Input 输入数据有多组，每组占一行，由两个整数x，y组成，当x=0,y=0时，表示输入结束，该行不做处理。    Output 对于每个给定范围内的取值，如果表达式的值都为素数，则输出"OK",否则请输出“Sorry”,每组输出占一行。    Sample Input 0 1 0 0    Sample Output OK   提示wrong answer

user: user-5
content: 代码有啥问题？代码干啥的？lz都没有说明白。。。
user-0 提问: 让一个数组进行大小排列，最少的次数为多少。。。

回复:
user: user-0
content: 引用 3 楼 ForestDB 的回复:什么次数？比较的次数？移动的次数？交换的次数？ 就是最终按自己的要求排序，最有效地排序方法和次数是多少

user: user-0
content: 引用 1 楼 pengzongjy 的回复:[quote=引用 楼主 pengzongjy 的回复:] 各位大神，一个数组排列所需的最少次数是多少呢？我第一次用的是N的平方次，第二次为1到N的相加次 第二次应该是1到N-1的相加次[/quote] 谢谢了，我后来找到一篇文章，和大家分享下http://blog.csdn.net/likezhaobin/article/details/6908257 感谢大家的回答。

user: user-1
content: 什么次数？比较的次数？移动的次数？交换的次数？

user: user-2
content: 普通的排序算法都是N平方，快速排序最好的时候是nlogn，最坏情况为O(n^2) 归并(merge sort)和堆排序(heap sort)复杂度都为nlog2(n)

user: user-0
content: 引用 楼主 pengzongjy 的回复:各位大神，一个数组排列所需的最少次数是多少呢？我第一次用的是N的平方次，第二次为1到N的相加次 第二次应该是1到N-1的相加次
user-0 提问: 《C程序设计语言》第二版里面一个问题跪求解决！！

回复:
user: user-0
content: 终于解决了，第77行跟第22行一样的错误居然没看到，本新手表示还是得多练啊 while (len = getline(line, MAXLEN) > 0)

user: user-0
content: 发现第8行和22行有错 改正： char *lineptr[MAXLINES]; if ((nlines = readlines(lineptr, MAXLINES)) >= 0)  但还是不信啊，没有输出排序结果

user: user-0
content: C++还不会呐，准备自学

user: user-1
content: C中最容易错的地方是一堆char*, 用C++写吧，容易很多

user: user-0
content: 高手新手都来看下呗，忘了注释可能看得会挺费劲
user-0 提问: 为什么这个程序的输出结果是这样的，竟然有101？

回复:
user: user-1
content: int i=0; int a[50]={0};  for(i =0;i<50;i++) {  a[i]= (i+1)*2; printf("%d\t",a[i]); } printf("\n");

user: user-1
content: OK,你的写法够奇葩

user: user-2
content: 数组下标越界

user: user-3
content: 从a[0]开始的，，没有a[50]，后面的数。随机的。

user: user-4
content: a[i] , i == 5 ， 已经越界了

user: user-5
content: 引用 3 楼 u011717322 的回复:应该不会出现你这样的问题。是不是你的编译器的问题？ 我用VS看了下，没有101.最后一个是100. 哦。上面的回答是对的，a[50]是没有的，随机值。

user: user-5
content: 应该不会出现你这样的问题。是不是你的编译器的问题？ 我用VS看了下，没有101.最后一个是100.

user: user-6
content: 数组a的访问越界了，a[i]应该改为a[i-1]，C语言的数组下标是从0开始的。

user: user-7
content: int a[50]; a[0], a[1],...,a[49]  没有 a[50].
user-0 提问: linux 下用C写的一个TEA加密算法 加密字符串一旦比较长就会出问题，部分字符解密不了

回复:
user: user-1
content: 随便瞄了一眼 for(i=len;i<len1-len;i++)//使用‘\0’补齐 *(en+i)='\0';   这里就错啦 去网上找一个吧 这种东西除非你是搞这方面的想学习，否则直接用别人写好的
user-0 提问: DECT的显示功能需要哪些知识实现

回复:
user: user-1
content: 能输出了那么有输入么？

user: user-2
content: 这个其实自解压的压缩包，安装过后一般解压在C盘，你也可以直接用7-zip解压。  引用 6 楼 liaocao2010 的回复:[quote=引用 1 楼 turingo 的回复:] LM3S9B96开发板的例程包中有免费的GUI开源库，你可以参考一下。 从这里http://www.embedinfo.com/list.asp?id=349#xz下载。 SW-DK-LM3S9B96-6288.exe这个有什么用啊，不是说源码么，怎么我安装了在注册表里面都找不到[/quote]

user: user-3
content: 我也没具体做过，只是来凑凑热闹。

user: user-0
content: 引用 1 楼 turingo 的回复:LM3S9B96开发板的例程包中有免费的GUI开源库，你可以参考一下。 从这里http://www.embedinfo.com/list.asp?id=349#xz下载。 SW-DK-LM3S9B96-6288.exe这个有什么用啊，不是说源码么，怎么我安装了在注册表里面都找不到

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:信号强度 大神，您来了，显示那些要怎么做的，有没有具体的教程类的资料能看看啊

user: user-3
content: 信号强度

user: user-3
content: 显示文字总得也实现吧。 然后是 向上卷动 保存和恢复显示 要不要显示新号强度、当前电池容量？  别拿豆包不当干粮； 别当粘贴不是劳动。

user: user-0
content: 引用 1 楼 turingo 的回复:LM3S9B96开发板的例程包中有免费的GUI开源库，你可以参考一下。 从这里http://www.embedinfo.com/list.asp?id=349#xz下载。 万分感谢，好人一生平安，祝你每天生活愉快

user: user-2
content: LM3S9B96开发板的例程包中有免费的GUI开源库，你可以参考一下。 从这里http://www.embedinfo.com/list.asp?id=349#xz下载。
user-0 提问: 请教指针作为函数参数的问题

回复:
user: user-1
content: 函数内部用的指针地址，和 参数指针 首先不一样。  另外  参数的指针 地址   函数内部可以多次调用。这样很方便。  而且 其它函数需要用到这个地址的时候 也可以继续使用。不会让其指向发生改变。  其它函数也可以用。

user: user-2
content: 假设主函数里面是一个数组你++的话会改变指针多指向的值

user: user-3
content: 我學到了

user: user-4
content: 这种情况在别的语言中一样存在的，主要目的正如前面几位说的，就是为了保证形参的值不被改变

user: user-5
content: 支持赵老师的答案，我们只是需要改变指针的时候，才直接传指针的地址，其他时候都是用的指针的副本

user: user-6
content: 引用 4 楼 starytx 的回复:顶老赵。终于没说机器语言。 担心使用形参改变了传进来的实参的指向

user: user-7
content: 指针可以移动，需要入参指向原始的位置。

user: user-8
content: 当此函数多次被调用的时候，这样可以保存以前地址的值。

user: user-9
content: 顶老赵。终于没说机器语言。 担心使用形参改变了传进来的实参的指向

user: user-6
content: 怕原来指针的值丢了，无法再被free或delete了呗。

user: user-10
content: 可能 Des 在其他地方还需要，如果不需要的话，可以直接使用。因为 C 函数参数是值复制的。

user: user-11
content: 直接用的话，担心指针++后其指向被改变了。
user-0 提问: 关于C语言的语法问题

回复:
user: user-1
content: 跟编译器有关，不要这样用就能避免问题。

user: user-2
content: 引用 13 楼 liulianglin 的回复:[quote=引用 3 楼 xwuno1 的回复:] 这个跟printf的运算顺序是没有关系，问题在于入栈和出栈。首先按顺序读取i， ++i，然后在最后出栈的时候就先运行++i，后输出i的了。 如果i= 1，则按照考试的要求的话，printf("%d,%d\n", i, i++)的结果就是2， 1。 你写的这个例子不是很明显理解这个问题，但是最好不要写这样的代码。  PS #3楼的大神不知有没有试运行过代码，，，，真实输出应该是  2 2 [/quote] 个人认为 输出结果和编译器、操作系统有关，#12是我机器的反汇编，输出结果是1 ，1 而且，在这行代码执行之后，继续printf出来i，依然是1（反汇编为证）

user: user-3
content: 引用 13 楼 liulianglin 的回复:[quote=引用 3 楼 xwuno1 的回复:] 这个跟printf的运算顺序是没有关系，问题在于入栈和出栈。首先按顺序读取i， ++i，然后在最后出栈的时候就先运行++i，后输出i的了。 如果i= 1，则按照考试的要求的话，printf("%d,%d\n", i, i++)的结果就是2， 1。 你写的这个例子不是很明显理解这个问题，但是最好不要写这样的代码。  PS #3楼的大神不知有没有试运行过代码，，，，真实输出应该是  2 2 [/quote]这个具体的是根据编译器不同而不同，我说的是按照考试要求的话，结果是2,1。你可以去看看程序员面试宝典上面有这类题目。

user: user-4
content: 引用 3 楼 xwuno1 的回复:这个跟printf的运算顺序是没有关系，问题在于入栈和出栈。首先按顺序读取i， ++i，然后在最后出栈的时候就先运行++i，后输出i的了。 如果i= 1，则按照考试的要求的话，printf("%d,%d\n", i, i++)的结果就是2， 1。 你写的这个例子不是很明显理解这个问题，但是最好不要写这样的代码。  PS #3楼的大神不知有没有试运行过代码，，，，真实输出应该是  2 2

user: user-2
content: printf("%d,%d\n",i,++i); 00AB3735  mov         eax,dword ptr [i]   00AB3738  add         eax,1   00AB373B  mov         dword ptr [i],eax   00AB373E  mov         esi,esp   00AB3740  mov         ecx,dword ptr [i]   00AB3743  push        ecx   00AB3744  mov         edx,dword ptr [i]   00AB3747  push        edx   00AB3748  push        offset string "%d,%d\n" (0AB5740h)   00AB374D  call        dword ptr [__imp__printf (0AB82DCh)]   00AB3753  add         esp,0Ch   00AB3756  cmp         esi,esp   00AB3758  call        @ILT+315(__RTC_CheckEsp) (0AB1140h)    这条指令在win7 32bit反汇编，可以看到执行顺序是从左至右

user: user-5
content: 就是有规定我也不会去写这样的代码。

user: user-6
content: 呵呵，细看一下，8楼还应该看看1楼版主和5楼的回复。

user: user-6
content: 引用 8 楼 wojiaohuangyu 的回复:从右到左，我们老师今天才讲过。。。。         2楼、4楼、7楼的链接或建议都忽视么。你们老师是怎么讲的？是否你们老师只是讲的是函数入栈的顺序（尽管不同的函数调用协议入栈顺序并不相同）？而楼主提的却是”参数运算的顺序“，你是否需要再确认一下？

user: user-7
content: 从右到左，我们老师今天才讲过。。。。

user: user-8
content: 像这种东西，是跟编译器有关的，楼主最好还是不要花太多时间在这上边

user: user-9
content: 引用 3 楼 xwuno1 的回复:这个跟printf的运算顺序是没有关系，问题在于入栈和出栈。首先按顺序读取i， ++i，然后在最后出栈的时候就先运行++i，后输出i的了。 如果i= 1，则按照考试的要求的话，printf("%d,%d\n", i, i++)的结果就是2， 1。 你写的这个例子不是很明显理解这个问题，但是最好不要写这样的代码。刚刚好相反 和入栈出栈没什么关系 和 运算顺序 有那么点关系  你得明白一点 进栈的是 这些表达式的求值结果 而不是这些表达式  foo(1+3) 进栈数据是 4 而不是1+3 明白吗 先完成求值 再进栈 完全没问题  而这里求值顺序不同可能出现不同的求职结果  然后不同的求值结果 都按照你所说的顺序入栈  毫无违和感

user: user-10
content: C/C++ 语言对于函数参数的计算顺序没有要求。 这就是为什么建议 短路表达式运算符不建议重载的原因。

user: user-11
content: 尽量避免写这种含糊不清的代码，勤快点分开多写几行起码质量有保证

user: user-3
content: 这个跟printf的运算顺序是没有关系，问题在于入栈和出栈。首先按顺序读取i， ++i，然后在最后出栈的时候就先运行++i，后输出i的了。 如果i= 1，则按照考试的要求的话，printf("%d,%d\n", i, i++)的结果就是2， 1。 你写的这个例子不是很明显理解这个问题，但是最好不要写这样的代码。

user: user-12
content: 参考置顶帖子http://bbs.csdn.net/topics/370153775

user: user-13
content: 没有 请输入长度最少是6的字符串
user-0 提问: 函数可以返回局部变量么？

回复:
user: user-1
content: 楼上说的很详细  <<effective c++>> 这本书里写得更详细

user: user-2
content: 一般的来说，函数是可以返回局部变量的。 局部变量的作用域只在函数内部，在函数返回后，局部变量的内存已经释放了。因此，如果函数返回的是局部变量的值，不涉及地址，程序不会出错。但是如果返回的是局部变量的地址(指针)的话，程序运行后会出错。因为函数只是把指针复制后返回了，但是指针指向的内容已经被释放了，这样指针指向的内容就是不可预料的内容，调用就会出错。准确的来说，函数不能通过返回指向栈内存的指针(注意这里指的是栈，返回指向堆内存的指针是可以的)。

user: user-3
content: 返回值是可以的，但是不能返回地址。这个比较重要

user: user-4
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的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-5
content: int具有值语义， 返回的拷贝，所以没有问题。  但是int*或int&是引用语义， 没有返回拷贝， 所以不能返回局部变量的引用或地址。

user: user-6
content: 可以返回局部变量，一般所说的是不能返回局部变量的地址（比如说一个局部对象的指针）

user: user-7
content: 函数可以返回局部变量, 但一般不能返回局部变量指针. 返回局部变量, 只要是基本的数据类型, 那是没有问题的. 但如果返回的是一个类, 或者结构体就是需要考虑内部是否有指针, 如果有指针, 也可能是不安全的.

user: user-0
content: 引用楼上说的很详细<<effective c++>> 这本书里写得更详细  哪章哪节？

user: user-8
content: 引用 1 楼 Baoge_leopard 的回复:一般的来说，函数是可以返回局部变量的。 局部变量的作用域只在函数内部，在函数返回后，局部变量的内存已经释放了。因此，如果函数返回的是局部变量的值，不涉及地址，程序不会出错。但是如果返回的是局部变量的地址(指针)的话，程序运行后会出错。因为函数只是把指针复制后返回了，但是指针指向的内容已经被释放了，这样指针指向的内容就是不可预料的内容，调用就会出错。准确的来说，函数不能通过返回指向栈内存的指针(注意这里指的是栈，返回指向堆内存的指针是可以的)。 Up

user: user-9
content: 可以的，但是不能返回局部变量的地址   int *M()   {     int a=2;     return &a;    /* bad */   }

user: user-10
content: 引用 1 楼 Baoge_leopard 的回复:一般的来说，函数是可以返回局部变量的。 局部变量的作用域只在函数内部，在函数返回后，局部变量的内存已经释放了。因此，如果函数返回的是局部变量的值，不涉及地址，程序不会出错。但是如果返回的是局部变量的地址(指针)的话，程序运行后会出错。因为函数只是把指针复制后返回了，但是指针指向的内容已经被释放了，这样指针指向的内容就是不可预料的内容，调用就会出错。准确的来说，函数不能通过返回指向栈内存的指针(注意这里指的是栈，返回指向堆内存的指针是可以的)。 +1

user: user-11
content: 一个函数return后，这个函数即结束，其中所有的在该函数内声明定义的变量全部死亡～～ 我们之所以能return a  是因为： 当程序走到reuturn a这句话的时候，其实是找了个临时的空间，复制一个a的副本，然后将这个副本返回，因为a已经死了～～  当然，其实单纯从学习c++的角度而言，你暂时不需要知道这么详细，你只需要理解了1楼说的话就OK了   其他这些你学多了再回头来理解
user-0 提问: 请教：这段time函数应该怎么理解

回复:
user: user-1
content: struct tm {   int tm_sec; /* seconds */   int tm_min; /* minutes */   int tm_hour; /* hours */   int tm_mday; /* day of the month */   int tm_mon; /* month */   int tm_year; /* year */   int tm_wday; /* day of the week */   int tm_yday; /* day in the year */   int tm_isdst; /* daylight saving time */   }    库结构体 定义的东西。可以调用这个结构体

user: user-2
content: time_t: arithmetic types capable of representing times

user: user-3
content: 理解和讨论之前请先学会如何观察！  VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-4
content: time_t是一个struct结构，结构定义在time.h头文件里面    struct tm {   int tm_sec; /* seconds */   int tm_min; /* minutes */   int tm_hour; /* hours */   int tm_mday; /* day of the month */   int tm_mon; /* month */   int tm_year; /* year */   int tm_wday; /* day of the week */   int tm_yday; /* day in the year */   int tm_isdst; /* daylight saving time */   }

user: user-5
content: 就把它当成int这样的类型来理解。 多看函数参考手册，或者man page。

user: user-6
content: time_t是基本类型，可以从头文件里找到。只是用到了typedef；

user: user-7
content: 是个结构体变量这段代码是用time给t赋值，再用locatetime把t转换成本地时间并存到ptm中。
user-0 提问: 菜鸟问基础问题 

回复:
user: user-1
content: 参考 http://www.cppblog.com/luqingfei/archive/2010/08/06/122435.html Windows操作系统干脆为用户程序安排好了一切。具体表现在为用户程序的代码段、数据段和堆栈段全部预定义好了段描述符。这些段的起始地址为0，限长为ffffffff，所以用它们可以直接寻址全部的4GB地址空间。程序开始执行的时候，CS，DS，ES和SS都已经指向了正确的描述符，在整个程序的生命周期内，程序员不必改动这些段寄存器，也不必关心它们的值究竟是多少（实际上，想改也改不了）。

user: user-2
content: 依稀记得32位的机器上这几个段地址就一样了。 可以找8086的汇编，再找找32位汇编，一查就知。
user-0 提问: 求c语言大神

回复:
user: user-1
content: 正序倒序一起来 /*************************************************************************     > File Name: f.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月09日 星期日 19时00分44秒  ************************************************************************/  #include<stdio.h> void print(unsigned); int main() { 	unsigned int a; 	scanf("%u",&a); 	printf("%d",a); 	printf("\n"); 	print(a); 	return 0; }  void print(unsigned int a) { 	printf("%d",a%10); 	if(a/10 == 0) 		; 	else 		print(a/10); }

user: user-1
content: 正序太简单，还是倒叙吧 /*************************************************************************     > File Name: f.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月09日 星期日 19时00分44秒  ************************************************************************/  #include<stdio.h> void print(unsigned); int main() { 	unsigned int a; 	scanf("%u",&a); 	print(a); 	return 0; }  void print(unsigned int a) { 	printf("%d",a%10); 	if(a/10 == 0) 		; 	else 		print(a/10); }

user: user-2
content: 正序输出，那么可以把除10取余的值倒叙放到数组里。

user: user-3
content: long lNum = 0L; 	int i = 0; 	int nArray[6] = { 0 }; 	scanf_s("%ld", &lNum);  	while (i < 6 && lNum > 0) 	{ 		nArray[i++] = (int)lNum % 10L; 		lNum /= 10L; 	}  	while (--i >= 0) 	{ 		printf("%d", nArray[i]); 	} 	printf("%d\n");

user: user-4
content: 给你个逆序输出的：  int n = 0; 	cout<<"请输入n:"<<endl; 	cin>>n; 	cout<<"逆序如下："<<endl;  	while( n != 0 )  //一直循环到n 等于 0时，表示n此时是一个一位数了，也就是输入数字的最高位，退出循环 	{ 		cout<<n%10;  //n%10 标示n对10求余，结果是n的个位数 将这个个位数输出 比如：123 % 10，结果就是3 		 		n /= 10;//n/10 标示n对10求商，结果是n除了个位数意外的数，比如：n如果等于123，n /= 10的话，n就等于12，	  	} 	cin>>n;
user-0 提问: 高分在线等（纹理坐标）

回复:
user: user-1
content: 我印象纹理坐标有几种寻址方式，当uv 坐标不在 [0,1]区间时也有意义。 opengl 的话，可以搜索 GL_TEXTURE_WRAP_S , GL_TEXTURE_WRAP_T  这类关键字，能够看到解释

user: user-0

user: user-2
content: 参考 http://www.cppblog.com/flashboy/archive/2009/01/03/71056.html

user: user-0
content: 自顶
user-0 提问: 下面写的这个函数为什么有内存泄露？

回复:
user: user-1
content: 同意楼上的，你这个函数返回的是个动态数组，用完之后要free，不然它还是在的。还有，你这循环1000*1000次，不说是这么一个大函数，就算只是一个小的赋值操作，都要等一下才能看的到结果。

user: user-2
content: E_inv没有free，注意先用个for循环释放就好了。

user: user-3
content: //计算协方差的逆阵     double** E_inv = MatrixInverse(cov,nBand);  这个E_inv 没释放

user: user-0
content: 还有谁知道原因吗？

user: user-0
content: 引用 5 楼 u013580497 的回复:不能重复利用吗？我觉得那个函数里面的E_inv、x_u、temp三个指针占用的空间应该是重复利用的，但结果是随调用次数增加，内存占用也增加

user: user-4
content: 不能重复利用吗？

user: user-0
content: 引用 2 楼 u013163178 的回复:同意楼上的，只是这里改一下 free(temp);temp = NULL; free(x_u);temp = NULL; 改成 free(temp);temp = NULL; free(x_u);x_u = NULL;  嗯，这里粗心了，但改了还是一样的结果，占用的内存感觉没被释放

user: user-0
content: 引用 1 楼 user-6 的回复:看看这个函数调用double** E_inv = MatrixInverse(cov,nBand);  这个函数是这样的：  //矩阵的求逆 double** MatrixInverse(double **A,int M)  { 	int i,j,k; 	double** A_inv = CreateMatrix(M,M); 	double** AE = CreateMatrix(M,2*M); 	for (i=0;i<M;i++) 	{ 		memset(A_inv[i],0,sizeof(double)*M); 		memset(AE[i],0,sizeof(double)*2*M); 	} 	for(i=0;i<M;i++)     {         for(j=0;j<M;j++)         {             AE[i][j]=A[i][j];         }     } 	for(i=0;i<M;i++)     {         for(j=M;j<2*M;j++)         {             if(i==(j-M))             {                 AE[i][j]=1;             }             else             {                 AE[i][j]=0;             }         }     } 	/*****************求逆模块***********************/     for(i=0;i<M;i++)     {         if(AE[i][i]==0)         {             for(k=i;k<M;k++)             {                 if(AE[k][k]!=0)                 {                     for(int j=0;j<2*M;j++)                     {                         double temp;                         temp=AE[i][j];                         AE[i][j]=AE[k][j];                         AE[k][j]=temp;                     }                     break;                 }             }             if(k==M)             {                 printf("该矩阵不可逆！\n");             }         }         for(j=2*M-1;j>=i;j--)         {             AE[i][j]/=AE[i][i];         }         for(k=0;k<M;k++)         {             if(k!=i)             {                 double temp=AE[k][i];                 for(j=0;j<2*M;j++)                 {                     AE[k][j]-=temp*AE[i][j];                 }             }         }     }     /*****************获取逆矩阵***********************/ 	 for(i=0;i<M;i++)     {         for(j=M;j<2*M;j++)         {             A_inv[i][j-M]=AE[i][j];         }     } 	 for (i=0;i<M;i++) 	 { 		 free(AE[i]); 		 AE[i] = NULL; 	 } 	 free(AE); 	 AE = NULL; 	 return A_inv; }  //创建一个m行n列的double型矩阵 double** CreateMatrix(int m, int n) { 	double** Matrix; 	int i;     Matrix = (double **) malloc(sizeof(double *) * m);     for(i = 0; i < m; i++)     {             Matrix[i] = (double *) malloc(sizeof(double) * n);     }     return Matrix; }

user: user-5
content: 同意楼上的，只是这里改一下 free(temp);temp = NULL; free(x_u);temp = NULL; 改成 free(temp);temp = NULL; free(x_u);x_u = NULL;

user: user-6
content: 看看这个函数调用double** E_inv = MatrixInverse(cov,nBand);
user-0 提问: 关于递归的运行错误问题

回复:
user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  了解基本工作原理和主要递归因素，从这个帖子不但解决了问题，还更深入理解递归函数的运用了，谢谢你!

user: user-0
content: 引用 3 楼 u013163178 的回复:你这哪里是求阶乘啊，你是求m的n次幂 #include <stdio.h>  long Power_loop (int m,int n) {     long result = 1;     for (int i = 1; i <= n;i++){         result *= m;     }     return result; }  long PowerRecursive (int a,int b) {     if (b > 1)//改这里         return PowerRecursive(a,b-1) * a;     else         return a;//改这里      } int main(void) {     printf("loop = %ld\n",Power_loop(9,8));     printf("Recursive = %ld\n",PowerRecursive(9,8));     return 0; } 如果是求阶乘的话，就该这么写啊 #include<stdio.h> int f(int n) { 	if(n == 1 || n == 2) 	return n; 	else 	return f(n-1)*n; }  int main() { 	int n; 	scanf("%d",&n); 	printf("%d",f(5)); 	return 0; } 感谢，您用两个例子让我更清晰了解我的练习题的问题了，确实算的是次幂，只是用了递归的思想去完成。

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

user: user-2
content: 递归没有退出条件，即没有对b值的边界没有判断，所以会一直递归下去。另外，递归函数会不断申请函数栈空间，死循环会造成栈溢出，所以会有段错误。

user: user-3
content: 你这哪里是求阶乘啊，你是求m的n次幂 #include <stdio.h>  long Power_loop (int m,int n) {     long result = 1;     for (int i = 1; i <= n;i++){         result *= m;     }     return result; }  long PowerRecursive (int a,int b) {     if (b > 1)//改这里         return PowerRecursive(a,b-1) * a;     else         return a;//改这里      } int main(void) {     printf("loop = %ld\n",Power_loop(9,8));     printf("Recursive = %ld\n",PowerRecursive(9,8));     return 0; } 如果是求阶乘的话，就该这么写啊 #include<stdio.h> int f(int n) { 	if(n == 1 || n == 2) 	return n; 	else 	return f(n-1)*n; }  int main() { 	int n; 	scanf("%d",&n); 	printf("%d",f(5)); 	return 0; }

user: user-0
content: 引用 1 楼 wufeng55 的回复:你的程序有问题啊，递归的函数是个死递归，a的值不变，只是b的值一直在变化，函数里的if语句执行不了，怎么能return呢？ 你好，程序确实有问题，我已经修改好了。这个程序算的是一个数的阶乘，所以a的值是一直不变的 修改后正确的应该是这样的：  #include <stdio.h>  long Power_loop (int m,int n) {     long result = 1;     for (int i = 1; i <= n;i++){         result *= m;     }     return result; }  long PowerRecursive (int a,int b) {     if (b > 0)         return PowerRecursive(a,b-1) * a;     else         return 1;      } int main(void) {     printf("loop = %ld\n",Power_loop(9,8));     printf("Recursive = %ld\n",PowerRecursive(9,8));     return 0; }

user: user-4
content: 你的程序有问题啊，递归的函数是个死递归，a的值不变，只是b的值一直在变化，函数里的if语句执行不了，怎么能return呢？
user-0 提问: 为什么执行这个程序时会有错误

回复:
user: user-1

user: user-2
content: 楼主应该是想用变长数组，新版本支持，测试环境GCC 4.8.2，支持，但是你这样也不对，即使用变长数组，但在使用前要进行申明,如：int a=10,b=10; char chars [a][b],需这样，即使用使用变长数组也得在使用前对维变量进行赋值的

user: user-3
content: 钻石级C/C++er都不用QQ、微信这种经常打断编程思路的工具。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:#include <stdio.h> int main() {     int i,j,temp,a[6];      printf("请输入六个整数（空格间隔）：\n");     for (i=0;i<6;i++) scanf("%d",&a[i]);     for (i=0;i<5;i++) {         for (j=i+1;j<6;j++) {             if (a[i]>a[j]) {                 temp=a[i];a[i]=a[j];a[j]=temp;             }         }     }     printf("排序后:\n");     for (i=0;i<6;i++) printf("%d ",a[i]);     return 0; }  老师，能否把你的软件发到我的邮箱上，我的邮箱是895007098@qq.com. 您的QQ是，或者微信账号是，能否告诉我，这样我在遇到一些不懂的问题就可以方便向您请教。谢谢。

user: user-3
content: #include <stdio.h> int main() {     int i,j,temp,a[6];      printf("请输入六个整数（空格间隔）：\n");     for (i=0;i<6;i++) scanf("%d",&a[i]);     for (i=0;i<5;i++) {         for (j=i+1;j<6;j++) {             if (a[i]>a[j]) {                 temp=a[i];a[i]=a[j];a[j]=temp;             }         }     }     printf("排序后:\n");     for (i=0;i<6;i++) printf("%d ",a[i]);     return 0; }

user: user-0
content: 引用 12 楼 zhouxiaofeng1021 的回复:int i,j,temp,a[i]; 这里a[i]错了 不能这样写的 i值必须是常量，这是编译时候后就确定控件大小，静态分配 改成a[6]就可以 如果用动态大小数据 需要分配堆内存 分配堆内存是什么意思？

user: user-4
content: int i,j,temp,a[i]; 这里a[i]错了 不能这样写的 i值必须是常量，这是编译时候后就确定控件大小，静态分配 改成a[6]就可以 如果用动态大小数据 需要分配堆内存

user: user-5
content: a[i] 静态数组定义需要用常量

user: user-6
content: 引用 7 楼 qq_21327741 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] #include <stdio.h> int main() {     int i,j,temp,a[6];      printf("请输入六个整数（空格间隔）：\n");     for (i=0;i<6;i++) scanf("%d",&a[i]);     for (i=0;i<5;i++) {         for (j=i+1;j<6;j++) {             if (a[i]>a[j]) {                 temp=a[i];a[i]=a[j];a[j]=temp;             }         }     }     printf("排序后:\n");     for (i=0;i<6;i++) printf("%d ",a[i]);     return 0; }  老师，能否把你的软件发到我的邮箱上，我的邮箱是895007098@qq.com. 您的QQ是，或者微信账号是，能否告诉我，这样我在遇到一些不懂的问题就可以方便向您请教。谢谢。[/quote] 有问题的时候，应该上论坛来讨论。 你不能只图自己方便。 论坛讨论可以别人分享， 问题也可以快速得到解答。

user: user-0
content: 好吧，那请您把那个软件发给我好吗

user: user-0
content: 但是这个程序还是有错误，不能排序，请问要怎么改，才能从小到大排序

user: user-6
content: 引用int i,j,temp,a[i];  -->  int i,j,temp,a[6];

user: user-7
content: 引用 2 楼 qq_21327741 的回复:什么意思，那要怎么改，为什么数组的大小要用常量？ 说好的用常量的呀！ int i,j,temp,a[i]; 改成 int i,j,temp,a[6]; 不就可以了吗？  3.5.4.2 Array declarators  Constraints     The expression that specifies the size of an array shall be an integral constant expression that has a value greater than zero.  Semantics     If, in the declaration `` T D1 ,'' D1 has the form            D[ constant-expression<opt>]  and the type specified for ident in the declaration `` T D '' is `` "derived-declarator-type-list T" ,'' then the type specified for ident is `` derived-declarator-type-list array of T .''/60/ If the size is not present, the array type is an incomplete type.     For two array types to be compatible, both shall have compatible element types, and if both size specifiers are present, they shall have the same value.

user: user-0
content: 什么意思，那要怎么改，为什么数组的大小要用常量？

user: user-7
content: 数组的大小要用常量啊 constant
user-0 提问: C语言新手 各位大神帮忙看看 这个程序有什么问题

回复:
user: user-0
content: 好的 谢谢了

user: user-1
content: 假如输入分别是1 2 3 4 a转置前的逻辑结构就是 1 2 3 4  双重循环的转置过程就是 1=1 3=2 2=2 4=4 结果打印出来就是 12 24
user-0 提问: 为什么输入97.5还能通过，不显示出错误

回复:
user: user-0
content: 那我应该怎么改才能让97.5成功输入呢，改为float类型的时候就不能进行求余

user: user-1
content: 你定义的是整数，读的格式是%d，当然不会有错。读进来的就是97

user: user-2
content: 引用 2 楼 qq_21327741 的回复:那我应该怎么改才能让97.5成功输入呢，改为float类型的时候就不能进行求余float强制转换为int再求余
user-0 提问: c语言简单问题

回复:
user: user-1
content: 搜scanf与输入缓存区

user: user-2
content: 引用 楼主 changkai11 的回复:#include<stdio.h>  int main () { 	char k1,k2; 	int a; 	scanf("%d",&a); 	switch(a) 	{ 	case 1: 	    printf("请输入插入的数___\b"); 		scanf("%c",&k1); 		printf("*******"); 		printf("输入插入位置___\b"); 		scanf("%c",&k2);//case 1中的我想是输一个数，跳一行，但是，直接都输出了，这是为什么 	} 	printf("*******%C***%C",k1,k2); }  就是2楼说的%c只接收一个字符，所以回车就给了k2了！！！ 添加一个getchar（）；在一二输入之间

user: user-3
content: 没有加break吧

user: user-4
content: 用%d，不要用%c 用%c的话，空格回车什么的都算输入，k2就把回车读入了

user: user-5
content: k1的ASCII值为\n   只需要给两个scanf之间加getch（）
user-0 提问: 我是新手，，请大家帮我解答一下，那有错，为什么运行结果是错误的，

回复:
user: user-0
content: 谢谢，，是我太粗心了，，

user: user-1
content: #include "stdio.h" void main() {     int a,b,c=1,d[2][3];     for (a=0;a<2;a++)     {     	for (b=0;b<3;b++)     	{     	d[a][b]=c;     	c++;     	}     }     for (a=0;a<2;a++)     {     	for (b=0;b<3;b++)     	{     	printf("d[%d][%d]=%d,",a,b,d[a][b]);     	}     	printf("\n");     } } 我运行这个是没错的

user: user-2
content: #include "stdio.h" void main() { 	int a, b, c = 1, d[2][3]; 	for ( a = 0; a < 2; a++ ) 	{ 		for ( b = 0; b < 3; b++ ) 		{ 			d[a][b] = c; 			c++; 		} 	} 	for ( a = 0; a < 2; a++ ) 	{ 		for ( b = 0; b < 3; b++ ) 		{ 			printf( "d[%d][%d]=%d,", a, b, d[a][b] );//输出整数都用%d 		} 		printf( "\n" ); 	} }