Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 两头堵去空字符哪里错了！帮忙看看

回复:
user: user-1
content: char str[]= "   sdadfaf    ";  	改为这样就好了

user: user-1
content: 有心情再看代码，，，，，，，，，，，，

user: user-2
content: //strcpy(sub_str, begin)   可能会缓冲区溢出 strncpy(sub_str, begin,  (int)(end-begin));

user: user-3
content: 没有使用  \0 把数据封闭掉吧  你看下调试，后面都没封闭

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int main(void) { 	char* str = "   sdadfaf    ";  //str指针指向一个字符串常亮，这个字符串没有\0？ 	char* sub_str = NULL;  	char* begin = str; 	char* end = NULL; 	end = begin + strlen(str) - 1; 	 	int count = 0; 	while (isspace(*begin) && *begin != '\0') 	{ 		begin++; 	} 	while (isspace(*end)&&end>begin) 	{ 		end--; 	} 	int len = end - begin + 1;  //这个是7是对的  	printf("len:%d\n",len); 	sub_str = (char*)malloc(len + 1);  //在堆上开辟7+1个空间，加了一个|0 	strncpy(sub_str, begin,len);      //这里为什么编译器老是提示我错误，错误在哪里？  	printf("begin:%s\n", begin);  	return 0; } 我这样改了 ，但是复制函数出错了，错在哪里

user: user-3
content: char* str = "   sdadfaf    ";  //str指针指向一个字符串常亮，这个字符串没有\0？  *(end++) = '\0';                 //我在end后一个位置添加一个\0  两句冲突了

user: user-0
content: 我可能想到哪里错了，end是指向字符串常亮的指针，*（end+1）还在字符串常量里面，我去改变了字符串常量里面的字符所以崩溃了。

user: user-3
content: char str[] = "   sdadfaf    ";  //str指针指向一个字符串常亮，这个字符串没有\0？ 这一行改下就可以了， 看来楼主的代码 又去改动 字符串常量，然后系统帮你程序结束了

user: user-3
content: str 是这个指针，指向了个字符串常量，常量是不能去改的  #include <iostream> #include <string> #include <cstring>  using namespace std;  // 删除字符串前后空白 string strTrim(string& str) {     str = str.substr(str.find_first_not_of("\t \n"));        // 查找非空白处获取子串     str = str.substr(0, str.find_last_not_of("\t \n") + 1);  // 找最后一个非空白处获取子串     return str; }    // VC6.0 的_strrev 的源码 _strrev 不是标准库，所以可以应急自己写一个 char* cs_strrev(char* string) {     char* start = string;     char* left = string;     char ch;      while (*string++) // 找到string 末位的'\0'，         ;             // 因为上面 string++，实际指针在 '\0'的后一个     string -= 2;      // 所以退2格，回到字符串最后一个字母     while (left < string) {         ch = *left;    // 通过临时变量 ch 进行交换         *left++ = *string;         *string-- = ch;     }     return(start); }  char* csTrim(char* cs) {     char* ret = cs;     char* pc = new char[strlen(cs) + 1];      int pos = strspn(cs , "\t \n");     // 查找非空白处pos     strcpy(pc , cs + pos);     cs_strrev(pc);                        // 反序字符串     pos = strspn(pc , "\t \n");         // 原来后面的空白，就变成了前面的空白     strcpy(cs , pc + pos);     cs_strrev(cs);                        // 再反序，还原回来      delete[] pc;     return ret; }  char* csTrim_v2(char* cs) {     char* ret = cs;     char* pc = new char[strlen(cs) + 1];      int pos = strspn(cs , "\t \n");     // 查找非空白处pos     strcpy(pc , cs + pos);      char* end = pc;     while (*end++)     // 找到字符串末位的'\0'，         ;              // 因为上面 end++，实际指针在 '\0'的后一个     end -= 2;          // 所以退2格，回到字符串最后一个字母      while (*end == ' ' || *end == '\t' ||  *end == '\n') {         *end-- = '\0';     }     strcpy(cs , pc);      delete[] pc;     return ret; }      int main() {     string str = " \t \n  你好世界!  \t \n ";     char cs[] =  " \t \n  你好世界!  \t \n ";      cout << strTrim(str)  << csTrim_v2(cs) << endl;     return 0; }
user-0 提问: 求助:C语言内存地址+多级偏移的写法

回复:
user: user-0
content: 引用 2 楼 paschen 的回复:建议写成一个宏，直接套宏就行 我就是不会组合啊.  求给个例子

user: user-1
content: 建议写成一个宏，直接套宏就行

user: user-2
content: 应该是括号问题吧.括号加好就行了.另外,写这种看起来眼都花的代码的人一定要开掉.
user-0 提问: 求自动调焦算法源码？爬山算法源码？谢谢~

回复:
user: user-1
content: 爬山主要就是自适应步长的选择，因为需要快速聚焦而且又不能多次在聚焦点震荡。 另：图像的聚焦评价函数值必须精准，稍有波动就会导致聚焦不理想。这涉及到图像质量的问题
user-0 提问: 有谁知道gcc的转义函数在什么地方啊

回复:
user: user-1
content: gcc 的在这里： https://github.com/gcc-mirror/gcc/blob/master/libcpp/charset.c  参考 cpp_interpret_string  convert_escape 。

user: user-2
content: 字符串字面量的转义应该是编译器处理的

user: user-2
content: 自己写转义函数不就行了

user: user-0
content: 不是   我就是需要一个这样的函数

user: user-1
content: 你在看 gcc 的源码嘛？
user-0 提问: 递归创建二叉树输入无法停止

回复:
user: user-1
content: 需要输入叶子节点或单分支节点的空指针用'#'代替

user: user-2
content: 你的createBiTree会一直递归调用，导致一直等待输入

user: user-3
content: 是你的输入有问题吧？ 比如你要创建两层的二叉树：  s a d 那输入的应该是sa##d##

user: user-4
content: LZ可以试下这一串，保证能正常输出： Bi#ng###o##
user-0 提问: 麻烦大家帮我看一下一道升气球的题，测试的例子都过了，但一直是WA，杭电的。谢谢

回复:
user: user-0
content: 引用 3 楼 huang826336127 的回复:那我这个代码，你过了没，嘻嘻  我没有试诶。。 我先弄懂然后看看能不能自己写出来把

user: user-1
content: 那我这个代码，你过了没，嘻嘻

user: user-0
content: 引用 1 楼 huang826336127 的回复:哈哈，这题我做过，给你贴个代码吧， #include<stdio.h> #include<stdlib.h> #include<string.h> #define NODE struct node  NODE { 	char color[16]; 	int time; 	NODE *next; }; NODE *p_new(); int str_comp(const char *strDest,const char *strSrc); int main() { 	NODE *head,*p,*q; 	int num,max;char color[16]; 	while(scanf("%d",&num)!=-1) 	{ 		if(num==0)break; 		head=p=p_new();p->next=NULL;  		while(num--!=0) 		{ 			scanf("%s",color); 			p=head->next; 			while(p!=NULL) 			{ 				if(str_comp(color,p->color)){p->time+=1;break;} 				p=p->next; 			} 			if(p==NULL) 			{ 				p=p_new();p->next=head->next;head->next=p; 				strcpy(p->color,color); 				p->time=1; 			} 		} 		p=head->next;max=p->time;q=p; 		while(p!=NULL) 		{ 			if(max<p->time){q=p;max=p->time;} 			p=p->next; 		} 		printf("%s\n",q->color); 		head->next=NULL; 	} 	return 0; }  int str_comp(const char *strDest,const char *strSrc) {   while(strDest[0]==strSrc[0]){if(strDest[0]=='\0'||strSrc[0]=='\0')break;*strDest++;*strSrc++;}   if(strDest[0]=='\0'&&strSrc[0]=='\0')return 1;else return 0; }  NODE *p_new() { 	return (NODE *)calloc(1,sizeof(NODE)); }   虽然有很多地方看不懂，但还是谢谢你！ 刚刚入门，许多东西还不熟悉。

user: user-1
content: 哈哈，这题我做过，给你贴个代码吧， #include<stdio.h> #include<stdlib.h> #include<string.h> #define NODE struct node  NODE { 	char color[16]; 	int time; 	NODE *next; }; NODE *p_new(); int str_comp(const char *strDest,const char *strSrc); int main() { 	NODE *head,*p,*q; 	int num,max;char color[16]; 	while(scanf("%d",&num)!=-1) 	{ 		if(num==0)break; 		head=p=p_new();p->next=NULL;  		while(num--!=0) 		{ 			scanf("%s",color); 			p=head->next; 			while(p!=NULL) 			{ 				if(str_comp(color,p->color)){p->time+=1;break;} 				p=p->next; 			} 			if(p==NULL) 			{ 				p=p_new();p->next=head->next;head->next=p; 				strcpy(p->color,color); 				p->time=1; 			} 		} 		p=head->next;max=p->time;q=p; 		while(p!=NULL) 		{ 			if(max<p->time){q=p;max=p->time;} 			p=p->next; 		} 		printf("%s\n",q->color); 		head->next=NULL; 	} 	return 0; }  int str_comp(const char *strDest,const char *strSrc) {   while(strDest[0]==strSrc[0]){if(strDest[0]=='\0'||strSrc[0]=='\0')break;*strDest++;*strSrc++;}   if(strDest[0]=='\0'&&strSrc[0]=='\0')return 1;else return 0; }  NODE *p_new() { 	return (NODE *)calloc(1,sizeof(NODE)); }
user-0 提问: C++编译后，没有用到的函数会被自动优化（删除）掉吗

回复:
user: user-1
content: C语言指针与汇编内存地址-一.代码要素      http://edu.csdn.net/course/detail/2344

user: user-2
content: 自己写的而且没被调用的函数（注意不包括没有specialized的模板），如果不是inline或static，都会被编译，因为编译分两步，首先每个translation unit都会被编译为o file，然后所有o file会被链接成目标文件。而目标文件不一定是可执行程序，也可以是动态链接库，这个时候那些没被用过的函数当然要留下，因为如果是动态链接库那么它在未来任何时候都有可能被另一个程序链接，所以无法判断一个函数是否真的不会再被使用。如果是inline或者static，不用的就会被删除，毕竟在其他translation unit里都不可见，所以删除了不会有任何副作用   实验表明，gcc无论开O3还是Os都不会在最终的可执行程序中删除没被使用的函数。不过，链接器的确有个选项可以删除可执行文件中没被使用的函数（甚至空的section也可以删除），而这些选项可以通过gcc前端传过去。   另外，全局没初始化的非static变量本身不会占据任意大的空间，只会占据一个descriptor，就是可执行文件里bss段多一个记录说明其大小，然后运行时由操作系统分配足够多的空间给该变量并且清零（说明白了，反正都是0，才不会花空间去储存）。全局static变量则因为外部不可见，所以不用的话会被编译器删除。

user: user-3
content: 一般RELEASE版默认配置是会的，例如VS，在项目属性——C/C++——代码生成 里有一个叫启用函数级链接就是做这个事的，先择是(/Gy)，那么就会删除没用到的

user: user-4
content: 大学有开编译原理哦

user: user-5
content: 用debug
user-0 提问: 关于opencv里MAT在C里边改写的问题

回复:
user: user-1
content: 引用 3 楼 fangzhangran956 的回复:[quote=引用 1 楼 paschen 的回复:] 使用二级指针加动态申请内存可以解决，不过函数参数传递时，你还需要把每一唯的大小传入函数 可是我不知道高维的维数，所以很纠结[/quote]  你是指大小不确定吗，那可以参照先分配适当空间，不够时再分配更大的

user: user-0
content: 引用 1 楼 paschen 的回复:使用二级指针加动态申请内存可以解决，不过函数参数传递时，你还需要把每一唯的大小传入函数 可是我不知道高维的维数，所以很纠结

user: user-2
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不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！

user: user-1
content: 使用二级指针加动态申请内存可以解决，不过函数参数传递时，你还需要把每一唯的大小传入函数
user-0 提问: C语言求和

回复:
user: user-1
content: 可以用递归http://codepad.org/eD6VqoSY

user: user-2
content: http://blog.csdn.net/nuaazdh/article/details/7621340

user: user-3
content: http://blog.csdn.net/zhangxiangdavaid/article/details/31032251 具体问题具体分析

user: user-0
content: Debug/jie'chemg22.exe : fatal error LNK1169: one or more multiply defined symbols found    请问这是什么意思

user: user-0
content: 谢谢啦！！！

user: user-4
content: http://www.2cto.com/kf/201510/447754.html

user: user-5
content: http://www.2cto.com/kf/201510/447754.html
user-0 提问: 利用MPI 编程,寻找一条染色体中的CG含量

回复:
user: user-1
content: MPI我也没接触过。 文件过大可以用linux的函数read，是没有缓冲的，直接一次性读过来。 如果占内存大，可以不存字符串，存二进制，两个二进制位表示一个四进制遗传编码
user-0 提问: c语言读取一个bmp文件再把它存取，但打开发现显示不出来，为什么啊？

回复:
user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: BMPread函数和doing函数，打开文件后没close掉

user: user-3
content: fp2=fopen(file2,"ab"); 这个我一般用的都是  fp2=fopen(file2,"wb");

user: user-0
content: 上面是我的代码，就是试着读一个bmp格式的文件，这个文件是16位以上的真彩色图（没有调色板数据），然后读了折后再把它存一遍，但是我再打开存的这个bmp文件之后就发生错误了
user-0 提问: 在windows10平台上，大家都是用什么软件敲代码的呢？

回复:
user: user-1
content: C与C++程序设计学习与实验系统 2013.3

user: user-2
content: visual studio 2015 community

user: user-3
content: 可以用用dev c++。。

user: user-4
content: DEVc++也不错

user: user-5
content: 满足需求就可以了 初入VC6未尝不可

user: user-6
content: 建议VS2015，去MSDN我告诉 你上下载安装镜像安装

user: user-0
content: 我去试试看，多谢

user: user-7
content: vc++ 2010 express 可以试试.(没试过不知道兼不兼容)
user-0 提问: main[-1u]={1}

回复:
user: user-1
content: 定义一个数组，数组名为同main数组长度为-1u，即0xffffffff（一些编译器在不指定数组类型时默认定义为int）。 ={1}表示把数组首元素赋值为1，其余元素不作处理

user: user-2
content: 佳丽你个ZZ

user: user-3
content: http://wozniak.ca/
user-0 提问: 小白一个，新人使用VS2015好多代码都无法运行

回复:
user: user-1
content: 你这个应该是复制粘贴过来的代码吧。 所有划波浪线的都是空格在的地方，你重新打下空格吧

user: user-2
content: 新建工程 把main()函数里面的内容复制到新建工程的主函数下面试试 记得加上面的#include

user: user-3
content: 可能你的空格有问题，删除了重新自己打一下
user-0 提问: 逻辑运算符非

回复:
user: user-1
content: 逻辑只有真假，所以这里你的第一逻辑非会得到0，然后第二个逻辑非得到1。(判断真假的时候，逻辑语句只会识别你给的信息是否非0，而在使用逻辑运算符的时候，如果所给条件非0，那么逻辑非会给出0，如果给出的条件为0，那么逻辑非则给出1) 望采纳！！

user: user-2
content: ! 是做bool运算，非0的数都转换为true，而true值是1

user: user-2
content: 非零数 用 ! 得到 0 0 用 ! 得到 1  不存在什么抵消与不抵消

user: user-3
content: “左结合性”，即运算对象先与左面的运算符结合。” ——《C程序设计》第三版P56

user: user-4
content: 您帖子的标题是逻辑运算符 似乎您对逻辑运算符的认识还不够 ！是指对它右边的表达式取反，还要说明一点，逻辑运算后得到的是bool型量，即1或者0,   1为真，0为假 所以两次取反得到的bool数值应该为1（逻辑运算对非零变量认为是1）

user: user-5
content: 引用 楼主 sb2220 的回复:int i = 2，!!i的值为啥是为1，!不是左结合的吗，两个!!不应该是抵消了吗  !!2 的结果是 true

user: user-6
content: 左结合指的是操作符与操作数的结合，操作符与操作符之间不能结合
user-0 提问: signed 和unsigned定义变量的字节数

回复:
user: user-1
content: C++ 标准草案 n4296:  Table 9 — simple-type-specifiers and the types they specify Specifier(s) Type type-name                    the type named simple-template-id     the type as defined in 14.2 char                       “char” unsigned char   “unsigned char” signed char  “signed char” char16_t “char16_t” char32_t “char32_t” bool “bool” unsigned “unsigned int” unsigned int “unsigned int” signed “int” signed int “int” int “int” unsigned short int “unsigned short int” unsigned short “unsigned short int” unsigned long int “unsigned long int” unsigned long “unsigned long int” unsigned long long int “unsigned long long int” unsigned long long “unsigned long long int” signed long int “long int” signed long “long int” signed long long int “long long int” signed long long “long long int” long long int “long long int” long long “long long int” long int “long int” long “long int” signed short int “short int” signed short “short int” short int “short int” short “short int” wchar_t “wchar_t” float “float” double “double” long double “long double” void “void” auto                            placeholder for a type to be deduced decltype(expression)                    the type as defined below

user: user-2
content: 浮点型变量不区分有符号与无符号

user: user-0
content: 谢谢回复，那关于上面的定义形式有相应的资料可以参考吗？

user: user-2
content: 单独的signed 等价于 signed int 也就是 int  单独的unsigned 等价于 unsigned int

user: user-3
content: 浮点型没有unsigned, 定义在<limits.h>与<float.h>中

user: user-0
content: 多谢各位大神，了解了~
user-0 提问: 程序改switch

回复:
user: user-1
content: 思考问题时脑筋要活一点。 利用C/C++的标准逻辑值为0与1的特性，什么样的if-else结构不能改写成switch-case结构的？  switch(x<1) { case 1: y=x; break; case 0: switch(x<10) { case 0: y=3*x-11; break; case 1: y=2*x-1; } }

user: user-2
content: 你这个没必要改成switch，强行改反而适得其反

user: user-3
content: 具体的值才能使用switch。在c中，范围值还是老老实实的用if吧！

user: user-4
content: VB6的select case可以：Select Case 语句示例 本示例使用 Select Case 语句来判断变量的值。示例中第二个 Case 子句包含了变量值，故只有此区块内的语句会被完成到。  Dim Number Number = 8   ' 设置变量初值。 Select Case Number   ' 判断 Number 的值。 Case 1 To 5   ' Number 的值在 1 到 5 之间，包含1 和 5 。    Debug.Print "Between 1 and 5" ' 下一个 Case 子句是本示例中唯一判断值为 True 的子句。 Case 6, 7, 8   ' Number 的值在 6 到 8 之间。    Debug.Print "Between 6 and 8" Case 9 到 10   ' Number 的值为 9 或 10。 Debug.Print "Greater than 8" Case Else   ' 其他数值。    Debug.Print "Not between 1 and 10" End Select

user: user-5
content: 不可以，switch只能是列举具体的值，不能用范围，所以这里只能用if

user: user-6
content: 这个没有必要改，你都是判断的范围，C++现在的版本switch只能case一个值，而不是范围，其他的语言倒是可以，但是没有什么用

user: user-7
content: 可以： y = (x >= 10) ? 3*x-11 : (x > = 1) ? 2*x-1 : x;

user: user-8
content: 不可以，switch的分支要是具体的值，而不能是逻辑运算。
user-0 提问: 指针的交换问题。而且到printf时候编译都不过。我把指针交换了，那么指针所指向的值会换吗？

回复:
user: user-1
content: 你这个swap不能交换指针。 因为你的实参(main函数里的p1和p2)和你的形参(swap里的p1和p2)是两个不同的指针 它们只是指向了相同的内存区域而已。  你要在swap内改变指针的指向，必须传一级指针的引用或者二级指针才行

user: user-2
content: 你swap交换的只是指针（而且这个指针还是个副本），而不是指针指向的值  调用swap时，不需要再加*，因为你p1 p2本场就是指针类型  swap函数没有返回值，不能直接放在prinf里

user: user-3
content: 楼主定义的swap没有任何用(很明显楼主对指针的认识还不够)，你定义了一个p3，然后让p3指向p1，p1又指向p2(这个时候由于p3指向p1的，所以实际上则是p3指向p1，p1又指向了p2，p3在这里是指向指针的指针)，最后你又写了一句p2指向p3(实际上是没有任何意义的)。楼主的意思其实就是想交换一下两个指针，但是没有意识到指针不能像变变量那样，利用另外一个变量来交换其值。指针表示的是地址，并不是像常变量表示的是一个值，所以在很多程序中不能用常变量的那种思想去考虑。这里有一个更好的方法，可以不变指针，而是改变地址值。这样楼主的这种思路就可以行得通了。而且交换两个变量值可以用更优化的方法(a=a+b,b=a-b,a=a-b(这种方法不需要用到第三个变量))。 望采纳！！！

user: user-4
content: 交换指针，也就互换了指针的指向，所以指针指向的值也就发生了互换，但你的swap函数无法起到交换的作用，因为你交换的只是形参指针的指向，并不会对外部实参的值有更改，正确的做法是在调用swap时传入&a,&b，也就是a，b的地址，你的swap函数的参数是指针类型，你却传入了int类型（对指针用*也就是解引用操作，实际代表的是指针指向的对象），所以编译不通过。 同时，你需要修改swap函数内的代码，不能交换指针，而应该通过解引用操作来交换值，示例如下： int n; n = *p1; *p1 = *p2; *p2=n;

user: user-5
content: ＊号有两个不同的用途，1.定义变量时，代表指针类型。2.运算符，解引用
user-0 提问: 能否做出一个有图形界面的停车场模型？

回复:
user: user-1
content: 除了C还可以用html＋js html很简单，就是一个个标签嵌套组合起来，比如按扭是<button>，输入框是<input> 还有其他控件见http://www.w3school.com.cn/html/html_forms.asp 不用后台语言不需要外面的<form> 获取<input>的中的值用js：document.getElementById("xxx").value, xxx是id， 在<input>中可加id属性。js获取到的类型是字符串，转成数值用Number函数。 响应<button>的点击直接加个属性onclick="xxx()", xxx是js函数名，写在<script>标签中。 如果要画图形，还有<canvas>标签

user: user-2
content: 楼主如果想编写图形程序，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。  下载一个EasyX包，里面有完整的函数手册。EasyX官网有实例。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/

user: user-3
content: 想上手快的话学C#吧

user: user-2
content: 引用 6 楼 JerryWu666 的回复:谢谢您的回答，我看了转的帖子，不是画出图形，是图形界面，带选择的那种  图形用户界面可以学习C++ Builder，入门比较容易。 仅供参考： 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/ 学C++还是C#、Java？ http://blog.163.com/tab_98/blog/static/11924097201511274543737/

user: user-0
content: 引用 3 楼 u010165006 的回复:楼主如果想编写图形程序，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。  下载一个EasyX包，里面有完整的函数手册。EasyX官网有实例。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/谢谢您的回答，我看了转的帖子，不是画出图形，是图形界面，带选择的那种

user: user-3
content: 引用 4 楼 JerryWu666 的回复:引用 2 楼 user-3 的回复:想上手快的话学C#吧c#的话复杂吗？一个月可以做出来吗  可以

user: user-0
content: 引用 2 楼 user-3 的回复:想上手快的话学C#吧c#的话复杂吗？一个月可以做出来吗

user: user-1
content: 可以用ege
user-0 提问: C语言类型定义的问题

回复:
user: user-1
content: 静态数据或全局数据由于存放的位置不同，不能通过自动分配空间的方式来初始化。试想在C语言中，静态和全局数据是在程序的全生命周期都有效的，而程序员分配的空间是可以随时使用free（）收回的，如果你在程序结束前释放这个空间，那这个全局量是不是与系统的规定不一样呢？所以解决的方法是将它们放在程序段中。

user: user-2
content: 1.把执行语句放在函数内 2.Null应该是NULL  #include <stdio.h> #include<stdlib.h>  typedef struct PolyNode *Polynomial;  struct PolyNode{ 	int coef; 	int expon; 	struct PolyNode *Link; };  Polynomial p;    int main(){ 	p = (Polynomial)malloc(sizeof(struct PolyNode)); 	p->Link = NULL; 	if (!p){ 		printf("%s", "hahah"); 	} 	else{ 		printf("%s", "heheh"); 	} }

user: user-3
content: Polynomial p;  p = (Polynomial)malloc(sizeof(struct PolyNode));  p->Link = Null;  这几句放到 main 函数里，你写在全局区什么意思呢

user: user-4
content: 还有p的声明。。。。

user: user-4
content: 你的p分配空间语句和p->link语句位置不对，你要在主函数中使用，则必须写在主函数中。

user: user-5
content: p = (Polynomial)malloc(sizeof(struct PolyNode));   p->Link = Null; 这两句只能写函数里面

user: user-6
content: typedef struct PolyNode *Polynomial; 这句放在结构体定义之后试试

user: user-7
content: 改成这样试试   #include <stdio.h>   typedef struct PolyNode *Polynomial;   struct PolyNode{     int coef;     int expon;     struct PolyNode *Link; };    int main(){  Polynomial p;   p = (Polynomial)malloc(sizeof(struct PolyNode));   p->Link = Null;     if(!p){         printf("%s","hahah");     }else{         printf("%s","heheh");     } }
user-0 提问: 数据结构，链队初始化的问题。代码如下图片是结果和预期结果不一样

回复:
user: user-1
content: #include <stdio.h> #include <malloc.h>  #define TRUE 1 #define FALSE 0 typedef struct Node{ 	int data;//数据域  	struct Node *next;//指针域  }LinkQueueNode;  typedef struct { 	LinkQueueNode *front; 	LinkQueueNode *rear; }LinkQueue;  LinkQueue* InitQueue() { 	LinkQueue *Q = (LinkQueue *)malloc(sizeof(LinkQueue));  	Q->front = (LinkQueueNode*)malloc(sizeof(LinkQueueNode)); 	Q->rear = Q->front; 	Q->front->next = NULL; 	return Q; } int EnterQueue(LinkQueue *Q, int x) { 	/* 将数据元素x插入到队列Q中 */ 	LinkQueueNode  *NewNode; 	NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode)); 	if (NewNode != NULL) 	{ 		NewNode->data = x; 		NewNode->next = NULL; 		Q->rear->next = NewNode; 		Q->rear = NewNode; 		return (TRUE); 	} 	else  return (FALSE);    /* 溢出！*/ }  int DeleteQueue(LinkQueue *Q, int *x) { 	/* 将队列Q的队头元素出队，并存放到x所指的存储空间中 */ 	LinkQueueNode *p; 	if (Q->front == Q->rear) 		return(FALSE); 	p = Q->front->next; 	Q->front->next = p->next;  /* 队头元素p出队 */ 	if (Q->rear == p)  /* 如果队中只有一个元素p，则p出队后成为空队 */ 		Q->rear = Q->front; 	*x = p->data; 	free(p);   /* 释放存储空间 */ 	return(TRUE); } int main(){ 	int a, e; 	LinkQueue *A = InitQueue(); 	LinkQueue *B = InitQueue();  	EnterQueue(A, 1); 	EnterQueue(A, 2);  	DeleteQueue(A, &e); 	printf("%d ", e);  	EnterQueue(B, 3); 	EnterQueue(B, 4);   	DeleteQueue(B, &a); 	printf("%d ", a);  	return 0; }  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 你LinkQueue* InitQueue() 函数中的Q，没有初始化就使用了，你先要为Q本身指向的对象分配内存，再去Q->front
user-0 提问: C语言入门级小白求帮助，。

回复:
user: user-1
content: 问题已经解决了，谢谢各位大佬。  那个号一直显示密码错误登不上去，没法结贴了

user: user-2
content: 推荐使用dev-C++

user: user-3
content: 可以试试VS http://blog.csdn.net/cometnet/article/details/19551125

user: user-4
content: 初级的话，Dev-C++吧，编译出错时的错误提示基本上都是英语的，一些常见英语还是得记记

user: user-5
content: printf中的内容改成用双引号，而不是单引号  第二个prinf右括号没有

user: user-6
content: C与C++程序设计学习与实验系统 2013.3 比较方便，不用建项目。

user: user-7
content: 首先程序中有些错误  在windows中可以用vs2012等系列的或DEV C++     等等..........

user: user-0
content: 还有，大佬们帮我推荐个编译器呗，适合我这种英语不好的小白的。
user-0 提问: C语言二维数组，谢谢

回复:
user: user-1
content: http://www.cnblogs.com/lxshanye/archive/2013/06/06/3121712.html

user: user-2
content: 先算出各个点之间的距离，然后在一个一个打印出来。要达到上面的效果，你仔细看看printf格式化输出说明。
user-0 提问: 错误：‘sa’的存储大小未知

回复:
user: user-0
content: 被百度害了，复制进去的少个c，但是正确的多了个c但仍然是全匹配，没看清。。。结了

user: user-0
content: 晕了，谢谢！

user: user-1
content: 你是大错了 sigation--->sigaction

user: user-1
content: 添加头文件试试 #include <signal.h>
user-0 提问: C语言

回复:
user: user-0
content: 那有没有 相关的视屏啊？、

user: user-1
content: 各数据类型范围：http://blog.csdn.net/abaloon/article/details/8173552 如果要表示大数的阶乘结果，应该用数组来保存， 参考：http://blog.csdn.net/wangqiuyun/article/details/7948052

user: user-0
content: 谢谢

user: user-2
content: 如楼上所述，与你运算获取结果的数据类型有关

user: user-3
content: 32位下 int型数据范围是 负的2的31次方到正的2的31次方减一。也就是-2147483648~2147483647，超出了就溢出了 无符号int是从0~2的32次方（4294967296）

user: user-0
content: 我这个输出的 怎么看 有无符号

user: user-4
content: 有符号数2的31次方，21亿 无符号数2的32次方，42亿
user-0 提问: 小白求问，关于指针的一简单问题，求大神解答，谢谢

回复:
user: user-1
content: 这个程序在cl()中的foe中逻辑是有错误的。 比如如果输入的数组是: a[10]={4,5,3,1,2,3,4,8,10,11} 当i=0时得 *q=5 当i=3时得 *q=2 把for循环中的改成 if(*(p2 + i) >= *(p2 + i +1)) { temp=*(p2+1+i); *(p2+1+i) = *(p2+i); *(p2+i) = temp; } *(p2+1+i) 中存放的为最大的值

user: user-2
content: 要在函数内修改指针的指向，必须传一级指针的引用或者二级指针才行。 因为形参和实参并不是同一个指针，他们只是指向了相同的内存区域而已

user: user-3
content: p =xxx,并不能改变p指向的东西的值，只是改变了p的指向，要改变指针指向的对象的值，需要使用 *p = xxx。*号是指针的解引用操作

user: user-4
content: 你cl函数中t=p2+i+1 与 q=p2+i+1 改变的只是这两个指针的指向，而没有改变他们所指向的内存中的数据  你要修改数组中的数据，应该用 *t = ....
user-0 提问: c语言求两点距离问题 求解决

回复:
user: user-1
content: 你这个代码能过编译？ c都没有定义过

user: user-2
content: 因为你就没有定义c 这个变量  这样改：  #include<stdio.h> #include<math.h> double distance(double x1,double y1,double x2,double y2); int main() {  	double x1,y1,x2,y2,c; 	scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 	c = distance(x1,y1,x2,y2); 	printf("%lf",c); 	return 0; } double distance(double x1,double y1,double x2,double y2) { 	double c,X,Y; 	X=pow((x1-x2),2); 	Y=pow((y1-y2),2); 	c=sqrt(X+Y); 	return c; }

user: user-3
content: 楼主你的别亦不过吧，没有存储返回值啊  #include<stdio.h> #include<math.h> double distance(double x1,double y1,double x2,double y2); int main() {   double c; double x1,y1,x2,y2; scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); c=distance(x1,y1,x2,y2); printf("%lf",c); return 0; } double distance(double x1,double y1,double x2,double y2) { double c,X,Y; X=pow((x1-x2),2); Y=pow((y1-y2),2); c=sqrt(X+Y); return c; }

user: user-4
content: c的作用域问题。你这里只在函数distance中声明了c。所以它的有效作用域仅限于函数内。如果想让它在主函数中也能用，有两种方法，第一是，直接把distance作为参数替代c，第二种就是在函数的中声明c时前面加上extern。

user: user-5
content: 楼上好像是正解！

user: user-6
content: #include<stdio.h> #include<math.h> double distance(double x1,double y1,double x2,double y2); int main() {   double c; 	double x1,y1,x2,y2; 	scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 	c=distance(x1,y1,x2,y2); 	printf("%lf",c); 	return 0; } double distance(double x1,double y1,double x2,double y2) { 	double c,X,Y; 	X=pow((x1-x2),2); 	Y=pow((y1-y2),2); 	c=sqrt(X+Y); 	return c; }
user-0 提问: C语言数组元素重新赋值问题

回复:
user: user-1
content: 没有问题的说

user: user-2
content: 引用 3 楼 paschen 的回复:a[0]=2,a[1]=3 没问题， 中间最好用 分号 可以不用分号的

user: user-3
content: 看你是静态数组还是动态的，动态数组未初始化有可能写到保护内存上去

user: user-4
content: 只要你没有在赋值之前去使用数组里的未初始化过的值就没关系

user: user-5
content: 你的代码没有任何问题，这样赋值就可以

user: user-6
content: a[0]=2,a[1]=3 没问题， 中间最好用 分号

user: user-7
content: 引用我想重新给它赋值，没有初始化数组 int a[2] = {1, 2}; a数组已经赋值过了，重新赋值为什么还要初始化？直接赋值就好了。

user: user-8
content: 为什么有问题呢？就是这样啊
user-0 提问: c语言关于while循坏

回复:
user: user-1
content: 因为在不满足if (year%4==0&&year%100!=0) 也不满足else if (year%400==0)时你程序仍然会执行printf进行输出，且这时a的值为上一次改变之后a的值  你呆以这样改：   #include<stdio.h> int main() { 	int a; 	int year=0; 	while(year<1000) 	{ 		if (year%4==0&&year%100!=0) 		{ 			a=year; 			printf("%d\n",a); 		} 		else if (year%400==0) 		{ 			a=year; 		} 		 		year++;  	} 	return 0; }

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

user: user-3
content: #include<stdio.h> int main() { 	int a; 	int year=0;     while(year<1000) 	{ 		if (year%4==0&&year%100!=0) 		{	a=year; 			printf("%d\n",a); 		}          else	if (year%400==0) 				{	a=year;   					printf("%d\n",a);  				}  		year++; 	} 	return 0; }   你试试这个。。

user: user-3
content: 这个问题很明显啊，就算你循环的year不是闰年，但是你的printf还是得执行，所以你每个闰年都会输出多次，正确的方法是，把printf写在条件语句中。  望采纳！！！

user: user-4
content: 每次循环都打印了a，可每次循环不见得都是闰年
user-0 提问: C语言指针的问题

回复:
user: user-1
content: printf("%p\n",&Pdata[1]);  这句中的Pdata[1] 实际是 等价于 &List[2] 面不是 &List[1]  因为Pdata已经加了1，Pdata 并不等于 List

user: user-2
content: Pdata++;执行操作以后，实际上的指向后移了一位，也就是Pdata[n]  等价于 List[n+1] 这种情况需要注意索引不要越界

user: user-3
content: 你对Pdata都++了，Pdata指向肯定得变化呗 楼主需要多理解指针的基本概念 http://wenku.baidu.com/link?url=xdtU97yoJxxgPoMXR3L8NUbKRVJ6ObyhNHXWqS81HzbWtGIwcNO9EDdFEk4r2b_-wbduM0m5mtZFTrYLjIYQa-u03bOrUsNNHO1OtoeYJT3

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:就该这么输出，确认无误！ 这个不对的，因为我一开始弄错了因为Pdata++之后Pdata的地址就自增了一位了，所以Pdata[1]这时候等于Pdata[2]了

user: user-4
content: Pdata++执行后就已经指向了List[1]，此时的Pdata[0]就是List[1]，而你输出的是Pdata[1]的地址也就是List[2]的地址

user: user-5
content: 根据Pdata++得到的结果为    Pdata = &List[1];  （1） 而&Pdata[1]相当于&(Pdata+1)，即（1）式中有像前前进一位这时，&(Pdata+1)  = &List[1+1]

user: user-6
content: 引用 3 楼 hqmKnowNothing的回复:Pdata++后自身加一所以地址跟那个数组[1]的地址一样，这时候的Pdata[1]是当前Pdata地址再加1，所以队形的是数组[2] 对应，错字……我的天一定要10个字猜能回复吗

user: user-6
content: Pdata++后自身加一所以地址跟那个数组[1]的地址一样，这时候的Pdata[1]是当前Pdata地址再加1，所以队形的是数组[2]

user: user-7
content: 因为加了一位 现在p的第一位是l的第二位，所以p和l1相同，所以p的第二位应该和l的第3位相同

user: user-8
content: 就该这么输出，确认无误！
user-0 提问: 杭电acm第二题

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

user: user-0
content: 改了N就原来是个小错误，粗心要改正！！

user: user-0
content: 多谢5楼大神！！！！！

user: user-2
content: if(length2-1 == 0) {      *p2 == '0'; }  这里的*p2 == '0';  改成 *p2 = '0';

user: user-3
content: 引用 3 楼 qq_35802692 的回复:直接就是wrong answer。。。  就是你的算法没能完全通过它的测试用例呗。

user: user-0
content: 直接就是wrong answer。。。

user: user-4
content: 报啥错？ =========

user: user-0
content: 为什么dev c++编译成功，提交一直报错
user-0 提问: C语言结构体初始化问题

回复:
user: user-0
content: 3楼写的很全，非常感谢

user: user-1
content: 要在函数中改变指针的指向必须传二级指针或者一级指针的引用才行 改成这样：  void init_M(Maxtrix **a, int lenR, int lenV){ //初始化矩阵所有的元素为0 ，初始化列和行数量  	int i; 	*a = (Maxtrix *)malloc(sizeof(Maxtrix)); 	if (!a) exit(OVERFLOW); 	a->VectorLen = lenV; 	a->RowLen = lenR; 	a->data2 = malloc(sizeof(Vector)*a->RowLen); 	for (i = 0; i<a->RowLen; i++){ 		a->data2[i].data1 = malloc(sizeof(int)*lenV); 		if (!a->data2[i].data1) 		{ 			exit(OVERFLOW); 		} 		a->data2[i].lenth0 = lenV; 	}  }

user: user-2
content: main函数中的代码放到int main()函数中

user: user-3
content: void init_M(Maxtrix *a, int lenR, int lenV)； 是不是应该这样？ void init_M(Maxtrix **a, int lenR, int lenV)；
user-0 提问: 这个求最小公倍数和最大公因数的代码哪里有问题？怎么验证比较小的数可以但是大数就不行

回复:
user: user-1
content: int  GCD(int x,int y){ 	if (x<y) return GCD(y,x);  	else if (y==0) return x;  	else return GCD(y,x%y);  }

user: user-0
content: 是什么导致大数计算出错？
user-0 提问: 小白求助，关于指针在函数调用的简单问题，求大神相助，谢谢

回复:
user: user-1
content: for(*i=0;*i<N;*i++)  你这里的 *i++ 是让指针本身+1，然后再解引指针  你应该写成 (*i)++;  建议不要写这种的代码，循环变量直接就用整数就行

user: user-2
content: 更正一下 for(*i=0;*i<N;(*i)++)…

user: user-2
content: 1. 应该弄清楚指针变量(p)、指针指向的变量(x)及间接引用(*)的关系，int x; int *p=&x;*p=1;//通过*p引用x，等价于x=1；你的cl()函数里面, if(p2>p2+1), 这里面比较的是地址，而不是引用该地址里面的内容，应改为int t; … if(*p2>*(p2+1)) t=*(p2+1); ... 2. for循环里面不需要用指针*i,，没意义，实在要用应改为for(*i=0;*i<N-1;(*i)++)…

user: user-3
content: 它只是让你参数用指针，传递下数组首地址就行了。 你这样在程序里强行用指针一点意义都没有，比如那个for循环，可读性极差

user: user-4
content: void sr(int *p1) { m=p1;//p1赋给了m for(*i=0;*i<N;*i++) scanf("%d",p1++);//p1++，一共是N个地址，但是这N个地址是离散的，没有像数组或者链表一样有链接 cl(m); 这个程序如果你一定要用指针，那最好先建立链表，但是我建议用数组

user: user-5
content: 用手机看的(可能有的没看出来，只是简单的看了下)。。看出了这么几个问题:1.int *t=0,*q=0，指针只能指向地址，无法进行赋值。2.scanf里面的p1,p2,p3都是指针，不能这样作为参数进行输入。3.你的程序中，m=p2(指向指针的指针)，然后你又p2=m，不懂你这个表示的意思。  建议楼主在写程序的时候不要刻意去使用指针，能简化就尽量简化。  望采纳！！！

user: user-6
content: 处理用排序了 #include<stdio.h> #define N 5  void sr(int *); void cl(int *); void sc(int *); int main() { 	int a[N]; 	int *p=a;    //参数传a也行 	sr(p); 	cl(p); 	sc(p); 	return 0; } void sr(int *p) { 	printf("请输入十个整数：\n\n"); 	for(int i=0;i<N;i++) 	scanf("%d",p++); } void cl(int *p)     { 	int temp=0; 	for(int i=0;i<N-1;i++)  		for(int j=i+1;j<N;j++)  		if(p[i]>p[j]) {  			temp=p[i];  			p[i]=p[j];  			p[j]=temp; 		}  		/*if(*(p+i)>*(p+j)) {      			temp=*(p+i);  			*(p+i)=*(p+j);  			*(p+j)=temp;  		}*/  } void sc(int *p) { 	printf("调整后：\n"); 	for(int i=0;i<N;i++) 	printf("%-3d",*p++); }
user-0 提问: 矩阵乘的性能问题

回复:
user: user-1
content: 大循环在内小循环在外效率高于小循环在内大循环在外 。 去看C++汇编解密

user: user-2
content: gemm_nt中计算了M*N*K次ALPHA*A[i*lda+k]

user: user-2
content: 两者并不等价， gemm_nn中计算了M*K次A_PART = ALPHA*A[i*lda+k]; gemm_n中计算了M*N*K次ALPHA*A[i*lda+k]

user: user-3
content: 这涉及到 cpu cache 优化
user-0 提问: 经过调试，问题出在GetTop和Pop两个函数的*e = *(S.top - 1)与*e = *(--S->top)上，但我感觉这两个语句没有问题啊，真心求教！

回复:
user: user-1
content: 你既然想通过你的ElemType *e带出top的值，那么就不应该初始化成NULL，必须分配空间才行 ElemType *e = NULL;改成ElemType *e = (ElemType *)malloc(sizeof(ElemType));

user: user-0
content: 引用 1 楼 user-2的回复:解引了空指针，很明显e是NULL 定义这I指针时不是应该初始化吗？如果是这样，请问应该怎么改呢？

user: user-2
content: 引用 2 楼 w237028417 的回复:[quote=引用 1 楼 user-2的回复:]解引了空指针，很明显e是NULL 定义这I指针时不是应该初始化吗？如果是这样，请问应该怎么改呢？[/quote]  为指针分配内存空间，定义时赋值NULL就是为了防止无意使用了未分配空间的指针

user: user-0
content: 引用 3 楼 小灸舞的回复:你既然想通过你的ElemType *e带出top的值，那么就不应该初始化成NULL，必须分配空间才行 ElemType *e = NULL;改成ElemType *e = (ElemType *)malloc(sizeof(ElemType)); 哦哦，明白了，感谢！

user: user-2
content: 解引了空指针，很明显e是NULL
user-0 提问: 关于无头链表的创建问题，函数传参用二级指针。

回复:
user: user-1
content: 十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-2
content: void createNode(NODE **phead, int data) {         NODE *tmp = initNode(tmp, data);           while(*phead) {              phead = &(*phead)->next;          }          *phead = tmp; } 整个程序应该可以写成这样。 关于二级指针，可以看看这个http://coolshell.cn/articles/8990.html#more-8990，顺便说下，那个博主很牛。。。

user: user-2
content: 引用 2 楼 men_wen 的回复:[quote=引用 1 楼 eastfriendwu 的回复:] (*ptmp) = (*ptmp)->next; 改为 ptmp = &(*ptmp)->next; 这样改正后确实是成功打印出来了，但是能不能麻烦您解释一下(*ptmp) = (*ptmp)->next;错误的原因。谢谢您！[/quote] ptmp一开始变指向main中phead链表头的地址， (*ptmp) = (*ptmp)->next，就是把下一个节点覆盖了main中phead的地址，相当于删掉第一个节点（泄漏掉）， 注意，在整个过程中，ptmp的值一直没变哦。 链表有两个节点时，才进入while，进入后又把第一个节点给删掉了，然后退出循环，连接起新加的节点，所以就一直是两个节点。

user: user-0
content: 引用 3 楼 user-3 的回复:[quote=引用 2 楼 men_wen 的回复:] [quote=引用 1 楼 eastfriendwu 的回复:] (*ptmp) = (*ptmp)->next; 改为 ptmp = &(*ptmp)->next; 这样改正后确实是成功打印出来了，但是能不能麻烦您解释一下(*ptmp) = (*ptmp)->next;错误的原因。谢谢您！[/quote]  前者是 为指针指向的那个值进行赋值  后者是为指针本身赋值[/quote] ooo懂了！多谢哈！！！！

user: user-3
content: 引用 2 楼 men_wen 的回复:[quote=引用 1 楼 eastfriendwu 的回复:] (*ptmp) = (*ptmp)->next; 改为 ptmp = &(*ptmp)->next; 这样改正后确实是成功打印出来了，但是能不能麻烦您解释一下(*ptmp) = (*ptmp)->next;错误的原因。谢谢您！[/quote]  前者是 为指针指向的那个值进行赋值  后者是为指针本身赋值

user: user-0
content: 引用 1 楼 eastfriendwu 的回复:(*ptmp) = (*ptmp)->next; 改为 ptmp = &(*ptmp)->next; 这样改正后确实是成功打印出来了，但是能不能麻烦您解释一下(*ptmp) = (*ptmp)->next;错误的原因。谢谢您！

user: user-2
content: (*ptmp) = (*ptmp)->next; 改为 ptmp = &(*ptmp)->next;
user-0 提问: 求教一个问题

回复:
user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-2
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-3
content: teacher是指针类型，sizeof(teacher) 大小只是4，而不是你分配的内存空间的大小

user: user-4
content: 乱码问题请用二进制查看器一个个字节看吧
user-0 提问: 两个数组拼接的一点问题

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:unsigned char buf[16]; memcpy(buf ,buf1 ,8); memcpy(buf+8,buf2,8); 这不是字符串，不要用strcat  多谢指导，这个方法可行！多谢！

user: user-0
content: 引用 2 楼 paschen 的回复:那就使用memcpy并指定拷贝的长度  http://en.cppreference.com/w/c/string/byte/memcpy  多谢指导！这个方法非常可行!

user: user-1
content: unsigned char buf1[8] = { 0x01, 0x04, 0x00, 0x10, 0x00, 0x0C, 0xF1, 0xCA }; 	unsigned char buf2[8] = { 0x02, 0x04, 0x00, 0x10, 0x00, 0x0C, 0xF1, 0xF9 }; 	unsigned char buf[16] {0}; 	memcpy_s(buf, 16, buf1, 8); 	memcpy_s(buf+8, 16, buf2, 8);

user: user-2
content: 那就使用memcpy并指定拷贝的长度  http://en.cppreference.com/w/c/string/byte/memcpy

user: user-3
content: unsigned char buf[16]; memcpy(buf ,buf1 ,8); memcpy(buf+8,buf2,8); 这不是字符串，不要用strcat
user-0 提问: 问个简单的C语言问题

回复:
user: user-1
content: 引用 2 楼 qq_36496856 的回复:[quote=引用 1 楼 user-1的回复:]这句话的意思是，二元操作符左右两个操作数的计算顺序是不确定的， 比如(++a) * a; 可能先算左边，则结果为(a+1) * (a +1)，如果先算右边，则结果是(a+1) * a.  exception指的是逻辑与&&，逻辑或|| 运算符 一楼之前讲的对，谢谢了。然而例子确实错的,++的优先级要比+高很多，所以编译器肯定会先算++，就是说会是两个a+1[/quote] 你多试几个编译器

user: user-0
content: 引用 1 楼 user-1的回复:这句话的意思是，二元操作符左右两个操作数的计算顺序是不确定的， 比如(++a) * a; 可能先算左边，则结果为(a+1) * (a +1)，如果先算右边，则结果是(a+1) * a.  exception指的是逻辑与&&，逻辑或|| 运算符 一楼之前讲的对，谢谢了。然而例子确实错的,++的优先级要比+高很多，所以编译器肯定会先算++，就是说会是两个a+1

user: user-1
content: 引用 4 楼 qq_36496856 的回复:可以看到无论++a在哪边，结果都是一样的。（第二个例子中用b） 嗯，我的例子确实错了，只有在一个表达式中对一个变量改变超过或等于两次才可能是未定义行为

user: user-0
content: #include<stdio.h>  int main(){    int a = 1, b = 1;     printf( "%d\n",  ++a  * a); 	printf( "%d\n", b *  ++ b );  	return 0; }不知道为什么在手机上图片上传不了，就上传代码把

user: user-0
content: 可以看到无论++a在哪边，结果都是一样的。（第二个例子中用b）

user: user-1
content: 这句话的意思是，二元操作符左右两个操作数的计算顺序是不确定的， 比如(++a) * a; 可能先算左边，则结果为(a+1) * (a +1)，如果先算右边，则结果是(a+1) * a.  exception指的是逻辑与&&，逻辑或|| 运算符
user-0 提问: 新人求解：一个简单程序的问题

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

user: user-2
content: 建议VS，界面相对来说比较美观，用着很舒服，只是比较大。。

user: user-3
content: 引用 3 楼 Maokaitou 的回复://float  weighht; float  weight;拼写错误 +1

user: user-4
content: 初期的话用dev就可以了，操作界面很简洁，很舒服，而且基本可以满足需求，vs的话编译器比dev要好一点，功能也更强大一点，但对电脑资源占用比较多，后期的话再考虑也是可以的。

user: user-5
content: float  weighht;  改成  float  weight;  如果在WINDOS下，可以用VS2010，不过不支持C99标准

user: user-6
content: scanf使用也是有限制的

user: user-7
content: Visual Studio Community

user: user-8
content: 新手推荐dev c++(大神可以忽略)，vc++6.0标准是c89的，可能会造成一些不必要的麻烦，当然vs应该是个更好的选择(编译器比较大，如果只是练习，不是很推荐，里面有很多功能你可能完全用不到)

user: user-9
content: //float  weighht; float  weight;拼写错误

user: user-10
content: 最好用VS，不要用VC6，VC6太老了 VS各版本下载地址：http://blog.csdn.net/cometnet/article/details/19551125 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-11
content: float weight; 写错了
user-0 提问: [理论探讨] 你对C做过扩展吗？

回复:
user: user-0
content: 引用 6 楼 u010165006 的回复:与其扩展C，不如把C++（高配）当C用（或者加上类）。  尝试过。所以才考虑回来扩展C。

user: user-1
content: 与其扩展C，不如把C++（高配）当C用（或者加上类）。

user: user-0
content: 引用 3 楼 user-2 的回复:扩展的功能包括：  https://msdn.microsoft.com/zh-cn/library/34h23df8(v=vs.110).aspx  项目规模和复杂度提高时，希望在模块独立性、代码简洁性之间有个平衡的东西。

user: user-0
content: 引用 1 楼 u010165006 的回复:目标是什么，接近C++（带类的C）+ STL？  大概是这个方向。还没到STL。

user: user-2
content: 扩展的功能包括：  https://msdn.microsoft.com/zh-cn/library/34h23df8(v=vs.110).aspx

user: user-2
content: 各大编译器都会在语法上进行一些扩展，如VS可以通过/Za来决定是否禁用微软的语言扩展功能：  https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=ZH-CN&k=k(VC.Project.VCCLCompilerTool.DisableLanguageExtensions)&rd=true

user: user-1
content: 目标是什么，接近C++（带类的C）+ STL？
user-0 提问: 关于多项式合并函数的一些问题，就是在polyadd函数里感觉有问题，最后显示不出来

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

user: user-2
content: 那就在polyadd中下断点，然后单步跟踪程序运行，观察程序变化情况分析原因

user: user-0
content: 在显示的时候每次都把a链中的东西删除一次，直到删除完
user-0 提问: 这是大小端的问题吗

回复:
user: user-1
content: 你可以参考一下这里   http://bbs.csdn.net/topics/380256750

user: user-2
content: 郁闷， P和q的地址变了； 大小端指的是不同CPU的设备环境，最起码是两台CPU才能是大小端问题；

user: user-3
content: 不是大端小端  是你算法有问题  123  与  321  你在返回的时候都指向2这个字符   所以相减是0

user: user-1
content: 这里的问题主要是你程序写的不对。 int my_strcmp(char *p, char *q) {    while(*p++ == *q++)    /*判断以后会自增，这个时候p,q都指向第二个字符了*/     {      printf("-------\n");     if(*q == '\0')       {          return 0;       }     }    printf("%d-----\n", *p - *q);        /*由于是指向了第二个字符，所以如果你输入的第二个字符是一样的，那么这里的值就是0了，这也是为什么你后面会显示相等的原因*/   return (*p - *q); }  希采纳！~！~！~！
user-0 提问: 小白求助，关于在不同编译器中使用数组的一个简单问题，求大神解答，谢谢

回复:
user: user-1
content: vc++6.0是c89。。建议楼主用c99标准的编译器。。这样可以避免很多小问题。。

user: user-2
content: C99标准支持可变长数组，不过VC不支持C99标准，所以不能用

user: user-0
content: 引用 2 楼 qq_36409192 的回复:vc++6.0是c89。。建议楼主用c99标准的编译器。。这样可以避免很多小问题。。  谢谢

user: user-0
content: 引用 1 楼 user-2 的回复:C99标准支持可变长数组，不过VC不支持C99标准，所以不能用  谢谢
user-0 提问: #define LEN 10  scanf("%LENs",a) 想达到这样scanf怎么破？

回复:
user: user-1
content: %s输入的是一串不能确定长度的字符串，当遇到空格。回车。tab键的时候，它会自动停止输入。所以你这里才会无效。方便点，你还是用scanf_s吧！

user: user-2
content: printf 的话可以写成：printf("%.*s",LEN, a);  scanf不能确定长度

user: user-3
content: 引用 8 楼 u010165006 的回复:#define STRLEN(X) #X 为什么x前面要用#号呢？为什么最后展开成 "10"会带引号？ 直接scanf("%" #LEN "s",a); 为什么不可以？ 还有三句#define的顺序有关系吗？ 这个#是宏的一个特殊用法 不清楚 百度 C语言宏 # https://www.baidu.com/s?ie=UTF-8&wd=C%E8%AF%AD%E8%A8%80%E5%AE%8F+%23 #LEN什么都不是  #得用在宏里面才有特殊效果 顺序无关

user: user-0
content: 引用 6 楼 user-3 的回复:[quote=引用 5 楼 u010165006 的回复:] [quote=引用 4 楼 user-3 的回复:] #define LEN 10   #define STRLEN(X) #X #define _LEN(X) STRLEN(X) 	char a[LEN+1]; 	scanf("%" _LEN(LEN) "s",a); 	puts(a);   确实可以，不过为什么要这么定义呢？ 直接#define _LEN(X) #x 为什么不行？或者直接写一句scanf？[/quote] 直接#define _LEN(X) #x  那么 _LEN(LEN) 展开是 "LEN" #define STRLEN(X) #X #define _LEN(X) STRLEN(X) 展开_LEN(LEN) 就变成 STRLEN(10) 最后是 "10"[/quote]  #define STRLEN(X) #X 为什么x前面要用#号呢？为什么最后展开成 "10"会带引号？ 直接scanf("%" #LEN "s",a); 为什么不可以？ 还有三句#define的顺序有关系吗？

user: user-3
content: 引用 5 楼 u010165006 的回复:[quote=引用 4 楼 user-3 的回复:] #define LEN 10   #define STRLEN(X) #X #define _LEN(X) STRLEN(X) 	char a[LEN+1]; 	scanf("%" _LEN(LEN) "s",a); 	puts(a);   确实可以，不过为什么要这么定义呢？ 直接#define _LEN(X) #x 为什么不行？或者直接写一句scanf？[/quote] 直接一句 scanf("%LENs",a);  字符串内部的字符就只是字符而已 不是宏 不会进行展开 你这样写是 "%L" 而格式控制符里面 并没有%L的解析

user: user-3
content: 引用 5 楼 u010165006 的回复:[quote=引用 4 楼 user-3 的回复:] #define LEN 10   #define STRLEN(X) #X #define _LEN(X) STRLEN(X) 	char a[LEN+1]; 	scanf("%" _LEN(LEN) "s",a); 	puts(a);   确实可以，不过为什么要这么定义呢？ 直接#define _LEN(X) #x 为什么不行？或者直接写一句scanf？[/quote] 直接#define _LEN(X) #x  那么 _LEN(LEN) 展开是 "LEN" #define STRLEN(X) #X #define _LEN(X) STRLEN(X) 展开_LEN(LEN) 就变成 STRLEN(10) 最后是 "10"

user: user-0
content: 引用 4 楼 user-3 的回复:#define LEN 10   #define STRLEN(X) #X #define _LEN(X) STRLEN(X) 	char a[LEN+1]; 	scanf("%" _LEN(LEN) "s",a); 	puts(a);   确实可以，不过为什么要这么定义呢？ 直接#define _LEN(X) #x 为什么不行？或者直接写一句scanf？

user: user-3
content: #define LEN 10   #define STRLEN(X) #X #define _LEN(X) STRLEN(X) 	char a[LEN+1]; 	scanf("%" _LEN(LEN) "s",a); 	puts(a);

user: user-0
content: char a[LEN+1];
user-0 提问: 数据结构定长顺序存储表示串的定位（index）操作

回复:
user: user-1
content: if( i=0)  改成  if( i==0)  if(S[i]=T[j]){  改成  if(S[i]==T[j]){   Index函数与StrAssign函数不是所有情况都会有返回值

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

user: user-3
content: 我改了一下（改了三个地方，不一定正确），你试试 int Index(SString S, SString T, int pos) {     int j=1;     int i=pos;      while(i<=S[0] && j<=T[0]){         if(S[i] == T[j]){             i++;             j++;         }else{             i = ++pos;             j=1;         }     }      if(j>T[0])         return pos;      else          return 0; }
user-0 提问: 望大神告诉扑克牌问题的思路

回复:
user: user-1
content: 小时候玩过这个，倒背如流。

user: user-0
content: 已采纳，谢谢啦

user: user-1
content: 完整的版本在这里，可以输入N的大小，用C的动态分配数组： http://blog.163.com/tab_98/blog/static/11924097201692314754324/

user: user-1
content: 引用 1 楼 u010165006 的回复:小时候玩过这个，倒背如流。  不过忘了是13张还是52张。  // Poker.cpp : Defines the entry point for the console application. //  #include "stdafx.h" #include <iostream> using namespace std;  struct Node { 	int no; 	int value; 	bool hasValue; };  int _tmain(int argc, _TCHAR* argv[]) { 	Node poker[53];  	for(int i=1;i<=52;i++) 	{ 		poker[i].no=i; 		poker[i].hasValue=false; 	}  	for(int i=0,value=1,count=0;count<52;) 	{ 		for(int j=0;j<2;j++) 		{ 			do 			{ 				i++;   				if(i>52) 					i=1; 			}while(poker[i].hasValue); 		} 		poker[i].value=value++; 		poker[i].hasValue=true; 		count++; 	}  	for(int i=1;i<=52;i++) 		cout<<poker[i].value<<"  "; 	cout<<endl;  	return 0; }    运行结果： 46  1  27  2  40  3  28  4  51  5  29  6  41  7  30  8  47  9  31  10  42  11  32  12  50  13  33  14  43  15  34  16  48  17  35  18  44  19  36  20  52  21  37  22  45  23  38  24  49  25  39  26
user-0 提问: 求助，用c语言写的数据结构作业

回复:
user: user-0
content: 谢谢楼上和楼上上，换了个思路最后还是写出来了

user: user-1
content: if(op->next=NULL)  改成  if(op->next==NULL)

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

回复:
user: user-1
content: 引用 3 楼 cqs20141005225115 的回复:[quote=引用 2 楼 paschen 的回复:] *(p2 + i), 本来就等于 p2[i]，含义是一样的  你的p是指向数组的指针，解引后得到的是数组，数组会退化为指针（你例子中为int*指针），即*(p2 + i)输出退化为int*指针，而p2 + i 为数组的地址，这两个的值是相等的，但指针的类型是不同的  谢谢大神，终于理解了，不过我还有个问题，ruguo 我没给p2赋值，p2会是0，就是上面所有输出结果减1，代码是放在main里面的，地址为什么会自动初始化为0呢[/quote]  全局变量或静态变量会初始化为0，局部变量是之前栈上的随机值

user: user-2
content: *(p+i),p[i]和p+i都是指向二维数组每行的首列地址，区别在于，*(p+i)和p[i]指向的是那一行第一个元素的地址，p+i指向的是那一行那一列的首地址。但他们的值都是一样的。

user: user-3
content: 引用 6 楼 cqs20141005225115 的回复:[quote=引用 5 楼 fefe82 的回复:] [quote=引用 3 楼 cqs20141005225115 的回复:] [quote=引用 2 楼 paschen 的回复:] *(p2 + i), 本来就等于 p2[i]，含义是一样的  你的p是指向数组的指针，解引后得到的是数组，数组会退化为指针（你例子中为int*指针），即*(p2 + i)输出退化为int*指针，而p2 + i 为数组的地址，这两个的值是相等的，但指针的类型是不同的  谢谢大神，终于理解了，不过我还有个问题，ruguo 我没给p2赋值，p2会是0，就是上面所有输出结果减1，代码是放在main里面的，地址为什么会自动初始化为0呢[/quote]  全局变量初始化为0 局部变量是随机值。[/quote]   但是它并没有是随机值，每次运行都自动赋值0，怎么回事呢[/quote]  0也是合理的随机值啊 ....

user: user-0
content: 引用 5 楼 fefe82 的回复:[quote=引用 3 楼 cqs20141005225115 的回复:] [quote=引用 2 楼 paschen 的回复:] *(p2 + i), 本来就等于 p2[i]，含义是一样的  你的p是指向数组的指针，解引后得到的是数组，数组会退化为指针（你例子中为int*指针），即*(p2 + i)输出退化为int*指针，而p2 + i 为数组的地址，这两个的值是相等的，但指针的类型是不同的  谢谢大神，终于理解了，不过我还有个问题，ruguo 我没给p2赋值，p2会是0，就是上面所有输出结果减1，代码是放在main里面的，地址为什么会自动初始化为0呢[/quote]  全局变量初始化为0 局部变量是随机值。[/quote]   但是它并没有是随机值，每次运行都自动赋值0，怎么回事呢

user: user-3
content: 引用 3 楼 cqs20141005225115 的回复:[quote=引用 2 楼 paschen 的回复:] *(p2 + i), 本来就等于 p2[i]，含义是一样的  你的p是指向数组的指针，解引后得到的是数组，数组会退化为指针（你例子中为int*指针），即*(p2 + i)输出退化为int*指针，而p2 + i 为数组的地址，这两个的值是相等的，但指针的类型是不同的  谢谢大神，终于理解了，不过我还有个问题，ruguo 我没给p2赋值，p2会是0，就是上面所有输出结果减1，代码是放在main里面的，地址为什么会自动初始化为0呢[/quote]  全局变量初始化为0 局部变量是随机值。

user: user-0
content: 引用 1 楼 qq407311984 的回复:p2指向的数组第二个地址，你怎么加i只是让指针后移相同位  谢谢

user: user-0
content: 引用 2 楼 paschen 的回复:*(p2 + i), 本来就等于 p2[i]，含义是一样的  你的p是指向数组的指针，解引后得到的是数组，数组会退化为指针（你例子中为int*指针），即*(p2 + i)输出退化为int*指针，而p2 + i 为数组的地址，这两个的值是相等的，但指针的类型是不同的  谢谢大神，终于理解了，不过我还有个问题，ruguo 我没给p2赋值，p2会是0，就是上面所有输出结果减1，代码是放在main里面的，地址为什么会自动初始化为0呢

user: user-1
content: *(p2 + i), 本来就等于 p2[i]，含义是一样的  你的p是指向数组的指针，解引后得到的是数组，数组会退化为指针（你例子中为int*指针），即*(p2 + i)输出退化为int*指针，而p2 + i 为数组的地址，这两个的值是相等的，但指针的类型是不同的

user: user-4
content: p2指向的数组第二个地址，你怎么加i只是让指针后移相同位
user-0 提问: C语言char类型的二维数组问题

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

user: user-0
content: 引用 2 楼 paschen的回复:宏定义不需要用分号结尾，否则替换时会将分号换入导致错误 sorry,粗心了，程序猿需要胆大心细……

user: user-1
content: 理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-2
content: #define max_rows    20; #define max_colunms 20;  换成更好 const int  max_rows = 20; const int max_colunms = 20;

user: user-3
content: 宏定义那里有问题，是不需要加分号的。

user: user-4
content: 宏定义、宏定义、宏定义 去分号、去分号、去分号

user: user-5
content: 多了分号 http://blog.csdn.net/sinat_30415255/article/details/50596355

user: user-6
content: 20后的两个分号，多了

user: user-7
content: #define max_rows    20 #define max_colunms 20

user: user-8
content: 宏定义不需要用分号结尾，否则替换时会将分号换入导致错误

user: user-9
content: 理论上来说是可以的。。可能是编译器的问题。。而且你这里主函数是int形，所以得有返回值。
user-0 提问: 结构体中的指针变量申请空间问题

回复:
user: user-1
content: 我想提问，如果我想把name声明为指针，我该如何解决这个问题；还有就是这两种做法的区别在哪里，我声明为指针的做法错误在哪里。   小白解答一下， 当你声明为数组时，char name[20];这句话以为着你在内存中已经为name这个指针划分了20个char的内存空间； 如果你想要用char * name;那么你可以在结构定义中再写一个int max_size；当你初始化的时候记得还要为name申请max_size大小的内存，这个需要你手动malloc，stack->name=(char*)malloc(sizeof(char)*stack->maxsize));//stack是这个结构的指针，这样你就可以实现动态申请内存大小了，不会浪费

user: user-2
content: 引用 6 楼 u011028771 的回复:[quote=引用 3 楼 paschen 的回复:] char *name[20];  改成 char *name; 粘程序粘错了，我声明的是char *name;但是出现了如题的问题[/quote]  如果是指针，对象复制、赋值需要深拷贝，默认的是浅拷贝，也就是只是复制指针的值，并没重新申请一片内存，而如果是数组的话，会复制整个数组

user: user-3
content: 如果定义的是char*name，那么添加新节点时需要新开辟一段空间，比如malloc（20*sizeof(char))，而不只是简单的开辟结构体空间，然后直接把传进来的结构体付给他那么简单，那样的话，你结构体里的name指针只是指向了一个临时参数里的空间，函数结束就无效了，所以出现了错误。 如果你定义的是字符数组char name[20]那就没有什么问题了

user: user-4
content: 楼上解释正确。简单说就是， 每个节点的name都指向最初malloc的那段空间。

user: user-5
content: 哥们，出现你上面那个结果是因为深拷贝的问题导致得     1.你对student.name在main()中申请了一片空间，注意只是一片空间，当你第一次赋值之后，你传入了函数（进行的是值传递，也就是说只是传了student.name指针的副本，没有在单独开辟空间出来），此时你直接赋值给另一个结构体（由于你结构体没有等号操作符重载，因此采用默认的，只进行值得赋值，因此就只是student.name的指针本身的值付给它，并没有开辟另外的空间，暂记这个指针ptr，指向A空间）。当你第二次传递进来的时候一样的传递ptr指针，而同样进行值赋值没创建空间。因此你第一次与第二次传递的都是ptr指针，指向的空间都是A，当你第二次重新赋值了A空间后，那么第一次同样也是指向了这个空间，那么就是第一次、第二次指向同样空间 ，里面的值当然以第二次为准，所以打印结果相同      2.基本数据类型这不一样，没有深拷贝，直接赋值即可，显示结果就不同了      3.你将char* 换成char数组当然就可以了，因为char数组初始化结构体时就会申请出空间，那么两次就是不同的空间了，就可以保存不同的值了      嘿嘿！不好意，第一次在这上面回答问题，说的不清楚，还望谅解

user: user-0
content: 引用 3 楼 paschen 的回复:char *name[20];  改成 char *name; 粘程序粘错了，我声明的是char *name;但是出现了如题的问题

user: user-0
content: 引用 1 楼 eastfriendwu 的回复:你声明的是指针数组了，改成char* name即可。 我粘程序是粘错了，我声明的是char *name;但是出现了提问中的问题

user: user-0
content: 创建链表的 (*L)->next = (*L); (*L)->prior = (*L); return OK;  就是几句废话 等于空不行吗？ (*L)->next =NULL; (*L)->prior =NULL; 这个是链表的头结点，空的循环链表，头结点不应该是自己指向自己吗？  char *name[20];  改成 char *name; 我贴程序是粘错了，我声明的是char *name;但是出现了我提问时的错误！

user: user-2
content: char *name[20];  改成 char *name;

user: user-6
content: 创建链表的 (*L)->next = (*L); (*L)->prior = (*L); return OK;  就是几句废话 等于空不行吗？ (*L)->next =NULL; (*L)->prior =NULL;  自己等于自己，又要二次分配Name 你丫就不当心重复分配

user: user-4
content: 你声明的是指针数组了，改成char* name即可。
user-0 提问: 我想设计一条简单的C语言程序，用于识别输入的两位数所对应的身份

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

user: user-0
content: 谢谢楼上两位大神，可是无错误运行以后无法输出任何有效信息，就是填数字空格以后程序就显示结束了……

user: user-2
content: 检查你是否使用了中文下的符号  switch那一行最前面是不是有个点

user: user-3
content: 右括号用了全角的了
user-0 提问:  错误：expected ‘)’ before ‘Book’

回复:
user: user-0
content: 是自己理解错了，以为makefile的子函数不需要添加头文件，在每个子函数的开头添加头文件就好了

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

user: user-0
content: 就是在第一行就报错了 void add(BOOK Book),这是第一行的代码

user: user-0
content: 我用的makefile管理的代码，功能子目录里的函数开头不需要include包含头文件的

user: user-2
content: 引用 2 楼 Echo_Ana 的回复:就是在第一行就报错了 void add(BOOK Book),这是第一行的代码  第一行？前面没个 #include ?

user: user-3
content: 没有代码帮不了你。 首先你要include上面定义的结构体吧？

user: user-3
content: 看看编译器报错的行号，是不是周围代码缺少了一些字符? 上面的结构体定义没有问题。