Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: c语言怎么将字符数组转换成整型

回复:
user: user-1
content: ch1=a[i];ch2=a[i+1];

user: user-2
content: 字符数组a[i]="\u5e74\u5934" —————————————— 不明白楼主说的a[i]指什么？

user: user-3
content: 我是这样弄得：如果有一个char c = ‘0’那么其ascll码 = 48   即int a = c；那么c = 48；写一个函数使a = c - 48；即可转换
user-0 提问: 一个关于c语言的字符串问题，大一生，求解答

回复:
user: user-1
content: 用我这个吧。简单 #include "stdafx.h" int main() { 	char str[1000]="|Hallo World!|"; 	char buf[1000]; 	int n=strlen(str); 	int j=0; 	for(int i=0;i<n;i++) 	{ 		if(str[i]!='|') 		{ 			buf[j]=str[i]; 			j++; 		} 	} 	buf[j]='\0'; 	printf("%s\n",buf); }

user: user-2
content: char s[]=" |Hallo World!|"; char str[100]; sscanf(s,"|%99[^|]|",str);

user: user-3
content: 没有环境，先这样写了

user: user-3
content: 引用 1 楼 user-6的回复:那自己来提取也很简单：   void main() { 	int i; 	char* p; 	char str[1000] = "|Hallo World!|"; 	p = str; 	while (*p++!='|'); 	for (i = strlen(p); p[i] !='|';--i); 	p[i] = '\0';  	//此时p指向的字符串即为你要的  	printf("%s", p); }  人家大一新生，你这代码6

user: user-4
content: char str[10000] //10000是随便设的，首先你的10000设的太大了

user: user-5
content: 使用getchar()函数来一个字符一个字符地读取就可以了。读入的字符，保存到数组中。 示例代码如下： #include <conio.h> #define INPUT_MAX_COUNT	1000 int  main(){ 	char szInputChars[INPUT_MAX_COUNT]; 	char ch; 	int nInputCount = 0; 	while(1){ 		ch = getchar(); 		if (ch == '\n') 		{ 			break;//按了回车按就退出输入 		} 		else if (ch == '|') 		{ 			//根据实际，处理这个符号 		} 		else 		{ 			//保存输入的字符 			szInputChars[nInputCount++] = ch; 			if (nInputCount >= INPUT_MAX_COUNT) 			{ 				szInputChars[nInputCount - 1] = 0; 				break; 			} 		} 	} 	if (nInputCount < INPUT_MAX_COUNT) 	{ 		szInputChars[nInputCount] = 0; 	} 	printf("输入的字符串是：\n%s",szInputChars); 	getch(); 	return 0; }

user: user-6
content: 那自己来提取也很简单：   void main() { 	int i; 	char* p; 	char str[1000] = "|Hallo World!|"; 	p = str; 	while (*p++!='|'); 	for (i = strlen(p); p[i] !='|';--i); 	p[i] = '\0';  	//此时p指向的字符串即为你要的  	printf("%s", p); }
user-0 提问: c语言中 关于字符数组和字符串的区别

回复:
user: user-1
content: 引用 3 楼 lxq0228 的回复:字符串： char a="abc";等价于char a[]={'a','b','c','\0'};当然后者也是字符数组，字符串的读取遇到零会自动停止读取，“abc”是常量字符串，里面的内容不能更改，而后者可以。多看看书，所有的学习，基础很重要！自勉！  写错了吧  char a ="abc" 应该是 char *a="abc" 吧

user: user-2
content: http://blog.sina.com.cn/s/blog_6a9d45ff0100n5jj.html

user: user-3
content: c里边的所谓的字符串就是一连串的字符，也可以理解为数组里边保存的一连串的字符（char）类型的数据，当然作为合法的字符串是需要有结束符'\0'的。也可以有这样的形式，定义一个字符指针，比如const char*p="hello"这样的形式表示字符指针p指向这个常量字符串“hello”的首字符的位置，而这个常量字符串是隐含结束符'\0'的。当你定义一个char数组准备保存字符串的时候，需要为结束符预留一个空间，比如char a[10]，这个数组最多只能保存9个有效字符，如果你写入超过9个有效字符，要么程序会出错（越界访问），要么就是无法正确显示这个字符串（因为在合法界限内，没有结束符）

user: user-4
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-5
content: 字符串： char a="abc";等价于char a[]={'a','b','c','\0'};当然后者也是字符数组，字符串的读取遇到零会自动停止读取，“abc”是常量字符串，里面的内容不能更改，而后者可以。多看看书，所有的学习，基础很重要！自勉！

user: user-6
content: C没有字符串这种类型，只要字符数组最后是以\0结尾的，就算是C的字符串  char a[10]={'x','a','a','b'}  后面的字符将全会用0填充，所以是以\0结尾的  同理char a[5]={'a','b'}也是
user-0 提问: 初学，for的问题

回复:
user: user-1
content: 去掉分号，for后面的

user: user-2
content: for(i=1 ; i<=n ; i=i+1 );   后面多了分号，有分号会让for循环成为一个空循环

user: user-3
content: for(i=1 ; i<=n ; i=i+1 ); 改为 for(i=1 ; i<=n ; i=i+1 ) 去掉最后那个分号

user: user-4
content: 给你个范例来看看，你对比下

user: user-4
content: for语句的那一行，多了个";"
user-0 提问: 求助

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约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: scanf("d%",&score);  改成  scanf("%d",&score);

user: user-3
content: 引用 2 楼 ANARTH的回复:建议把result=(score>=90?'A':(score<60?'C':'B'));分开写成两句试试。 呃，score应该是%c，你写成%d了

user: user-3
content: 建议把result=(score>=90?'A':(score<60?'C':'B'));分开写成两句试试。

user: user-4
content: scanf("d%",&score); 是%d，你写错了
user-0 提问: 二维数组的问题

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-2
content: scanf %c 会将每次输入完的换行符 \n接收到数组中 用getchar接收了\n   int main() { 	char m[5][5];  	for(int i=0;i<5;i++) 	{ 		for(int j=0;j<5;j++) 		{ 			scanf("%c",&m[i][j]); 		} 		getchar(); 	}  	for(int i=0;i<5;i++) 	{ 		for(int j=0;j<5;j++) 			printf("%c",m[i][j]); 		printf("\n"); 	} 	return 0; }

user: user-0
content: 问题解决了，是scanf（”%c"，&x）；这句。 一直印象里的都是scanf会跳过空白字符，但%c时，则会吸收换行符。  我的解决办法是在j==4时用getchar();吸收换行符，结果对的。

user: user-0
content: 引用 1 楼 oYinGui1 的回复:字符串以'\0'结尾，你要输入5个字符，应该定义的字符数组大小是6，要把'\0'算上。  我觉得字符串是'\0'结尾 没错，但我定义的是字符数组吧，这个应该没有影响的。

user: user-3
content: 字符串以'\0'结尾，你要输入5个字符，应该定义的字符数组大小是6，要把'\0'算上。
user-0 提问: 求助哪里错了 ---biff过滤器

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

user: user-0
content: 引用 2 楼 paschen的回复:for (n=0;ch!='\n';n++)  改成：  for (n=0;ch[n]!='\n';n++)    case 'A':ch[i]="4";break;  改成  case 'A':ch[i]='4';break;  是单引号，其他case后面的也一样换成单引号 谢谢 我一定是傻了-_-#

user: user-2
content: for (n=0;ch!='\n';n++)  改成：  for (n=0;ch[n]!='\n';n++)    case 'A':ch[i]="4";break;  改成  case 'A':ch[i]='4';break;  是单引号，其他case后面的也一样换成单引号

user: user-3
content: 第一个for循环 ch是指针, 和字符进行比较了.
user-0 提问: 一运行就出现问题停止运行 求解

回复:
user: user-1
content: %s改成 %d  或者  2+3+1 改成 "2+3+1"

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-3
content: 直接 printf("Beware the Idea Of March2+3+1");不就可以了，干嘛自找麻烦

user: user-4
content: %s  后面应该跟一个变量的 变量呢？

user: user-5
content: 可能没关闭上一个空间站

user: user-6
content: %s 的意思是指从一个指定地址开始 到\0结束的字符串。 而你给地址是 1+2+3 这个地址(0000000006)在操作系统可能是一个非法地址 或者是内核的地址。不是用户空间地址。
user-0 提问: 如何消除警[Warning] initialization from incompatible pointer type

回复:
user: user-1
content: struct data *pdate=&today;  改成  struct date *pdate=&today;   #include<stdio.h>  struct date{ 	int month; 	int day; 	int year;  };  int main(int argc,char const *argv[]){ 	struct date today = { 		07,31,2014 	}; 	struct date day; 	struct date *pdate=&today; 	day=today; 	day.year=2015;  	printf("Today's date is %i-%i-%i.\n",today.year,today.month,today.day); 	printf("this month is %i-%i-%i.\n",day.year,day.month,day.day); 	printf("address of today is %p\n",pdate);  	return 0; }

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

user: user-3
content: 说明一下，首先，date已经定义为结构体，后面使用date定义变量时，没有必要在前面添加struct。 其次，不知道是打错了还是源代码就是这样，第16行，date打成了data，要注意避免。  修改后代码如下：  #include<stdio.h>  struct date{ 	int month; 	int day; 	int year;  };  int main(int argc, char const *argv[]){ 	date today; 	today = date{ 		07, 31, 2014 	}; 	date day; 	date *pdate = &today; 	day = today; 	day.year = 2015;  	printf("Today's date is %i-%i-%i.\n", today.year, today.month, today.day); 	printf("this month is %i-%i-%i.\n", day.year, day.month, day.day); 	printf("address of today is %p\n", pdate);  	return 0; }
user-0 提问: 单链表长度如何表示

回复:
user: user-1
content: 单链表的长度可以添加在定义链表的结构中： typedef struct cList{     node *ptrBack;     node *ptrNext;     int lLength;    //链表长度 } CLIST;

user: user-2
content: 顺序表和单链表有什么区别？ 没有！

user: user-3
content: struct node { 	int value; 	char *name; 	struct node *next; }; struct node *mdzz=NULL; void add(int value,char *name) { 	struct node *temNode=malloc(sizeof(struct node)); 	temNode->name=strdup(name); 	temNode->value=value; 	temNode->next=mdzz; 	mdzz=temNode; } void printTotal(struct node *current) { 	int i=0; 	while(current!=NULL) { 		i++; 		current=current->next; 	} 	printf("%d:",i); } int main(){       // 用add加然后printTotal 会print长度  改void成int然后返回I也就是返回长度 )

user: user-4
content: 将链表长度记录在外头，不是记录在Node节点里面。 比如  struct ListHeader {       Struct Node *head; 链表头       size_t numNode; 记录节点数目 };

user: user-0
content: 头文件
user-0 提问: 运行错误

回复:
user: user-1
content: printf("你喜欢的颜色是%s\n",&colorName);  改成  printf("你喜欢的颜色是%s\n",colorName);  %s 需要char*类型指针，colorName本身已经是指针了

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-3
content: #include<stdio.h>    #include <string.h> enum COLOR {RED,YELLOW,GREEN };    int main(int argc,char const *argv[]) {      int color=-1;      char colorName[10]={0};            	 printf("输入你喜欢的颜色代码：");      	 scanf("%d",&color);      	 switch(color) 	{          	 	case RED:strcpy(colorName,"red");break;          		case YELLOW:strcpy(colorName,"yellow");break;          		case GREEN:strcpy(colorName,"green");break;          		default :strcpy(colorName,"unknow");break;      	}      	printf("你喜欢的颜色是%s\n",colorName);            	return 0;  }

user: user-4
content: clang的提示非常清晰

user: user-5
content: printf("你喜欢的颜色是%s\n",&colorName); 不需要取地址
user-0 提问: 这个警告怎么解决

回复:
user: user-1
content: char *colorName=NULL;  改成  const char *colorName=NULL;

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-3
content: 楼上解释的很清楚了。。

user: user-4
content: 这句warning是针对你case中 colorName=“red”形式而提示的，目的在于提示不建议将char*指向常字符串。 因为常字符串为了优化通常村存在符号表中，也就意味着不能修改。 你使用非const的char*指向它，很有可能在后面进行修改，从而引发错误。  解决办法可使用strcpy进行拷贝

user: user-5
content: switch里面   case123吧
user-0 提问: 关于文件与链表

回复:
user: user-0
content: 那么我要实现打印所有数据 直接从文件中打印到显示器 还是转入到链表在打印呢 查询的时候是否也是这样子呢

user: user-1
content: 访问内存的速度远远高于访问硬盘的速度
user-0 提问: 输入字符串，并且按照字符个数多到少的输出字符，字符个数相同的按asill顺序，从小到大输出

回复:
user: user-1
content: 先去重，然后排序，很基础的东西

user: user-2
content: 完成

user: user-2
content: 构造一个结构体，调用qsort即可

user: user-3
content: 引用 1 楼 user-3 的回复:你可以定义一个类 包含char a;存放字符  int b; 存放数量   定义一个该类的对象数组  用字符串操作函数 将整个字符串 先整理一下 放入对象数组里。 再按照某种规则排列对象数组并输出 规则为：1先按照b的大小排序 2  如果b相同，则按照a的顺序排序 思路是这么个思路，具体的自己实现吧、 哦 C语言啊 那就把上文所有的类用结构体去代替

user: user-3
content: 你可以定义一个类 包含char a;存放字符  int b; 存放数量   定义一个该类的对象数组  用字符串操作函数 将整个字符串 先整理一下 放入对象数组里。 再按照某种规则排列对象数组并输出 规则为：1先按照b的大小排序 2  如果b相同，则按照a的顺序排序 思路是这么个思路，具体的自己实现吧、
user-0 提问: 输出一串字符找出最大的单词，出现烫烫烫，是代码哪里错了吗？

回复:
user: user-1
content: } while (ch[i] != '\0');  改成  } while (ch[i-1] != '\0');    #include<stdio.h> #include<stdlib.h> #pragma warning(disable:4996) int main(void) { 	char ch[100]; 	int  i, j, len, maxlen, p; 	i = len = maxlen = 0; 	printf("\n输入一串字符:"); 	gets(ch); 	do 	{ 		j = i; 		for (len = 0; ch[i] != ' '&&ch[i] != '\0'; i++) 		{ 			len++; 		} 		if (len > maxlen) 		{ 			maxlen = len; 			p = j; 		} 		i++; 	} while (ch[i-1] != '\0'); 	printf("\n"); 	if (len == 0) 		printf("\n没有输入单词！"); 	else 	{ 		for (i = p; i < p + maxlen; i++) 			printf("%c", ch[i]); 		printf("\n"); 	} 	system("pause"); 	return 0; }
user-0 提问: 这是咋回事？

回复:
user: user-1
content: 引用 1 楼 ipqtjmqj 的回复:你在linux上是utf-8编码吧， 汉字在utf-8中一般是３个字节的， 第１次p++后少了１个字节，导致后面的都解释错误。 １４与１６行单个字节当然无法打印了。  你把汉字去掉，全部换成英文字母，就都可以打印出来了\ +1

user: user-2
content: 你在linux上是utf-8编码吧， 汉字在utf-8中一般是３个字节的， 第１次p++后少了１个字节，导致后面的都解释错误。 １４与１６行单个字节当然无法打印了。  你把汉字去掉，全部换成英文字母，就都可以打印出来了

user: user-3
content: 引用 3 楼 u014325402 的回复:[quote=引用 1 楼 ipqtjmqj的回复:]你在linux上是utf-8编码吧， 汉字在utf-8中一般是３个字节的， 第１次p++后少了１个字节，导致后面的都解释错误。 １４与１６行单个字节当然无法打印了。  你把汉字去掉，全部换成英文字母，就都可以打印出来了 嗯嗯，我用的的是UTF-8,我还不明白，p++后，第一个汉子打印错误，那后面的为什么不能打印正确呢？[/quote] 遇0而止。

user: user-0
content: 引用 1 楼 ipqtjmqj的回复:你在linux上是utf-8编码吧， 汉字在utf-8中一般是３个字节的， 第１次p++后少了１个字节，导致后面的都解释错误。 １４与１６行单个字节当然无法打印了。  你把汉字去掉，全部换成英文字母，就都可以打印出来了 嗯嗯，我用的的是UTF-8,我还不明白，p++后，第一个汉子打印错误，那后面的为什么不能打印正确呢？
user-0 提问: 请教下，为什么数组中i[3] == 3[i];

回复:
user: user-1
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-2
content: c语言就是这样规定的 a[b] = *(a+b)

user: user-3
content: 引用 7 楼 qiaojiuyuan 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价   如上你所说的A[B] *(A+B) *(B+A) B[A] //以上四行等价 那*(A+B)中的b我知道是偏移量，那是多少啊？也是一个Int值吗[/quote] 其中有一个是指针，另外一个是数值。如： char *p = NULL; char *p1_1 = p + 1; int  *p1_2 = p + 1; char *p2_1 = 1 + p; int  *p2_2 = 1 + p; 如上，你肯定明白 int 指针的那两行编译不过去的，除非强转。而且，运算结果其实也是和数值相加的那个指针类型是一样的，所以根本不存在歧义。

user: user-4
content: 引用 7 楼 qiaojiuyuan 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价   如上你所说的A[B] *(A+B) *(B+A) B[A] //以上四行等价 那*(A+B)中的b我知道是偏移量，那是多少啊？也是一个Int值吗[/quote]  偏移量是指针指针的类型的大小

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价   如上你所说的A[B] *(A+B) *(B+A) B[A] //以上四行等价 那*(A+B)中的b我知道是偏移量，那是多少啊？也是一个Int值吗

user: user-0
content: 引用 3 楼 paschen 的回复:看我的这个帖子你就知道了：http://blog.csdn.net/paschen/article/details/47315449 恩 看了挺不错 谢谢

user: user-0
content: 引用 4 楼 user-5 的回复:请问在哪里学的，有教材吗？ 在《嗨翻C语言》里看到的

user: user-5
content: 请问在哪里学的，有教材吗？

user: user-4
content: 看我的这个帖子你就知道了：http://blog.csdn.net/paschen/article/details/47315449
user-0 提问: C语言写入文件时指针和数组有什么区别？

回复:
user: user-1
content: char *str; 只是一个指针，你没有为指针分配内存就去写（gets(str);）  当然出错了

user: user-2
content: 楼主，估计是个新手，内存分配没有搞懂， 建议初学的时候，理解c语言的内存 指针是个地址， 所以你引用的时候， 要分配内存空间， 才可以*str !

user: user-3
content: 你要注意的是指针的使用。 char *str 这是没有分配空间的指针，自然就会报错了。  两种解决办法： 1.用数组，提前分配空间 2.调用动态分配空间的函数malloc或者自己封装一个函数，给指针分配空间就好了
user-0 提问: 运行到输入值得时候c语言程序运行时提示出现了一个问题，导致程序停止工作

回复:
user: user-1
content: int number; 	LinkList p1,p2,r1=La,r2=Lb; 	printf("请输入第一组要输入元素的个数"); 	scanf("%d",&number); 	for(int i=0;i<number;i++){ 		scanf("%d",&p1->data); 		p1->next=NULL; 		r1->next=p1; 		r1=p1;  这里的p1没有初始化就使用了

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

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

user: user-4
content: scanf("%d",&p1->data); 之前需要判断 p1->data 是否为空， 如果为空 应该添加新节点

user: user-5
content: 内存越界了，自己慢慢找吧
user-0 提问: C语言反函数表示方法

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

user: user-2
content: 这个问题很麻烦，如果你是想编一个程序自己用的话，直接去网上找现成的就可以了。

user: user-0
content: 再来看看有人没

user: user-0
content: 求指点哇，实在是爪机
user-0 提问: C语言不定积分的计算

回复:
user: user-0
content: #include "math.h" double romb(double a, double b, double eps , double (*f) ()) {     int m, n, i, k;     double y[10], h, ep, p, x, s, q;     h = b - a;     y[0] = h*((*f)(a) + (*f)(b)) / 2.0;     m = 1; n = 1; ep = eps + 1.0;     while ((ep>=eps)&&(m<=9))     {         p = 0.0;         for(i=0;i<=n-1;i++)         {             x = a + (i + 0.5)*h;             p = p + (*f)(x);         }         p = (y[0] + h*p) / 2.0;         s = 1.0;         for(k=1;k<=m;k++)         {             s = 4.0*s;             q = (s*p - y[k - 1]) / (s - 1.0);             y[k - 1] = p;             p = q;         }         ep = fabs(q - y[m - 1]);         m = m + 1; y[m - 1] = q; n = n + m; h = h / 2.0;     }     return(q); }

user: user-0
content: 如何双重积分

user: user-1

user: user-0
content: 引用 6 楼 paschen 的回复:[quote=引用 4 楼 云中睡觉的龙的回复:][quote=引用 3 楼 paschen 的回复:] 计算机通常使用数值积分来计算，可参看《数值分析》 我专门去图书馆借了本数值计算  可是只有定积分的 没看到不定积分怎么求  小白求指点[/quote] 可以考虑用MATLAB来写程序，直接有现成的可以用  也可以用C调用Matlab计算[/quote] 小白完全不懂  我查查库函数  希望有！！！！！！！！！！！！！

user: user-2
content: 引用 4 楼 云中睡觉的龙的回复:[quote=引用 3 楼 paschen 的回复:] 计算机通常使用数值积分来计算，可参看《数值分析》 我专门去图书馆借了本数值计算  可是只有定积分的 没看到不定积分怎么求  小白求指点[/quote] 可以考虑用MATLAB来写程序，直接有现成的可以用  也可以用C调用Matlab计算

user: user-3
content: 不定积分是公式演算吧。 https://www.baidu.com/s?wd=c源代码%20"公式演算"

user: user-0
content: 引用 3 楼 paschen 的回复:计算机通常使用数值积分来计算，可参看《数值分析》 我专门去图书馆借了本数值计算  可是只有定积分的 没看到不定积分怎么求  小白求指点

user: user-2
content: 计算机通常使用数值积分来计算，可参看《数值分析》

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:https://www.baidu.com/s?wd=C源代码%20不定积分  老师  我没看懂 老师能详细讲下吗

user: user-3
content: https://www.baidu.com/s?wd=C源代码%20不定积分
user-0 提问: VS2012可以编译汇编语言吗？

回复:
user: user-1
content: VC++ 32位编译器支持内嵌汇编，64位编译器不支持，但是可以连接外部汇编模块，需要预先汇编为obj。

user: user-2
content: VS自带 汇编编译器 ml

user: user-3
content: 推荐使用 RadASM 汇编编译器
user-0 提问: 为什么总是提示没有定义

回复:
user: user-0
content: 如果想使用这种方式，有什么方法改正吗？

user: user-1
content: "movl           $_value, %ecx\n\t" 这句错了吧，C语言中的变量，不可以直接传到汇编中吧， 汇编中$后接的是立即数
user-0 提问: 求大神请教静态链表

回复:
user: user-1
content: 你怎么只有CreateList没有InsertList函数

user: user-2
content: 你每次while循环都要InitList(L);一遍？ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: Algorithms IN C中随书代码是否有问题？

回复:
user: user-0
content: 引用 2 楼 paschen 的回复:会越界 不知道大师为什么写这样的程序

user: user-1
content: 会越界

user: user-2
content: scanf, wscanf Read formatted data from the standard input stream.  int scanf( const char *format [,argument]... );  int wscanf( const wchar_t *format [,argument]... );  Routine Required Header Compatibility  scanf <stdio.h> ANSI, Win 95, Win NT  wscanf <stdio.h> or <wchar.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Both scanf and wscanf return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.  Parameters  format  Format control string  argument  Optional arguments  Remarks  The scanf function reads data from the standard input stream stdin and writes the data into the location given by argument. Each argument must be a pointer to a variable of a type that corresponds to a type specifier in format. If copying takes place between strings that overlap, the behavior is undefined.  wscanf is a wide-character version of scanf; the format argument to wscanf is a wide-character string. wscanf and scanf behave identically otherwise.   Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tscanf scanf scanf wscanf    For more information, see Format Specification Fields — scanf functions and wscanf Functions.   Example   /* SCANF.C: This program uses the scanf and wscanf functions   * to read formatted input.   */  #include <stdio.h>  void main( void ) {    int   i, result;    float fp;    char  c, s[81];    wchar_t wc, ws[81];     printf( "\n\nEnter an int, a float, two chars and two strings\n");     result = scanf( "%d %f %c %C %s %S", &i, &fp, &c, &wc, s, ws );    printf( "\nThe number of fields input is %d\n", result );    printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws);     wprintf( L"\n\nEnter an int, a float, two chars and two strings\n");     result = wscanf( L"%d %f %hc %lc %S %ls", &i, &fp, &c, &wc, s, ws );    wprintf( L"\nThe number of fields input is %d\n", result );    wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp, c, wc, s, ws); }   Output  Enter an int, a float, two chars and two strings 71 98.6 h z Byte characters  The number of fields input is 6 The contents are: 71 98.599998 h z Byte characters  Enter an int, a float, two chars and two strings 36 92.3 y n Wide characters  The number of fields input is 6 The contents are: 456 92.300003 y n Wide characters   Floating-Point Support Routines, Stream I/O Routines, Locale Routines  See Also   fscanf, printf, sprintf, sscanf
user-0 提问: c中如何实现立即执行一段代码

回复:
user: user-0
content: 引用 1 楼 u010165006 的回复:可以设置每帧时间为100ms，每过100ms，改变球拍位置，球计数器加一，计数器每达到5，改变弹力球位置，计数器置0，位置改变以后刷新帧画面。 谢谢你，问题解决了。

user: user-1
content: 可以设置每帧时间为100ms，每过100ms，改变球拍位置，球计数器加一，计数器每达到5，改变弹力球位置，计数器置0，位置改变以后刷新帧画面。
user-0 提问: 编码规范

回复:
user: user-1
content: astyle自动整理c,c++,java源代码格式命令行工具源代码。 用astyle --help查看使用帮助。 http://download.csdn.net/detail/zhao4zhong1/5605415

user: user-1
content: 比用什么风格更重要的是在任何地方，任何时候都坚持用一种风格。 比爱哪种美眉更重要的是在任何地方，任何时候都坚持爱一个美眉。

user: user-2
content: 《C语言课程设计案例精编》 C语言程序开发范例宝典 C语言经典编程282例  看题目，先自己写，写完再和书上比较一下，不过书里的代码也不是最好的，所以要取舍。

user: user-3
content: 可以写个计算器软件啊，算法不复杂，有一定代码量

user: user-4
content: 自己感兴趣什么就写什么，比如可以写个控制台下的小游戏，网上也会有一些别人写的源码可供你参考
user-0 提问: 关于c语言的函数调用和编译

回复:
user: user-0
content: 这个结帖给分功能有问题啊，谢谢大家了，大家的解释都很有帮助

user: user-1
content: 参考gcc源代码中sizeof的实现。

user: user-2
content: 因为sizeof不是函数，只是个关键字，编译时就确定了，所以不会调用函数  类似的 sizeof(++i)  也不会让i自加

user: user-3
content: 自己反汇编，单步执行  引用 1 楼 qq423399099 的回复:参考特性6： 特性6：当表达式作为sizeof的操作数时，它返回表达式的计算结果的类型大小，但是它不对表达式求值！ http://blog.csdn.net/hust_sheng/article/details/50537609 i get

user: user-4
content: 参考特性6： 特性6：当表达式作为sizeof的操作数时，它返回表达式的计算结果的类型大小，但是它不对表达式求值！ http://blog.csdn.net/hust_sheng/article/details/50537609
user-0 提问: [c语言]请问这个问题是出错在哪里？

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-2
content: 在scanf("%c",...)前面都加上一句fflush(stdin);清空一下输入缓冲区 也可以自己单步调试或者直接打印，看看每一步的结果是不是都如你所料 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: scanf("%c", ...)  会将之前输入的换行符接收了
user-0 提问: 关于内存[C语言]

回复:
user: user-1
content: 可以看一看滴水的教程 http://www.dtdebug.com/forum.php?mod=viewthread&tid=3211

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  http://bbs.csdn.net/topics/391971215

user: user-3
content: 引用 2 楼 user-4 的回复:静下心仔细看，不可能看不懂，如果还是不懂，说明你不懂的地方  http://blog.csdn.net/youoran/article/details/10990815  +1

user: user-4
content: 静下心仔细看，不可能看不懂，如果还是不懂，说明你不懂的地方  http://blog.csdn.net/youoran/article/details/10990815
user-0 提问: 奇怪，C语言access库函数获取文件可执行权限出错

回复:
user: user-1
content: http://blog.163.com/lqy_super/blog/static/199751021201302351831330/

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  谢谢您的指导

user: user-0
content: 引用 1 楼 paschen 的回复:http://blog.163.com/lqy_super/blog/static/199751021201302351831330/  谢谢您的回复，我的问题是取不了文件的执行权限，一运行就出错 只测试  引用 2 楼 user-3 的回复:Microsoft 的 access 函数不支持 X_OK  谢谢，这个说法感觉合理，但没找到依据，暂且就这样认为吧

user: user-0
content: 引用 1 楼 paschen 的回复:http://blog.163.com/lqy_super/blog/static/199751021201302351831330/  谢谢您的回复，我的问题是取不了文件的执行权限，一运行就出错 只测试文件的读写权限正常

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-3
content: Microsoft 的 access 函数不支持 X_OK
user-0 提问: 小白求助，还是关于矩阵乘法，求大神相助，谢谢

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:r[i][k]=a[i][j]*b[j][i];  是否应该是   r[i][k]+=a[i][j]*b[j][i];  另外检查是否会越界，你循环中 i 的值会到2  而a[i][j] 中a 的范围是 [0-1][0-2]，i为2的时候是不是越界了  可以了，谢谢！

user: user-1
content: 引用 1 楼 user-3 的回复:r[i][k]=a[i][j]*b[j][i];  是否应该是   r[i][k]+=a[i][j]*b[j][i];  另外检查是否会越界，你循环中 i 的值会到2  而a[i][j] 中a 的范围是 [0-1][0-2]，i为2的时候是不是越界了感觉这个方法不错

user: user-2
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-3
content: r[i][k]=a[i][j]*b[j][i];  是否应该是   r[i][k]+=a[i][j]*b[j][i];  另外检查是否会越界，你循环中 i 的值会到2  而a[i][j] 中a 的范围是 [0-1][0-2]，i为2的时候是不是越界了
user-0 提问: C语言题目求解

回复:
user: user-1
content: B、  一个整型表达式

user: user-0
content: C语言中判断数据类型或者表达式长度符；不是一个函数，字节数的计算在程序编译时进行，而不是在程序执行的过程中才计算出来。这个是从百度搜索出来的，说这个不是一个函数。

user: user-2
content: C 一个整型表达式   sizeof是C语言的一种单目操作符,就像C语言的其他操作符++、--等。 它并不是函数。 sizeof操作符以字节形式给出了其操作数的存储大小。 操作数可以是一个表达式或括在括号内的类型名，如double，int等。  如sizeof(double)的值应该是8，即double型数据在内存中占8个字节。  因此答案C正确
user-0 提问: C primer plus 练习题问题

回复:
user: user-1
content: ptr = torf[0]; ———————— *ptr == ptr[0] == torf[0][0] *(ptr + 2) == ptr[2] == torf[0][2]

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

user: user-2
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-3
content: 你说的是对的，但是数组的内存是连续的，还是可以读出来的，如果你输出下   *（ptr+3）就会发现区别了。

user: user-1
content: 引用 8 楼 zaidaoshinima 的回复:没搞懂 你这个二维数组少了一个啊，少的那个自动用0替代吗？  数组部分初始化的，没有初值的部分赋0，如果没有记错的话。

user: user-4
content: 没搞懂 你这个二维数组少了一个啊，少的那个自动用0替代吗？

user: user-5
content: 你的p是int类型的指针，所以加2移动的距离不是数组的距离，而是一个int元素的距离  torf[2][2] 实际是4个连续的int，所以 *(ptr + 2) 指向的是其中的第三个

user: user-1
content: 引用 6 楼 u010165006 的回复:[quote=引用 5 楼 u010165006 的回复:] ptr = torf[0]; ———————— *ptr == ptr[0] == torf[0][0] *(ptr + 2) == ptr[2] == torf[0][2]  torf[0][2] 实际上越界了，不过int torf[2][2] = {12, 14,16}; 这个二维数组是按行连续存储的，所以 torf[0][2] == torf[1][0] （列满了就进一行，或者把二维数组当做一维来看，它们是同一个） [/quote]  把二维数组当做一维来看，比如数组int a[5][10] 对应 int b[5x10]，那么 a[i][j] 对应 b[ i*10+j ]

user: user-1
content: 引用 5 楼 u010165006 的回复:ptr = torf[0]; ———————— *ptr == ptr[0] == torf[0][0] *(ptr + 2) == ptr[2] == torf[0][2]  torf[0][2] 实际上越界了，不过int torf[2][2] = {12, 14,16}; 这个二维数组是按行连续存储的，所以 torf[0][2] == torf[1][0] （列满了就进一行，或者把二维数组当做一维来看，它们是同一个）

user: user-6
content: torf[0][0]，torf[0][1]，torf[1][0]，torf[1][1] 地址连续，你用指针访问相当于访问第三个数据。 torf[1][0]，因此是16.
user-0 提问: 为什么同一段代码别人的可以编译通过自己敲的不行

回复:
user: user-0
content: 引用 3 楼 user-2 的回复:引用 2 楼 qq_36151474 的回复:[quote=引用 1 楼 user-2 的回复:] 注意空格。。。     哪里 我又重新看了遍 还是没找到 SeqList*                SeqList_Create(); int SeqList_Insert(...)[/quote]   奥我明白了以后会注意的谢谢大伙

user: user-1
content: 像这个SeqList *SeqList_Create(int capacity); 你写成的是SeqList*SeqList_Create(int capacity); SeqList后面需要加个空格

user: user-2
content: 引用 2 楼 qq_36151474 的回复:引用 1 楼 user-2 的回复:注意空格。。。     哪里 我又重新看了遍 还是没找到 SeqList*                SeqList_Create(); int SeqList_Insert(...)

user: user-0
content: 引用 1 楼 user-2 的回复:注意空格。。。     哪里 我又重新看了遍 还是没找到

user: user-2
content: 注意空格。。。
user-0 提问: 如何在#define index strchr中只替换掉函数名index,不替换变量名index?

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

user: user-2
content: 处理宏的时候还不认识啥是函数，啥是变量。  你不如写个 char *index(const char *str, int c) {     return strchr(str, c); }

user: user-3
content: 宏替换的时候不会区分这些，干嘛要取成一样的名字
user-0 提问: 关于qrencode3.4.4（目录）如何生成qrencode可执行程序到开发板上

回复:
user: user-1
content: 使用ldd命令查看可执行程序依赖的.so

user: user-0
content: 恩，这个是第二个问题的解答方案！谢谢，那么，第一个问题，你能帮我解决下吗，就是怎么把二维码编译依赖的libpng库变成一个动态库，放到开发板的/usr/lib/目录下，以及怎么样在我的qrencode3.4.4目录下生成qrencode？

user: user-1
content: 静态链接 ？
user-0 提问: struct结构体函数

回复:
user: user-1
content: 这么做的目的是什么呢？

user: user-2
content: // 引用仅存在于 C++，指针则都可以使用。  // 指针声明/实现： void func(int *ptr) { 	*ptr = -1; } // 指针调用： int i; func(&i); printf("%d\n", i); // -1  // 引用声明/实现： void func(int &ref) { 	ref = -1; } // 引用调用： int i; func(i); printf("%d\n", i); // -1

user: user-3
content: 声明中…… 使用中……

user: user-4
content: 给你举个例子： 定义函数：  void fa(int d); void fb(int& d); void fc(int* pd);  使用函数：  int d = 0; fa(d); //将d的值赋值一份传给fa，这里的d和fa里的d是两回事，两个毫不相干的东西 fb(d); //将d传给fb，这里的d和fb里的d是一回事，同一个东西 fc(&d);//将d的指针传给fc，fc里的pd是一个指针，指向这里的d，你修改fc里pd的值不会影响到外面的d，但你修改fc里*pd的值，则会改变外面d的值（前提是你fc的pd一直指向d)

user: user-5
content: 引用 11 楼 super_admi 的回复:[quote=引用 9 楼 WX_East 的回复:] c语言是没有引用这个概念的  貌似C99有引用吧？[/quote]  没有。C11 也没有。  楼主程序 C 语言是编不过的。

user: user-4
content: 引用 9 楼 WX_East 的回复:c语言是没有引用这个概念的  貌似C99有引用吧？

user: user-6
content: 先搞清楚引用的概念。，所以引用其实就是对象的别名，比如 int a(int &c); c这个就是外部的整形的变量，而不是指针。

user: user-7
content: c语言是没有引用这个概念的

user: user-5
content: 引用 3 楼 loveqise 的回复:[quote=引用 1楼fefe82 的回复:]struct gas & 这是个引用 &ptr 这是个指针struct gas不是结构类型吗，&ptrip是指向struct gas类型的指针[/quote]  你需要找本教材好好看看了。 http://en.cppreference.com/w/cpp/language/pointer http://en.cppreference.com/w/cpp/language/reference

user: user-8
content: 而按引用传递需要的不是一个指针！

user: user-8
content: 函数声明参数中的&表示的是引用，不是取址  调用时的&是取地址  两个&不是同一回事

user: user-0
content: 引用 2楼qq_36409192 的回复:你的声明问题。声明应该声明*ptr&ptr就是指针啊！

user: user-0
content: 引用 1楼fefe82 的回复:struct gas & 这是个引用 &ptr 这是个指针不可以这样理解吗？

user: user-0
content: 引用 1楼fefe82 的回复:struct gas & 这是个引用 &ptr 这是个指针struct gas不是结构类型吗，&ptrip是指向struct gas类型的指针

user: user-9
content: 你的声明问题。声明应该声明*ptr

user: user-5
content: struct gas & 这是个引用 &ptr 这是个指针
user-0 提问: 自己写的代码希望帮忙精简一下

回复:
user: user-1
content: 差不多可以了吧

user: user-2
content: 仅供参考：//Round(1.234,2) = 1.23 //Round(1.234,0) = 1.0 //Round(123.4,-1) = 120.0 double Round(double dVal, short iPlaces) {     double dRetval;     double dMod = 0.0000001;     if (dVal<0.0) dMod=-0.0000001;     dRetval=dVal;     dRetval+=(5.0/pow(10.0,iPlaces+1.0));     dRetval*=pow(10.0,iPlaces);     dRetval=floor(dRetval+dMod);     dRetval/=pow(10.0,iPlaces);     return(dRetval); }  double round(double dVal, short iPlaces) //iPlaces>=0 {     unsigned char s[20];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); }

user: user-0
content: 其实我想从算法上精简一下，但是看来差不多了。非常感谢大家！

user: user-3
content: int w(n)  改成：  int w(int n)

user: user-4
content: #include<stdio.h> #include<math.h> int w(int n) {  [size=18px]   int sum=1;     while(n>=10)     {         n=n/10;         sum++;     }     return sum; } int main(void) {     int money,hours,square;     scanf("%d %d",&money,&hours);     //square=(int)((float)money/hours+0.5)*(int)((float)money/hours+0.5);     square=(int)((float)money/hours+0.5);     square=square*square;          printf("%.2f\n%d\n%d\n",(float)money/hours,(int)((float)money/hours+0.5),w(square));     printf("%d %d %d\n",(square%1000)/100,(square%100)/10,square%10); }   不知道还能更简单？    [/size]
user-0 提问: 不允许指向不完整的类型

回复:
user: user-1
content: 使用tpyedef typedef struct Student{...}stu; 声明：stu *p1, *head, *p2; malloc：p1 = p2 = (stu*)malloc(LEN); 没有main函数  creat没有返回值

user: user-2
content: scanf的前3行

user: user-2
content: student拼写错误

user: user-3
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-4
content: struct Studnet *p1, *head, *p2;  改成：  struct Student *p1, *head, *p2;
user-0 提问: 在SVGA模式下，可以直接用graphics库中的函数么？

回复:
user: user-1
content: 下载一个EasyX，安装以后，用VC来编写图形程序，跟用BC编写图形程序差不多完全一样。

user: user-1
content: 引用 3 楼 tianxingkong 的回复:[quote=引用 2楼ooolinux 的回复:]楼主如果想用BC编写图形程序，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。  下载一个EasyX包，里面有完整的函数手册。EasyX官网有实例。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/在BC上运行，运行结果是，只适合C++...[/quote]  在BC上运行？还是在VC中使用EasyX？将源代码存为cpp文件就可以了。

user: user-0
content: 引用 1楼赵4老师 的回复:http://www.easyx.cn用BC运行显示只适合C++

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

user: user-0
content: 在BC上运行

user: user-0
content: 然后我下了一个头文件大全，然后又提示头文件有各种error

user: user-0
content: 引用 5楼ooolinux 的回复:[quote=引用 3 楼 tianxingkong 的回复:] [quote=引用 2楼ooolinux 的回复:]楼主如果想用BC编写图形程序，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。  下载一个EasyX包，里面有完整的函数手册。EasyX官网有实例。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/在BC上运行，运行结果是，只适合C++...[/quote]  在BC上运行？还是在VC中使用EasyX？将源代码存为cpp文件就可以了。[/quote]试了，结果就是缺少各种头文件...

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

user: user-2
content: http://www.easyx.cn
user-0 提问: 我想任意输如一个单词，然后反序输出。但是我只能自由输出4个字母。4个以上的就被截断了 ？？求解！！！！

回复:
user: user-1
content: ss数组是未初始化，相当于strlen定义。

user: user-2
content: 以上代码直接用就可以了.

user: user-2
content: #include<stdio.h> #include<string.h> int main(void) {        int N,index; char ss[30] = {0}; index=0;     N = 30; for(;index<=N;index++) { scanf("%c",&ss[index]);     if(ss[index] == '\n') break; }   printf("%c", '\n'); for(int i=index-1;i>=0;i--)  {	 printf("%c",ss[i]);  } printf("\n");	 return 0; }

user: user-3
content: 首先。你的ss数组没有初始化。。那个strlen的使用是未定义的。。其次。%c会把回车也读入。。你可以直接用%s直接输入字符串(更简单)。。然后在循环输出。。  望采纳。。

user: user-4
content: 引用 2 楼 ASSholeli的回复:这个问题我意识到了，但是我如果放在输入数组后面，又感觉不对。 检查输入的字符是不是\n判断是否输入完，而不是用长度去判断

user: user-0
content: 这个问题我意识到了，但是我如果放在输入数组后面，又感觉不对。

user: user-4
content: strlen 获取的是以\0结尾的字符串长度  你的ss还没有初始化就使用strlen是未定义行为
user-0 提问: gdb貌似会影响运行过程中eax的值，为何?

回复:
user: user-1
content: 要确认当前eip的值是在刚执行完printf函数之后。

user: user-2
content: printf 的返回值的含义参看：http://en.cppreference.com/w/c/io/fprintf
user-0 提问: 求解释这里的循环条件改成什么才能使用scanf进行输入。。急急急

回复:
user: user-1
content: #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct {     char ch[20]; } CHAR; int main() {     CHAR a[20]={0};     int n,i=0;     char ln[21];     while (1) {         printf("Enter word:");fflush(stdout);         rewind(stdin);         fgets(ln,21,stdin);         if (ln[0]=='\n') break;         sscanf(ln,"%s",&a[i].ch);         i++;         if (i>=20) break;     }     n=i;     for (i=0;i<n;i++) printf("%02d [%s]\n",i,a[i].ch);     return 0; }

user: user-1
content: #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct {     char ch[20]; } CHAR; int main() {     CHAR a[20]={0};     int n,i=0;     char ln[21];     while (1) {         printf("Enter word:");fflush(stdout);         fgets(ln,21,stdin);         if (ln[0]=='\n') break;         sscanf(ln,"%s",&a[i].ch);         i++;         if (i>=20) break;     }     n=i;     for (i=0;i<n;i++) printf("%02d [%s]\n",i,a[i].ch);     return 0; }

user: user-0
content: 引用 6 楼 赵4老师的回复:#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct {     char ch[20]; } CHAR; int main() {     CHAR a[20]={0};     int n,i=0;     char ln[21];     while (1) {         printf("Enter word:");fflush(stdout);         fgets(ln,21,stdin);         if (ln[0]=='\n') break;         sscanf(ln,"%s",&a[i].ch);         i++;         if (i>=20) break;     }     n=i;     for (i=0;i<n;i++) printf("%02d [%s]\n",i,a[i].ch);     return 0; }  请问可不可以就只改这里的循环条件？？这里用scanf的话直接按回车跳不出循环。。请老师指点下。。

user: user-0
content: 引用 4 楼 qq_15369501的回复:这个条件判断是出现首个字符为0时候么？不知道楼主想在什么样的条件下跳出循环，最后加一个i得长度限定，否则可能会越界 这个其实就是循环输入。。然后如果直接输入回车。。就跳出循环。。用gets()直接回车。。那个a[i-1].ch[0]可以初始化为0，但是scanf的话就不能用这个条件。。所以我才发的这个问题。。希望大神指点一下。。

user: user-2
content: 这个条件判断是出现首个字符为0时候么？不知道楼主想在什么样的条件下跳出循环，最后加一个i得长度限定，否则可能会越界

user: user-0
content: 引用 1 楼 user-3的回复:%s本来就是直接输入一整个字符串，而不是一个字符一个字符的输入  所以你完全可以不用循环，直接写成；  scanf("%s",a); 而且你似乎没看懂我这个程序这一部分的意思。。

user: user-0
content: 引用 1 楼 user-3的回复:%s本来就是直接输入一整个字符串，而不是一个字符一个字符的输入  所以你完全可以不用循环，直接写成；  scanf("%s",a); 我现在需要的不是说这个scanf怎么改。。而是这里我如果用这种形式进行输入的话。。这个循环条件该改成什么。。我也知道这里可以直接用gets()。。

user: user-3
content: %s本来就是直接输入一整个字符串，而不是一个字符一个字符的输入  所以你完全可以不用循环，直接写成；  scanf("%s",a);
user-0 提问: leetcode wrong answer但是输出结果是对的，是什么问题？

回复:
user: user-1
content: 结尾有没有多余空格或多余换行？有可能机器很严格

user: user-2
content: 我也出现过这种问题，感觉leetcode有点奇怪。。。

user: user-0
content: 不是啊，截图中的例子就会导致wrong answer，但是明显一样啊

user: user-3
content: 不要看一组数据的正误，你应该关注的是你的代码不能让所有测试输入得到正确输出。

user: user-4
content: 边界条件 输入输出格式 ……

user: user-0
content: 什么意思？可是output和expected是一样的
user-0 提问: 关于虚拟内存

回复:
user: user-1
content: 1、栈效率高的其中一个原因是很多指令是针对于栈专门设置的  2、应用层的程序不应该考虑申请这种内存

user: user-2
content: 引用 5 楼 bbsdgy 的回复:[quote=引用 1 楼 ID870177103 的回复:] 对于系统而言程序的栈没有特别意义，它也是从全局的堆上分配的 实际上你的程序根本不能直接访问物理内存，都是通过内存分页之类的系统访问的，否则一旦出现内存访问错误，整个系统都会崩溃 每个进程的内存地址都是虚拟的  栈如果也是从堆上分配的，为什么说栈的效率比堆的要高[/quote]  栈的内存直接用（只要不溢出），函数里面int a,b[10];就在栈里分配4个字节给a，40个字节给b。 堆内存是系统管理的，一块一块的空闲内存通过链表一样的数据结构被系统管理起来，当程序申请内存的时候，操作系统要找到一块合适大小的内存分配给它，根据算法不同，可能找到最小的但足够大小的内存来分配（缺点是分配以后剩余的内存空隙更小以后更不好使用），也可能找到一块比较大的内存来分配（这样这一块内存分割以后剩余的内存以后还能使用，但缺点是当程序后来申请很大的内存时可能无法找到足够大块的内存）。所以操作系统要权衡考虑这些问题（这样需要权衡的问题在操作系统中比比皆是，根本原因是因为资源是有限的，而用户对性能、响应、表现、可用性、可靠性的追求是无限的）。

user: user-3
content: 栈相对效率高的原因很容易知道啊，因为它已经分配了，而堆内存使用时才分配 考虑让内存无法移动是没有意义的，应用层程序就应该只做应用层的事情，如果你要做内核的东西，在这里找不到多少帮助的

user: user-0
content: 引用 7 楼 fefe82 的回复:[quote=引用 5 楼 bbsdgy 的回复:] [quote=引用 1 楼 ID870177103 的回复:] 对于系统而言程序的栈没有特别意义，它也是从全局的堆上分配的 实际上你的程序根本不能直接访问物理内存，都是通过内存分页之类的系统访问的，否则一旦出现内存访问错误，整个系统都会崩溃 每个进程的内存地址都是虚拟的  栈如果也是从堆上分配的，为什么说栈的效率比堆的要高[/quote]  此栈非彼栈，此堆非彼堆[/quote]  可以详细说一下吗，不是说访问栈内存比堆内存效率要高    引用 8 楼 fefe82 的回复:[quote=引用 楼主 bbsdgy 的回复:] 如果内存不够用，操作系统会把内存转到虚拟内存 那么对于一个程序： 1、是不是只有堆上申请的内存会被转移到虚拟内存，而栈上的不会 2、怎样让我程序申请的内存禁止被转移到虚拟内存  在现代操作系统上，你所有的内存都是虚拟的。  你所谓的“虚拟”，是不是指在硬盘上而不是物理内存中的？ 这个程序员一般无法控制。频繁访问的就会一直在屋里内存里。栈用的比较多，所以可能换出去的机会少。但是一样是可以换出去的。[/quote]  我指的虚拟内存是移到pagefile.sys中的，只讨论WINDOWS下的情况吧，正如楼上说的，任务管理器可以看到未分页内存，证明是可以申请这样的内存的，不过不知具体要怎么申请

user: user-4
content: 引用 楼主 bbsdgy 的回复:如果内存不够用，操作系统会把内存转到虚拟内存 那么对于一个程序： 1、是不是只有堆上申请的内存会被转移到虚拟内存，而栈上的不会 2、怎样让我程序申请的内存禁止被转移到虚拟内存  在现代操作系统上，你所有的内存都是虚拟的。  你所谓的“虚拟”，是不是指在硬盘上而不是物理内存中的？ 这个程序员一般无法控制。频繁访问的就会一直在屋里内存里。栈用的比较多，所以可能换出去的机会少。但是一样是可以换出去的。

user: user-4
content: 引用 5 楼 bbsdgy 的回复:[quote=引用 1 楼 ID870177103 的回复:] 对于系统而言程序的栈没有特别意义，它也是从全局的堆上分配的 实际上你的程序根本不能直接访问物理内存，都是通过内存分页之类的系统访问的，否则一旦出现内存访问错误，整个系统都会崩溃 每个进程的内存地址都是虚拟的  栈如果也是从堆上分配的，为什么说栈的效率比堆的要高[/quote]  此栈非彼栈，此堆非彼堆

user: user-0
content: 引用 4 楼 DelphiGuy 的回复:所有应用程序的内存和大部分操作系统内存都是可交换的，可以看一下任务管理器，即便内存使用几GB，未分页内存只有几十MB到一两百MB（依据系统的不同）。 要分配非分页内存可以使用ntoskrnl.exe中的MmAllocateNonCachedMemory  谢谢，我觉得你回答的很好，不过还想问下  这么说程序栈上的内存也会移到虚拟内存里？ 另外，怎么调用MmAllocateNonCachedMemory ，要包含什么头文件？

user: user-0
content: 引用 1 楼 ID870177103 的回复:对于系统而言程序的栈没有特别意义，它也是从全局的堆上分配的 实际上你的程序根本不能直接访问物理内存，都是通过内存分页之类的系统访问的，否则一旦出现内存访问错误，整个系统都会崩溃 每个进程的内存地址都是虚拟的  栈如果也是从堆上分配的，为什么说栈的效率比堆的要高

user: user-5
content: 所有应用程序的内存和大部分操作系统内存都是可交换的，可以看一下任务管理器，即便内存使用几GB，未分页内存只有几十MB到一两百MB（依据系统的不同）。 要分配非分页内存可以使用ntoskrnl.exe中的MmAllocateNonCachedMemory

user: user-1
content: 用GlobalAlloc申请的内存用GlobalLock锁定可能不会被移动

user: user-6
content: 这里涉及到了一个内存映射问题，每一个进程都会对应的分配一个虚拟内存空间，该虚拟内存通过内存映射机制映射到你的物理内存上去

user: user-3
content: 对于系统而言程序的栈没有特别意义，它也是从全局的堆上分配的 实际上你的程序根本不能直接访问物理内存，都是通过内存分页之类的系统访问的，否则一旦出现内存访问错误，整个系统都会崩溃 每个进程的内存地址都是虚拟的
user-0 提问: 函数返回值

回复:
user: user-1
content: 请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

user: user-2
content: 可以用matlab

user: user-3
content: 标准就这么规定的，C/C++函数返回值是通过寄存器EAX返回的，如果太多，没那么多寄存器存放  可以通过参数解决返回多个值，这样这些值是通过堆栈来返回的

user: user-4
content: 就如你所说，返回多个，那应该怎么声明？？？ 怎么接收？这样就不需要结构体之类的了，也不需要引用，指针，返回了。

user: user-5
content: 如果返回多个值得话  就不好声明吧

user: user-6
content: C++ 11  函数返回 std::pair类型，满足需求

user: user-7
content: 快学习python吧,满足你的需求.

user: user-8
content: 原因我觉得是多方面的 1.声明，使用麻烦。 2.函数调用本身就资源耗费大，多个返回值带来调用栈空间使用过多。 3.不适合对资源限制大的应用场景。 总的来说，与c++尽可能提高效率的设计原则不符。

user: user-9
content: 对于C++这种编译语言，返回多个值都不好声明，对于脚本语言来说这一点很好做到，在C++中可以用结构体和指针达到你的目的

user: user-10
content: 变参可以返回多个值。

user: user-11
content: 如果你确实需要返回多个数据，就选择使用结构体指针

user: user-12
content: 多个 可以返回结构体指针啊。

user: user-13
content: Python中看起来是可以直接返回多个，但其实内部还是做了封装，返回的是tuple，然后在接收处进行解开。 因此，如需效仿，可以返回一个数组指针、结构体、类都可以，但同样要进行结构拆除。  另外，可能最大的差异是C/C++是静态语言，Python是动态语言，因此数据细节部分需要更好规划才开始实现。

user: user-14
content: 语言之前本来就是有区别的。 能返回很多个值就显得封装性好了？
user-0 提问: 实在是看不出错误了，也设断点试过了，请大神们帮帮忙，谢谢

回复:
user: user-1
content: 尝试对空指针进行操作，就会出现这个错误。 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: double* RungeKutta(double IX, double EndX, double* IY, double h, void (*SlopeFunction)())  改成  double* RungeKutta(double IX, double EndX, double* IY, double h, void (*SlopeFunction)(double,double*,double* ))  至于你运行时的错误是因为你main函数中V1是NULL,你就去*V1 = *RungeKutta(IX, EndX, IY, h, SlopeFunction);  也就是没有为V1分配内存就使用V1了

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

user: user-0
content: 谢谢，受教了

user: user-2
content: double* RungeKutta(double IX, double EndX, double* IY, double h, void (*SlopeFunction)())  改成  double* RungeKutta(double IX, double EndX, double* IY, double h, void (*SlopeFunction)(double,double*,double* ))  引用 4 楼 lxq0228 的回复:谢谢一楼和三楼，受益匪浅！ 向你们学习，能告诉我怎么才能更好的学习和掌握C语言！  多看书、多思考、多实践

user: user-0
content: 谢谢一楼和三楼，受益匪浅！ 向你们学习，能告诉我怎么才能更好的学习和掌握C语言！

user: user-4
content: 首先同意一楼，另外，补充分析如下： 从main函数中来看，代码是希望通过函数指针形式调用，V1、V2、Y用于存储值。  1. 但*V1前V1值为NULL，此时去寻址该位内容，自然为非法，报错0xC0000005。 所以指针使用前最后进行if(ptr != NULL)的判断，以防出现该错误引起Crash。  2. 由于代码中SlopeFunction(）函数先于main函数定义，所以main函数第一句有点莫名其妙， 加入SlopeFunction()定义晚于main，正确的做法是在main函数前声明该原型即可，而不是main函数内  3. 最后补充一下，如无特殊必要（如需要获取函数指针，并做类型转换），建议直接使用函数调用。 毕竟函数指针的调用肯定是要慢于函数调用的，而且在代码可读性上也不如直接调用。
user-0 提问: 关于数据结构串操作求大神帮忙指出问题在哪~~

回复:
user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-0
content: debug调试，不是很熟悉，还在学；if (Strlength(T1) + Strlength(S2) < MAX_PATH)中的MAX_PATH这是写错的 ，是宏定义的MAX 我自己很乱 所以才让大神指点一下 我

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

user: user-0
content: 我用的是CODEblocks
user-0 提问: 帮忙看看这个C代码哪里有问题

回复:
user: user-1
content: strcpy_s 用错了，顺序反了。且你没有进行函数的声明。

user: user-2
content: 我来给个代码#include "stdafx.h" #include <stdlib.h> #include <string.h> char *getstra(){ char *bufa=(char*)malloc(sizeof(char)*100); strcpy(bufa,"abcdefg"); return bufa; } int main() { char *ssa=getstra(); printf("%d\n",*ssa); free(ssa); system("pause"); return 0; }

user: user-3
content: 缺函数声明 strcpy_s 用错了

user: user-4
content: char *ssa = getstra(); printf("%d\n", *ssa);  上面是字符串指针 下面的整型的输出转换符

user: user-5
content: 是顺序......

user: user-5
content: 函数前后放反了.

user: user-6
content: 这个起码是缺个函数声明

user: user-7
content: #include    <stdlib.h> char *getstra();   //首先这里要声明，这就是错误显示的原因 int main() {       char *ssa = getstra();     printf("%d\n", *ssa);     free(ssa);     system("pause");     return 0; }    char *getstra() {     char *bufa = malloc(sizeof(char) * 100);     strcpy_s(bufa,"abcdefg",10);              	//strcpy_s(bufa,10,"abcdefg");   //函数应该是这样     return bufa; }

user: user-8
content: strcpy_s参数顺序反了  需要在main前加上char *getstra();声明   #include <stdlib.h>  char *getstra(); int main() {  	char *ssa = getstra(); 	printf("%d\n", *ssa); 	free(ssa); 	system("pause"); 	return 0; }  char *getstra() { 	char *bufa = (char*)malloc(sizeof(char) * 100); 	strcpy_s(bufa, 100, "abcdefg"); 	return bufa; }

user: user-9
content: 是不是跟函数声明有关系？ 把char *getstra() ；函数实现或者声明放在main函数前面看看。 c中函数没有声明就调用，返回值默认是int，这样int赋值给 char *就出错了。
user-0 提问: 实在是看不出错误了，请大神们帮帮忙，谢谢

回复:
user: user-1
content: .。。有功夫截图，干嘛不贴代码，你这一大段，打起来都要半天。。。

user: user-2
content: 坐等不如自己去断点 单步 调试

user: user-0
content: 怎么没人啊，急

user: user-0
content: 坐等！！！！
user-0 提问: C语言，求解

回复:
user: user-1
content: 引用 4 楼 qq_36149968的回复:[quote=引用 1 楼 WZJwzj123456的回复:]首先定义一个min变量用来存储二维数组里的最小值，两个for循环让min和数组中的所有值比较，如果min的值大于数组里的值，就让min等于这个小的值，循环结束，就得到最小的值了 min=m不是等于12吗那么就有11个值比它小吗[/quote] min初始化赋值时等于m[0][0]是m数组的第一个数值， 另外m表示数组名，并不是等于12，12只是这个二维数组有12个值 if语句只是进行一个判断，如果min（当前保存的最小值）大于m[x][y]则说明min不是最小的值，要重新对min赋值

user: user-0
content: 引用 1 楼 WZJwzj123456的回复:首先定义一个min变量用来存储二维数组里的最小值，两个for循环让min和数组中的所有值比较，如果min的值大于数组里的值，就让min等于这个小的值，循环结束，就得到最小的值了 min=m不是等于12吗那么就有11个值比它小吗

user: user-1
content: 不是m等于12，m只是代表数组名，确切的说m是一个地址，这个地址指向数组的首地址，（数组首地址里存放的是数组的第一个元素，也就是12）min初始化时等于min=m[0][0];，是数组的第一个元素，初始化的时候min等于12 区分开m是数组名，是一个地址 min是一个变量，min=m[i][j]存放数组的某个数据的

user: user-2
content: #include <stdio.h> int main() {   int i,j;   int x,y;   int m[3][4]={{12,1,2,4},{2,3,4,5},{5,6,7,8}};   int min=m[0][0];               //假设m[0][0]是最小值，当然也可以假定数组中任意一个值   for(i=0;i<3;i++)               //接下来开始遍历数组，找出最小值 	  for(j=0;j<4;j++) 		  if(min>m[i][j])        //如果min (代表最小值，第一次为m[0][0]) 大于m[i][j]则代表min不是数组中的最小值 		  { 			  min=m[i][j];       //则m[i][j]为比较到目前为止的最小值，将其赋值给min，则下次比较则与现在的最小值比较 			  x=i;y=j;           //保留最小值的下标 		  }   printf("%d,%d,%d\n",min,x,y); }

user: user-0
content: 引用 6 楼 qq_36149968的回复:[quote=引用 5 楼 WZJwzj123456的回复:][quote=引用 4 楼 qq_36149968的回复:][quote=引用 1 楼 WZJwzj123456的回复:]首先定义一个min变量用来存储二维数组里的最小值，两个for循环让min和数组中的所有值比较，如果min的值大于数组里的值，就让min等于这个小的值，循环结束，就得到最小的值了 min=m不是等于12吗那么就有11个值比它小吗[/quote] min初始化赋值时等于m[0][0]是m数组的第一个数值， 另外m表示数组名，并不是等于12，12只是这个二维数组有12个值 if语句只是进行一个判断，如果min（当前保存的最小值）大于m[x][y]则说明min不是最小的值，要重新对min赋值[/quote] m是不是等于12[/quote] 就是画第一个圈圈的部分

user: user-0
content: 引用 5 楼 WZJwzj123456的回复:[quote=引用 4 楼 qq_36149968的回复:][quote=引用 1 楼 WZJwzj123456的回复:]首先定义一个min变量用来存储二维数组里的最小值，两个for循环让min和数组中的所有值比较，如果min的值大于数组里的值，就让min等于这个小的值，循环结束，就得到最小的值了 min=m不是等于12吗那么就有11个值比它小吗[/quote] min初始化赋值时等于m[0][0]是m数组的第一个数值， 另外m表示数组名，并不是等于12，12只是这个二维数组有12个值 if语句只是进行一个判断，如果min（当前保存的最小值）大于m[x][y]则说明min不是最小的值，要重新对min赋值[/quote] m是不是等于12

user: user-3
content: 定义了一个minl来储存最小的数，通过遍历完二维数组里面的所有数，如果这个数小于min那么就把这个数赋给min，以此类推就可以得到这个二维数组终数的最小值了。

user: user-4
content: 遍历数组中每个元素，如果那个元素的值比min还要小，就让min等于它的值，这样全部遍历之后min就是最小的了

user: user-1
content: 首先定义一个min变量用来存储二维数组里的最小值，两个for循环让min和数组中的所有值比较，如果min的值大于数组里的值，就让min等于这个小的值，循环结束，就得到最小的值了
user-0 提问: linux c 中的 fork 的子子进程怎么跟最上头的父进程通过 pipe沟通

回复:
user: user-1
content: 每个进程都有进程号，借助进程号就行了

user: user-2
content: 父进程A创建pipe，后面的子孙进程都可以通过那个pipe来跟A进程通信的。