Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求助，这个程序出现core dumped。

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

user: user-2
content: int PutDataIntoSource(char *p, DATA_SOURCE *source) {     char *buff, *buff1, *buff2;      buff=strtok(p, ",");     source->name = malloc(32);     if (!source->name) {         fprintf(stderr, "malloc error!\n");         return -1;     }     if (buff)         strcpy(source->name, buff);     buff1 = strtok(NULL,",");     if (buff1)         source.type = *buff1;     buff2=strtok(NULL, ",");     if (!buff2)         return -1;     if(source.type=='1')         strcpy(source.string_data,*buff2);     else         source.data = atof(buff2);     return 1; }  void main() {   char *data_input[2048];       GetProfileString("/home/tl/Desktop/reload/Settings.ini", "source", "1", data_input);     printf("%s\n",data_input);     PutDataIntoSource(data_input, &source[0]);     printf("%s\n",source[0].name);      return 0; } 对你的代码做了部分修改；要想通过参数带回想要的处理结果，需要传递变量地址进去。即形参要定义成传入传出参数； 另外，指针的理解和运用还是欠缺的，name是一个野指针，没有给其分配有效的内存空间，需要先分配。 buff,buff1,buff2，定义成128个指针（指针数组），就是对指针数组和字符数组的不理解。 建议多做练习，然后充分理解。

user: user-0
content: 谢谢各位大大，小弟我指针总是用不好，在指针方面我一定会多加练习！

user: user-3
content: char PutDataIntoSource(char *p,DATA_SOURCE source)，后面那个结构体参数不应该是值传递吧，是不是该改成传地址啊，其他的暂时没发现
user-0 提问: 指针复制二维数组

回复:
user: user-1
content: copy函数改成：  void copy(int (*arr)[COL],int (*arr1)[COL],int)  注意 * 的位置

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-3
content: void copy(int ( *arr)[COL],int ( *arr1)[COL],int); 指针数组和数组指针的问题； 指针数组，最终是数组，元素是指针； 数组指针，最终是指针，是指向数组的指针。对于二维数组，是指向一个长度为COL的数组。

user: user-4
content: int (*a)[3]和int *(a)[3]的区别，在做形参时，后者等价于int **a

user: user-5
content: void copy(int (*arr)[COL], int (*arr1)[COL], int row) // 指向数组的指针   原本你的 void copy(int *(arr)[COL],int *(arr1)[COL],int); // 指针数组，含有COL个元素

user: user-6
content: zhan ge keng，wan shang guo lai。

user: user-2
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-2
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组
user-0 提问: 用while 对数组赋初值会报错，用for 就不会，为什么呢？

回复:
user: user-1
content: 楼上说的都对

user: user-2
content: while(i>0) { p->Errors[i]=0.0;   printf("Errors[i] = %f\n\n" , p->Errors[i]); i--; }  不是while的问题，而是你的i--的位置有问题，比如你对i=5;初始化了，但是你输出的是i=4的值，但是I=4还没初始化呢，那么就是随机数。 while和for都是循环的，可以相互转化的； 所以这个不是while的问题，而是i--的位置问题了

user: user-3
content: 楼主把for循环也一起贴出来。 你的while循环，你是先赋值后面的，比如i初值为10:p->Errors[10]=0.0; 然后你i--了（也就是i=9此时），然后你输出p->Errors[9]当然可能是个随机值了

user: user-4
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。
user-0 提问: #请教#一个简单的循环竟然输出有误，是什么原因？

回复:
user: user-1
content: 首先，不要说循环问题就是简单，没有什么东西就是简单的。（好比武林高手可以用树叶来完成杀人的功能） 其次，先分析一下自己程序的需求，到底想干什么。（不要拿着锄头当打火机用，环境差别是很大的。如：你的程序中，用%f  打印整型，让看的人很不明白你到底要做什么）

user: user-2
content: %f  需要的是浮点数类型  你的是int，应该用 %d

user: user-3
content: count的类型与输出的格式不相符。

user: user-4
content: printf("count = %f\n" , count);应该是printf("count = %d\n" , count);

user: user-5
content: 看子函数吧！

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

user: user-7
content: 按理说你这第一个输出应该是0.0000，因为你是%f，所以输出小数。为什么输出2，要看你那个Pl_Calc函数了。
user-0 提问: while已经限制了p，为什么调试的时候还会走到NULL这一步

回复:
user: user-0
content: c->next==p  应该可以吧

user: user-0
content: 那应该用什么判定

user: user-1
content: dddddddd 不是NULL  你传建的时候 没有给next 赋值为 NULL 后面用NULL 检查不出来的
user-0 提问: 将i定义为全局变量，和定义为局部变量为什么差距这么大?

回复:
user: user-1
content: 这是生命周期决定的，局部变量的生命周期是函数内，从定义开始到函数结束就结束了。全局变量是从定义开始到程序退出。局部变量时函数内可见，而全局变量是整个程序里可见的。

user: user-2
content: 全局变量在.data区； 局部变量（除static修饰的静态局部变量和全局变量一样在.data区）在.stack区，且每个函数栈帧中各有一份。  抽空了解一下每句C/C++语句对应的汇编指令。

user: user-3
content: 局部变量就是每个人的钱包 全局变量就是公司账户 如果都随便花公司账户，这公司当然开不下去了。

user: user-4
content: 局部变量每次调用函数都不是同一个，全局变量则是同一个

user: user-5
content: 因为你函数有递归调用，如果是局部变量，每次调用的i都是相互独立的。 而如果是全局变量，则是同样的i

user: user-6
content: 为什么感觉这么憋屈，不知道要怎么跟你说呢。。大概是因为你的问题是“定义为全局变量，和定义为局部变量为什么差距这么大?”，而不是“全局变量和局部变量的区别是什么？”。  首先我想问你，你理解的全局变量，和局部变量，是什么样的一个区别？ 然后，你是否已经完全的理解了你这段代码的含义？ 你如果都理解正确，我觉得不应该还会有这样的疑问。  单纯的说下这个问题的原因： 如果你把 i 声明为全局变量，显然是不行的，你每次dfs调用都会改变 i 的值，那么返回到循环中后，其作为索引的意义就已经被破坏了。  吐槽一下。。 如果把你的例子来说明 全局变量和局部变量的区别，那给我的感觉就像是下面这样的场景： 说有一辆公交车，始发站时有n个人，到达第一站后上了2个人，下了1个人，到达第二站后，上了3个人下了2个人，…………（此处省略1千字），到达第m站，上了m+1个人，下了m个人。 当我读完题目，正要愉快的给出 车上还剩几个人的时候，结果问题却是，这辆公交车一共经过了几站。。。。。  不知道你有没有懂我想表达的意思。

user: user-7
content: 因为如果定义成局部变量，那每次调用dfs时，都会创建一个i，第一层中的i和第二层中的没关系 如果定义成全局的，每一层中的i都是同一个，这一层中i变了，下一层也会变化，所以下层中的循环会“提前”结束 如有问题欢迎继续追问，没问题请及时结贴，谢谢
user-0 提问: 没看懂代码

回复:
user: user-1
content: 帮忙结贴，拿分走人

user: user-2
content: 帮结贴

user: user-3
content: 结贴拿分走人。。。

user: user-4
content: 帮结贴

user: user-0
content: 对不起，我弄错了，不用解答了
user-0 提问: 为什么输出结果是1而不是8呢？代码没问题啊

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

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

user: user-3
content: 3楼是正确的。 y=3.0  while(3.0<0.0)是假，循环体不执行，所以直接返回1.0了。  改为 while(y > 0.0)  多说一句，这个power函数只能求整数次幂，所以y的类型改为int型和。其他类型求幂的运算库应该不是这么做的。

user: user-0
content: 改为int还是一样，while 判断条件不知道怎么改

user: user-4
content: while( y < 0 )    这里？这个判断条件下，循环体不会执行的

user: user-5
content: 你把y的类型改为int试试，double类型一般不进行--操作，而且与0比较用fabs(a-0)<0.00001这种形式，因为浮点数存在精度问题
user-0 提问: c语言指针函数问题求教

回复:
user: user-1
content: 函数名改为：char* PreBaeLinePro::GetRefSatPrnNew(char* str)

user: user-2
content: 放回的是char *类型，而函数定义的返回值是char PrebaseLinePro.

user: user-3
content: 你函数定义的是返回字符类型char，而你返回的是个字符指针，类型都不同

user: user-4
content: 引用 2 楼 jianwen0529 的回复:返回类型是char，然而你返回了char* 类型  改为 char* PreBase......  把你函数名前面的 * 提到类限定名称前面去

user: user-4
content: 返回类型是char，然而你返回了char* 类型  改为 char* PreBase......

user: user-5
content: 你返回的是字符指针啊！ 应该返回字符啊。

user: user-0
content: 求各位大神解答
user-0 提问: 基础问题

回复:
user: user-1
content: 在调试模式下运行程序，出错了可以会中断在出错代码，然后分析原因

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

user: user-3
content: 把你的代码复制粘贴到文本框里～

user: user-0
content: 我不知道要怎么发代码呀

user: user-0
content: 好吧，我知道了，谢谢你的鞭策

user: user-4
content: 无代码，无真相

user: user-0
content: 您能帮我看一看吗，因为我只是把老师给的代码改的非常少和小，但老师原来的代码可以完成输入和增加的功能

user: user-0
content: 谢谢

user: user-5
content: 这个运行时错误。 1.检查你的代码中是否存在数组大小不够的情况。 2.动态分配的内存大小是否足够大。 3.动态分配的内存有没有多次释放的情况。 4.对于指针有没有初始化；如果初始化了，指向的内存是否正确。这一步主要查看是否有对非法内存的写入或引用

user: user-0
content: 这是老师发的代码被我改了改就错了
user-0 提问: 求高手指点,初始化顺序表，内存有问题？

回复:
user: user-1
content: 官方说法是：  SIGSEGV --- Segment Fault. The possible cases of your encountering this error are:   1.buffer overflow --- usually caused by a pointer reference out of range.   2.stack overflow --- please keep in mind that the default stack size is 8192K.   3.illegal file access --- file operations are forbidden on our judge system.

user: user-0
content: 我的devc++编译器配置出错了，现在改好了，可以运行。在vs中把引用去掉也可以运行了。谢谢各位指点。

user: user-0
content: 引用 3 楼 xsklld的回复:status initlist(SqList* &L) // 这里的引用毫无意义，反而会使得诸如 initlist(&a) 这样的表达式无法通过编译 嗯嗯，以后会注意的，谢谢大神指出来

user: user-2
content: status initlist(SqList* &L) // 这里的引用毫无意义，反而会使得诸如 initlist(&a) 这样的表达式无法通过编译

user: user-0
content: 引用 1 楼 user-3的回复:程序我检查了一下 应该没错，这是我运行处的结果  难道是我用的编译器有问题？

user: user-3
content: 程序我检查了一下 应该没错，这是我运行处的结果
user-0 提问: UVA227puzzle问题

回复:
user: user-1
content: c[100]够么

user: user-2
content: 亦或使用fgets函数，这个函数会读取掉回车键，但是不保留在字符串中

user: user-2
content: gets(a[0]);不会读取回车键，所以你gets之后记得刷新缓冲流或者getchar()掉这个回车键  要不然你其他的读取到的一直会是空字符串

user: user-3
content: 看一下你的题目样例

user: user-0
content: 有人吗？？？？？
user-0 提问: 输出2000年到2500年中每一年是闰年还是非闰年的算法 

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

user: user-2
content: 把我的代码粘贴过去就行了，你以前的那个有的符号是用中文输入法输入的

user: user-0
content: 引用 1 楼 cyfcsd 的回复:兄弟，你算闰年的算法不对啊  #include <stdio.h>  int main() {     int y;     y=2000;     while (y<=2500){     if((y%4==0 && y%100!=0) || y%400==0)         printf("%d这一年是闰年\n",y);     else         printf("%d这一年不是闰年\n",y);     y=y+1;      }     return 0; }  如有疑问欢迎继续追问，如没问题请及时结贴，谢谢 引用 1 楼 cyfcsd 的回复:兄弟，你算闰年的算法不对啊  #include <stdio.h>  int main() {     int y;     y=2000;     while (y<=2500){     if((y%4==0 && y%100!=0) || y%400==0)         printf("%d这一年是闰年\n",y);     else         printf("%d这一年不是闰年\n",y);     y=y+1;      }     return 0; }  如有疑问欢迎继续追问，如没问题请及时结贴，谢谢  谢谢，已改正。只是执行时还是出现了问题。  F:\Dove\Documents\闰年.c	In function 'main': 6	3	F:\Dove\Documents\闰年.c	[Error] stray '\243' in program 6	3	F:\Dove\Documents\闰年.c	[Error] stray '\250' in program 6	30	F:\Dove\Documents\闰年.c	[Error] expected expression before '||' token 6	30	F:\Dove\Documents\闰年.c	[Error] stray '\243' in program 6	30	F:\Dove\Documents\闰年.c	[Error] stray '\250' in program 6	30	F:\Dove\Documents\闰年.c	[Error] stray '\243' in program 6	30	F:\Dove\Documents\闰年.c	[Error] stray '\251' in program 6	44	F:\Dove\Documents\闰年.c	[Error] expected statement before ')' token 8	4	F:\Dove\Documents\闰年.c	[Error] expected ';' before 'else'

user: user-2
content: 兄弟，你算闰年的算法不对啊  #include <stdio.h>  int main() {     int y;     y=2000;     while (y<=2500){     if((y%4==0 && y%100!=0) || y%400==0)         printf("%d这一年是闰年\n",y);     else         printf("%d这一年不是闰年\n",y);     y=y+1;      }     return 0; }  如有疑问欢迎继续追问，如没问题请及时结贴，谢谢
user-0 提问: 自加、自减运算符里，什么算整个表达式？

回复:
user: user-1
content: An expression is a sequence of operators and their operands, that specifies a computation.   http://en.cppreference.com/w/cpp/language/expressions

user: user-2
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-3
content: 表达式是表达式组成的  a是表达式  b是表达式  a+b也是表达式

user: user-4
content: 表达式，即可以理解成一个整体吧，可能在这个整理下还有进一步的运算；

user: user-5
content: 可以理解成三个表达式组成了一个大的表达式，计算规则和if-else语句是相同的，即先算表达式1，再算另一个需要执行的表达式，而不是全算完了再计算整体，且不执行的部分不会计算，这是一个比较特殊的情况，记住就好了，C语言里这种特殊情况挺多的 如不明白欢迎继续追问，如没问题请及时结贴，谢谢
user-0 提问: 2个双精度浮点数比较，是否该用DBL_EPSILON ？

回复:
user: user-1
content: 对于是否使用双精度的DBL_EPSILON，还要看你的需求吧；比如两个学生信息，在求平均成绩时，可能出现除不尽，在这种情况下，也没必要使用精度FLT_EPSILON，因为一般都会以小数点后两位为准。所以，是否需要要看我们需要的精度。 如果是要求高的科学计算，对于double类型的两个数据建议使用DBL_EPSILON比较，对于两个float类型的比较，就没必要使用DBL_EPSILON了， 因为两个数据本身都不会精确到双精度的精度。

user: user-2
content: 引用 2 楼 chouxiaoya8100 的回复:[quote=引用 1 楼 cyfcsd 的回复:]  DBL_EPSILON的就是用来表示最小误差的，因为浮点数存在精度的问题，这个你应该理解吧，所以前面那是用法是没问题的 后面那个它肯定不是等于0.000001的，你可以理解 DBL_EPSILON是系统能表示的一个最小的浮点数，所以肯定比0.000001更小，实际使用时也可以自己规定精度而不用 DBL_EPSILON，这个时候就可以用0.000001了  我怀疑你是不是理解错了： 怀疑的文字是：你可以理解 DBL_EPSILON是系统能表示的一个最小的浮点数，所以肯定比0.000001更小  注意颜色文字： 它只是一个误差值，是双精度浮点数比较的时候用的一个值，  但它应该不是你所的 “最小的双精度的浮点数吧”？   [/quote] 恩，它是一个精度，不是那个绝对意义上的最小浮点数（一个绝对值很大的负数）

user: user-0
content: 引用 1 楼 cyfcsd 的回复:DBL_EPSILON的就是用来表示最小误差的，因为浮点数存在精度的问题，这个你应该理解吧，所以前面那是用法是没问题的 后面那个它肯定不是等于0.000001的，你可以理解 DBL_EPSILON是系统能表示的一个最小的浮点数，所以肯定比0.000001更小，实际使用时也可以自己规定精度而不用 DBL_EPSILON，这个时候就可以用0.000001了  我怀疑你是不是理解错了： 怀疑的文字是：你可以理解 DBL_EPSILON是系统能表示的一个最小的浮点数，所以肯定比0.000001更小  注意颜色文字： 它只是一个误差值，是双精度浮点数比较的时候用的一个值，  但它应该不是你所的 “最小的双精度的浮点数吧”？

user: user-2
content: DBL_EPSILON的就是用来表示最小误差的，因为浮点数存在精度的问题，这个你应该理解吧，所以前面那是用法是没问题的 后面那个它肯定不是等于0.000001的，你可以理解 DBL_EPSILON是系统能表示的一个最小的浮点数，所以肯定比0.000001更小，实际使用时也可以自己规定精度而不用 DBL_EPSILON，这个时候就可以用0.000001了
user-0 提问: 右值为什么不能被赋值？

回复:
user: user-1
content: 可以这么想把，赋值运算符是从右到左运算的，3=a这个表达式就是把一个值赋给一个常量，这样肯定是与实际相违背的。

user: user-0
content: 感谢这么多人来回答，但是每个人的梗不一样；所以我只能把分给卡住我思路里梗的；多谢各位

user: user-2
content: 能赋值需要被赋值的数据在内存有空间，另外，被赋值的在内存的空间是需要有可写的权限的。 3 = a;3是常量，常量是只读的，没有可写的权限/ 内存的使用和划分是有规则的，要使用内存需要按照规则来做。否则，没法玩了。

user: user-3
content: The Intel 64 and IA-32 Architectures Software Developer's Manual

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

user: user-4
content: c = 5 // 把c赋值为5 a + c // 这里等效于 a+5  5=2 // 你给5 赋值为2  a+5 // 所以这里等效于 a+2 ????????

user: user-5
content: int a=1; 3=a;如果成功那么 printf( "%d",3);应该输出什么?

user: user-6
content: 引用 5 楼 wangfei8348 的回复:[quote=引用 3 楼 cyfcsd 的回复:] 应该说不能被赋值（修改）的值叫右值比较合适 右值有很多种 有的是不占用运行时的空间的，比如你说的那个3，它是放在代码中的，而代码区是不能修改的，之所以将其放入代码区，就是因为修改一个3的值是不符合常识的，所有也就不会符合语法了 还有一些是对应内存空间的，比如const变量，但由于程序设计的需求，要有一些不能被改变值得数，所有这些数据也不能被修改 内存和寄存器的区别，寄存器是在CPU内部，CPU取里面的数据很快，但这些东西造价很高，所以数量比较少，内存也是用来存数据的，放在内存条中，数量适中  变量会入栈，走寄存器；这个3不会入栈也不会走寄存器？ 寄存器里是不是可以只存一个数？[/quote] 3就在代码里，你得先了解一下程序在内存的分区情况，有代码区，全局数据区，堆区，栈区。。。 寄存器本来就是存一个数的，它只是可以对应程序里的一个变量

user: user-7
content: int a=3;  a是左值，3是右值 3能被赋值吗？

user: user-0
content: 引用 3 楼 cyfcsd 的回复:应该说不能被赋值（修改）的值叫右值比较合适 右值有很多种 有的是不占用运行时的空间的，比如你说的那个3，它是放在代码中的，而代码区是不能修改的，之所以将其放入代码区，就是因为修改一个3的值是不符合常识的，所有也就不会符合语法了 还有一些是对应内存空间的，比如const变量，但由于程序设计的需求，要有一些不能被改变值得数，所有这些数据也不能被修改 内存和寄存器的区别，寄存器是在CPU内部，CPU取里面的数据很快，但这些东西造价很高，所以数量比较少，内存也是用来存数据的，放在内存条中，数量适中  变量会入栈，走寄存器；这个3不会入栈也不会走寄存器？ 寄存器里是不是可以只存一个数？

user: user-0
content: 引用 1 楼 kkil001 的回复:可以被赋值啊，把内存中的数据3移到寄存器，然后呢？寄存器中的值没地址，你用C++找不到它，但你可以用汇编语言把特定寄存器里的值再刷到内存里  但这跟赋值有什么关系呢？不懂

user: user-8
content: 1、如果可以赋值! 2、源程序最终还是要生成为机器码来执行 在这个前提下  a =3 ; 3=a； 对于=岂不是要有两套生成规则，编译器如何区分?

user: user-9
content: 所以如果可以3=a，你是想干什么呢？把a赋值给3？有什么意义？

user: user-10
content: 因为右值可能只是临时变量或者是常量

user: user-11
content: 可以被赋值啊，把内存中的数据3移到寄存器，然后呢？寄存器中的值没地址，你用C++找不到它，但你可以用汇编语言把特定寄存器里的值再刷到内存里

user: user-6
content: 应该说不能被赋值（修改）的值叫右值比较合适 右值有很多种 有的是不占用运行时的空间的，比如你说的那个3，它是放在代码中的，而代码区是不能修改的，之所以将其放入代码区，就是因为修改一个3的值是不符合常识的，所有也就不会符合语法了 还有一些是对应内存空间的，比如const变量，但由于程序设计的需求，要有一些不能被改变值得数，所有这些数据也不能被修改 内存和寄存器的区别，寄存器是在CPU内部，CPU取里面的数据很快，但这些东西造价很高，所以数量比较少，内存也是用来存数据的，放在内存条中，数量适中

user: user-12
content: 你需要知道语法啊，不能说你想用就用，赋值运算符左边必须是变量
user-0 提问: 指针

回复:
user: user-1
content: 引用 2 楼 kkil001 的回复:只要是指针，都能用数组 int* p; p[5];  // 指针往高地址移动5个int的大小，即20个字节 int *p; p=(int *)malloc(5*sizeof(int));

user: user-0
content: 引用 4 楼 幻夢之葉的回复:我建议楼主先去看基础知识 没书可看，老师让到大学再说。。。

user: user-2
content: 我建议楼主先去看基础知识

user: user-3
content: 引用 2 楼 kkil001 的回复:只要是指针，都能用数组 int* p; p[5];  // 指针往高地址移动5个int的大小，即20个字节 未定义行为

user: user-4
content: 只要是指针，都能用数组 int* p; p[5];  // 指针往高地址移动5个int的大小，即20个字节

user: user-5
content: 只要指向有效内存的指针,且符合变量类型的,都可以,如 int *p; p=(int *)malloc(5*sizeof(int)); 这个p就相当于p[5]; 语法上,除void的及指向函数的指针,都可以用数组下标的
user-0 提问: 这是一道题，里面有题解，但是看不懂，希望大家能帮帮忙

回复:
user: user-0
content: 那个分情况的我看不懂，想问一下大家可以给我讲解一下吗？谢谢了！

user: user-0

user: user-0
content: 接下来发一下题解
user-0 提问: 基础知识

回复:
user: user-1
content: ""空字符串也是字符串。

user: user-2
content: 判断num字符串是不是等于"0"  如果相等，strcmp将会返回0

user: user-0
content: 引用 1 楼 飘逝的回复:没啥特别的意思，就是一个字符串，这个字符串就一个字符0 一个字符也可以用双引号呀，谢谢大佬

user: user-3
content: 没啥特别的意思，就是一个字符串，这个字符串就一个字符0
user-0 提问: 关于EOF 用法的小问题

回复:
user: user-1
content: http://blog.csdn.net/gd1985/article/details/2452698

user: user-2
content: 楼上说的对, 加句setvbuf(stdin, NULL, _IONBF, 0);改成无缓冲就可以在同一行输入ctrl-z

user: user-3
content: #include<stdio.h> #include<ctype.h>  int main() {     int u=0,l=0;     int ch;    /*EOF is -1,should use int */      printf("get your intput:");     while((ch=getchar())!=EOF)     {         if(isupper(ch))             u++;         else             l++;     }     printf("D:%d X:%d\n",u,l);     return 0; } ch类型应该使用int类型； 缓存分为：行缓冲，全缓冲和无缓冲； 1、全缓冲 。全缓冲指的是系统在填满标准IO缓冲区之后才进行实际的IO操作；注意，对于驻留在磁盘上的文件来说通常是由标准IO库实施全缓冲。 2、行缓冲 。在这种情况下，标准IO在输入和输出中遇到换行符时执行IO操作；注意，当流涉及终端的时候，通常使用的是行缓冲。 3、无缓冲 。无缓冲指的是标准IO库不对字符进行缓冲存储；注意，标准出错流stderr通常是无缓冲的。

user: user-4
content: Linux：Ctrl+D Windows：Enter、Ctrl+Z、Enter

user: user-5
content: 这貌似是个老难题了，楼主可以看看http://bbs.csdn.net/topics/310129688 顺便帮你@zhao4zhong1

user: user-6
content: 应该是缓冲区机制的问题，输入数据一般存在缓冲区里 ，出现回车时统一把数据传入程序，固在你回车之前数据没有传入程序，要想程序即时读取缓冲区数据，可以使用fflush函数，具体情况谷歌或百度fflush(stdin)

user: user-0
content: 引用 1 楼 jianwen0529 的回复:输入EOF之后结束循环，然后再打印语句，没什么毛病您好！我的意思是第一图为什么在abcEF之后用ctrl+z 不显示结果呢？  而一定是要在下一行用ctrl+z才显示。

user: user-7
content: 输入EOF之后结束循环，然后再打印语句，没什么毛病
user-0 提问: 请教一下关于用指针给三个数字排序的问题，谢谢大家~

回复:
user: user-0
content: 谢谢楼上各位的讲解~

user: user-1
content: #include <stdio.h>  void swap(int *a,int *b){     int temp;     temp=*a;     *a=*b;     *b=temp; }  int main(){     int a,b,c;     int *p1,*p2,*p3;      p1=&a;     p2=&b;     p3=&c;      scanf("%d%d%d",&a,&b,&c); #if 0     if(a>b)         swap(&a, &b);     if(a>c)         swap(&a, &c);     if(b>c)         swap(&b, &c); #else     p1 = &a;     p2 = &b;     if(a>b)         swap(p1, p2);     p1 = &a;     p3 = &c;     if(a>c)         swap(p1, p3);     p2 = &b;     p3 = &c;     if(b>c)         swap(p2, p3);  #endif      printf("%d %d %d",*p1,*p2,*p3);     return 0; } 以上的朋友给你方法也是可以；我的方法是swap函数不变，注意下swap里，指针指向的内存空间没变，但是指向的内存空间里的值变了，加入输入了4, 3, 5三个值，p1指向的内存空间存放的是4，p2指向的内存空间存放的是3，同理p3是5；通过第一个swap，p1指向的内存空间变成了3，p2指向的内存空间变成了4，即现在p1指向a的值已经变了，p2指向的b也变了。在swap外，重新对p1和p2进行地址赋值。就类似楼上的朋友那样改变指针指向。

user: user-2
content: #2和#3的写法并不能改变你指针的指向（因为实参和形参不是同一个指针，他们只是指向同一块内存区域而已） 要在函数内改变指针的指向，必须传二级指针或者一级指针的引用才行

user: user-3
content: swap(int *p1,int *p2) {        int *temp=NULL;        temp=p1;       p1=p2;       p2=temp; }兄弟

user: user-4
content: swap(int *p1,int *p2) {        int *temp=NULL;        temp=p1;       p1=p2;       p2=temp; } 这样才是改变指针的指向，刚写错。

user: user-4
content: swap(int *p1,int *p2) {        int *temp=NULL;        temp=p1;       p1=p2;       p2=p1; } 这样才是改变指针的指向。

user: user-4
content: 首先swap并没有改变指针的指向，而是改变指针指向内部保存的值。比如变量p1=0x11,0x11保存的5,，p2=0x12,0x12保存的是4，通过swap后0x11保存的4,0x12保存的5。指针的指向并没有改变，即a=4,b=5,p1=&a，p2=&b。
user-0 提问: 关于typedef struct 中用法的一点小疑问

回复:
user: user-1
content: 两个类型，一个是结构体类型，一个是结构体指针类型。一般在重命名结构体类型时，两个都会重命名。

user: user-2
content: 前者node表示该结构体  后者node表示该结构体类型的指针

user: user-3
content: 参考typedef int INTEGER和typedef int* INTEGER 前者是结构体类型别名，后面结构体指针类型别名

user: user-4
content: 第一个 node 是结构类型 第二个 node 是指针类型
user-0 提问: 求解int转补码和浮点数程序的解释

回复:
user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-2
content: 就是对int float double 三个类型的数，从高位到低位打印出来  temp = temp >> (31 - i) //从高到低取每一bit; int t = temp & 1; // & 1，主要是剔除补位时候的符号位，即最高位   c = ((unsigned int*)a)[0]; //强制转为unsigned int*类型     for (int i = 0; i<32; i++){         str[31 - i] = (char)(c & 1) + '0'; //取每一位的值（从最低位到最高位）得出0,1值，最后 + ‘0’字符的ASCII编码，即转为字符 ‘0’ 或者 ‘1’         c >>= 1; //左移，另下一个较高位置的bit 转到最低位的位置     }

user: user-0
content: 引用 1 楼 user-3 的回复:没有转，只是把那些数的二进制表示打印出来了 那请问程序的大概每一步的意义是什么呢？

user: user-3
content: 没有转，只是把那些数的二进制表示打印出来了
user-0 提问: printf打印指针所指的内容，出错，

回复:
user: user-1
content: 使用生命周期结束的变量是未定义行为

user: user-2
content: 引用 3 楼 qq423399099 的回复:使用生命周期结束的变量是未定义行为 还炫已经宣布分手的女票也是未定义行为。

user: user-0
content: 哦哦，明白了，怪不得把str[10]变成全局变量就可以了，，，

user: user-3
content: tochar函数中的局部变量数组str[10]，在该函数返回后，占有的空间已经被释放。调用printf函数时很可能把那个位置的存储单元又用了。所以里面存储的东西已经不是上次存入的了。可以把它写成 static char str[10]; 就长期保存了。或者使用 malloc 分配也可以，挪到所有函数外面也行
user-0 提问: m的n次方高效算法求解

回复:
user: user-1
content: 百度百科：快速幂。 传送门：http://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E5%B9%82?fr=aladdin

user: user-2
content: 引用 3 楼 jianwen0529 的回复:[quote=引用 1 楼 cyfcsd 的回复:] 注意别溢出了 code=c]#include <stdio.h>  int power(int p, int n) {     if(n == 1){         return p;     }     else{         int tmp = power(p, n/2);         if(n%2 == 0){             return tmp*tmp;         }        else{             return tmp*tmp*p;         }     } } int main() {     printf("%d\n", power(2, 10));     return 0; }[/code]  乘法次数感觉并没有变少[/quote] 应该是减少了吧，算法复杂度降低为O（log2N)了，楼主可百度快速幂

user: user-3
content: double PowX(double x,int m) { 	if (m==0) 	{ 		return 1; 	} 	if (m==1) 	{ 		return x; 	} 	if (m==2) 	{ 		return x*x; 	}  	int n=m>>1; 	double x1=PowX(x,n);  	if (n<<1==m) 	{ 		return x1*x1; 	} 	else 	{ 		return x1*x1*x;  	} }

user: user-4
content: 引用 1 楼 cyfcsd 的回复:注意别溢出了 code=c]#include <stdio.h>  int power(int p, int n) {     if(n == 1){         return p;     }     else{         int tmp = power(p, n/2);         if(n%2 == 0){             return tmp*tmp;         }        else{             return tmp*tmp*p;         }     } } int main() {     printf("%d\n", power(2, 10));     return 0; }[/code]  乘法次数感觉并没有变少

user: user-5
content: 1楼使用的是快速幂算法吧。

user: user-2
content: 注意别溢出了 code=c]#include <stdio.h>  int power(int p, int n) {     if(n == 1){         return p;     }     else{         int tmp = power(p, n/2);         if(n%2 == 0){             return tmp*tmp;         }        else{             return tmp*tmp*p;         }     } } int main() {     printf("%d\n", power(2, 10));     return 0; }[/code]
user-0 提问: 输出结果不正确，找不到错误

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:注意float 用 %f /*printf("ans is %d!",ans); */ printf("ans is %f!",ans);谢谢这么简单我都没有找到

user: user-1
content: 注意float 用 %f /*printf("ans is %d!",ans); */ printf("ans is %f!",ans);
user-0 提问: 遇到一个书上的错误，c语言实例，在算到float类型，会出现 24.0+25.6=49.599998  这样的错误， 这是怎么回事？

回复:
user: user-1
content: http://www.cnblogs.com/wuyuan2011woaini/p/4105765.html

user: user-2
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-3
content: float大概也就6~7的精度，数据一旦超出这个范围， 出现很小的差别是正常的， 如果对于计算精度要求较高，换double， 能保证精确到15位左右

user: user-4
content: 精度问题而已，不是错误。

user: user-5
content: 这个不是错误，是10进制转二进制的固有误差，浮点数转换为2进制，小数部分大都会有截断误差，0.6是不能精确表示的

user: user-6
content: 浮点数本来就是不精确的， 如果你学习了浮点数在计算机中的表示，你就知道了！ 可以百度一下

user: user-7
content: 浮点数本身就有精度误差的问题，很多十进制的小数并不能用二进制精确表示，必要时你可进行四舍五入

user: user-8
content: 百度： 浮点数精度问题

user: user-9
content: 数据精度问题  有些数不能被精确表示  https://people.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF
user-0 提问: 这是电脑算不出来了吗

回复:
user: user-0
content: 长知识了，谢谢大家

user: user-1
content: 递归对于大数据，深层次的不停的操作，效率很低。因为从第一个函数栈里出来在进入一个函数栈，理论上应该把上一个函数栈释放，但是递归是不能的，因为它还要回退到第一调用离开的地方继续向后执行。深层次的递归会导致函数栈紧张，效率不高。 能用递归完成的，用循环一样可以完成。再说CPU处理循环是很快的，建议对于大数据使用循环做。

user: user-2
content: 引用 3 楼 xh_acmagic 的回复:电脑能算出来了，只是需要时间 我估算了下,至少要9年

user: user-3
content: 递归函数本来就效率低。套的太深就很慢了

user: user-2
content: 当输入为3,调用子函数1+1 = 2次 当输入为4,调用子函数1+2 = 3次 当输入为5,调用子函数2+3=5次 当为n时,是fibnacci(n)次 100时,是354224848179261915075次 约等于是354224848179261915K次 约等于是354224848179261M次 约等于是354224848179G次 约等于是354224848KG次 一般CPU频率是GHz级别,就算是1000GHz,每个时钟周期调用一个函数, 则需要354224848秒 一天才86400秒,就算它100000秒 则需要3542天, 一年才365天,则大概要9年 见http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html

user: user-4
content: 电脑能算出来了，只是需要时间

user: user-5
content: 递归深度越深,效率越低.

user: user-2
content: 是时间复杂度太大了
user-0 提问: win32 c语言编程

回复:
user: user-1
content: 用 C 调用 Windows API 可以很实现图形化界面。只是对于 C 语言新手来说这件事有点难度。

user: user-2
content: #include <stdio.h> #include <windows.h> FILE *f; int main() {     f=fopen("tmp.vbs","w");     fprintf(f,         "Dim Input,psw\n"         "do\n"         "Input = InputBox(\"输入名字:\",\"游戏\")\n"         "psw = InputBox(\"输入密码:\",\"游戏\")\n"         "if psw=\"123456\" then\n"         "MsgBox (\"开始游戏……\"):exit do\n"         "else\n"         "MsgBox (\"密码错误！\")\n"         "end if\n"         "loop\n"     );     fclose(f);     WinExec("cmd /c tmp.vbs",SW_HIDE);     return 0; }

user: user-3
content: 跨度有点大啊

user: user-4
content: 这个问题有点大

user: user-5
content: 引用 楼主 m0_37640648 的回复:各位大神，小弟初学c语言，请教如何用win32 编写一个游戏界面的登录程序 初学建议先学点基础知识， 一下子就做UI处理，曲线有点陡呀

user: user-6
content: 图形用户界面可以学习C++ Builder，架构先进，入门比较容易。  C++ Builder的较新版本——RAD Studio XE3以上版本添加对iOS和Android的支持工具包，让开发者编写的Delphi/C++应用可以同时在Windows、OS X、iOS和Android平台上运行。现在最新版本是RAD Studio 10.1。  仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ C++ Builder绘图示例（模拟时钟） http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/  C++ Builder写的《ZEC 纸牌游戏21点》 http://blog.163.com/tab_98/blog/static/119240972016115113039304/ C++ Builder写的《ZEC 僵尸版打地鼠》 http://blog.163.com/tab_98/blog/static/11924097201601084117748/ C++ Builder写的《ZEC 推箱子》 http://blog.163.com/tab_98/blog/static/11924097201612011839642/  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社） 《C++Builder6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。

user: user-6
content: C++ Builder带倒计时的游戏启动界面  http://blog.163.com/tab_98/blog/static/1192409720167453316837/

user: user-7
content: mfc或者Qt或者WPF
user-0 提问: 关于int i=3,j=0;j=(++i)+(++i)+(++i);的问题

回复:
user: user-1
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-2
content: 标准说，这种东西结果是多少都可以。编译器甚至不需要保证两次运行的一致性。  或者说，这是一个错误的程序，但是编译器不需要给出提示。

user: user-3
content: 不要把生命浪费在毫无意义的事情上，现实中根本不会出现这种代码。

user: user-4
content: 如果分不清出优先级，建议你按照自己的需要，将像这样表达式分开写，或者加上括号，区分其优先级。 如果，单纯想实验，不建议把精力花在这上面，不建议写很容易引起歧义的表达式，自己看不懂的代码不要去写；

user: user-5
content: 精品文章][小呆科普贴] 被遗忘的关键字>>>点击查看 http://www.zixue7.com/forum.php?mod=viewthread&tid=27277

user: user-6
content: 不要把时间浪费在这种问题上。没有意义。现实代码中不会有这样的代码的

user: user-7
content: 写这种代码的都被打死了

user: user-8
content: 事实上不会去写这种代码，编译器不同结果也不同，这是代码大忌

user: user-9
content: 楼主是有多无聊。 只要搞懂前++和后++就可以了，再懂一些常用的优先级，这种依赖编译器行为的东西有意思？
user-0 提问: c语言如何用链表实现多态？

回复:
user: user-1
content: 引用 3 楼 luolan_hust 的回复:[quote=引用 2 楼 jianwen0529 的回复:] C++才有类，基类，继承，多态的概念！  最常规的  class WorkerBase { public:     WorkerBase();     WorkerBase(int id, std::string &name);     ~WorkerBase();      virtual float CalWage(); private:     int m_id;     float m_wage;     std::string m_name; };  class SaleWorker : public WorkerBase { public:     virtual float CalWage(); };  class TeckWorker : public WorkerBase { public:     virtual float CalWage(); };没有用链表，这个是我要问的关键，c++这个我会写[/quote]  链表这个不是更基础的东西吗  struct { WorkerBase *p; WorkerBase *next; }  然后创建就把它们加入链表，然后加入必要的操作函数即可 比如遍历计算工资 while(base) { base->CalWage(); base = base->next; }

user: user-0
content: 引用 2 楼 jianwen0529 的回复:C++才有类，基类，继承，多态的概念！  最常规的  class WorkerBase { public:     WorkerBase();     WorkerBase(int id, std::string &name);     ~WorkerBase();      virtual float CalWage(); private:     int m_id;     float m_wage;     std::string m_name; };  class SaleWorker : public WorkerBase { public:     virtual float CalWage(); };  class TeckWorker : public WorkerBase { public:     virtual float CalWage(); };没有用链表，这个是我要问的关键，c++这个我会写

user: user-1
content: C++才有类，基类，继承，多态的概念！  最常规的  class WorkerBase { public:     WorkerBase();     WorkerBase(int id, std::string &name);     ~WorkerBase();      virtual float CalWage(); private:     int m_id;     float m_wage;     std::string m_name; };  class SaleWorker : public WorkerBase { public:     virtual float CalWage(); };  class TeckWorker : public WorkerBase { public:     virtual float CalWage(); };

user: user-0
content: 新手正在学习数据结构，求大神教我一下，带我一下，不胜感激~
user-0 提问: C语言问题之读取文件操作

回复:
user: user-0
content: 引用 3 楼 user-1 的回复: 	double a[] = { 1.2, 2, 3, 4, 5 };  	FILE *p; 	p = fopen("aa.bin", "wb"); 	if (p == NULL) 		printf("打开失败"); 	else { 		fwrite(a, sizeof(double), 5, p); 		fclose(p); 	} 	FILE *b; 	b = fopen("aa.bin", "rb"); // 这里分开写，if(b=fopen("aa.bin","rb")==NULL)的话，编译器先算的是fopen("aa.bin","rb")==NULL 	if (b == NULL) 		printf("打开失败"); 	else { 		int i; 		double d[5]; 		fread(d, sizeof(double), 5, b); 		for (i = 0; i < 5; i++) 			printf("-%f", d[i]); 	} 想当然的以为=的运算优先级更高了，谢啦

user: user-0
content: 引用 2 楼 user-1 的回复: for (int i = 0; i < 5; i++)     fwrite(&a,sizeof(double), 1, p);  并没有任何效果，ps:[i]fwrite和fread本身就是为数组准备的

user: user-1
content: double a[] = { 1.2, 2, 3, 4, 5 };  	FILE *p; 	p = fopen("aa.bin", "wb"); 	if (p == NULL) 		printf("打开失败"); 	else { 		fwrite(a, sizeof(double), 5, p); 		fclose(p); 	} 	FILE *b; 	b = fopen("aa.bin", "rb"); // 这里分开写，if(b=fopen("aa.bin","rb")==NULL)的话，编译器先算的是fopen("aa.bin","rb")==NULL 	if (b == NULL) 		printf("打开失败"); 	else { 		int i; 		double d[5]; 		fread(d, sizeof(double), 5, b); 		for (i = 0; i < 5; i++) 			printf("-%f", d[i]); 	}

user: user-1
content: for (int i = 0; i < 5; i++)     fwrite(&a[i],sizeof(double), 1, p);

user: user-1
user-0 提问: 指针问题求解

回复:
user: user-1
content: 书看千行不如手敲一行！ 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。

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

user: user-3
content: & 取地址操作符 * 指针：表示对指针进行解引用操作，也就是获得指针指向的对象。 *p=24,表示将p指向的对象的值修改成了24（之前a=12） ptr=&p;表示让ptr指向了p（指针的指针） *ptr=&b;   // *ptr就是p，也就是让p指向了b **ptr=34;   // 相当于把b改成了34

user: user-0
content: 引用 1楼user-4 的回复:书上的意思说用指针p给a赋值为24，不是说它等于24 后面的书上说的都比较清楚了，就是指针跟二级指针的基本使用方法 书不错，道理讲的比较明白，多做题，增加一些感性认识就可以了原来是这样，谢谢

user: user-4
content: 书上的意思说用指针p给a赋值为24，不是说它等于24 后面的书上说的都比较清楚了，就是指针跟二级指针的基本使用方法 书不错，道理讲的比较明白，多做题，增加一些感性认识就可以了
user-0 提问: vc6安装问题

回复:
user: user-1
content: VC6可以用虚拟机去跑，建议换成VS: http://blog.csdn.net/cometnet/article/details/19551125

user: user-2
content: FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn

user: user-3
content: 安装虚拟机装个Xp系统，然后装vc 6.0 就行了

user: user-4
content: VC6太老了，建议用VS吧，如果仍要用，在虚拟机里安装吧

user: user-5
content: 因为vc6.0太老了，win10已经不支持了，你还是用新一点的vs13，vs15什么的吧
user-0 提问: Visual C++6.0编译调试通过不能运行是哪里出了问题？

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

user: user-2
content: 此外，printf("result:\n",compt(a));  改成；  printf("result:%d\n",compt(a));

user: user-2
content: return tmp+compt(a--);  改成：  return tmp+compt(--a);  否则每次递归a的值都是一样的

user: user-3
content: 你可以把求阶乘和求和分别写成函数。 #include <stdio.h> int Jiecheng(int n)   {       int tmp;       if(n==1)        return tmp=1;       else        return tmp=n*Jiecheng(n-1);    }  int  jia(int n) {     int i;     int s=0;     for(i=1;i<=n;i++)         s=s+Jiecheng(i);     return s; }   main (){   int i,j;   printf("请输入一个整数x\n");   scanf("%d",&i);   j=jia(i);   if(j>0)    printf("x个阶乘的和为：%d",j);   else   printf("error");    } 这是我写的，互相学习下
user-0 提问: Visual C++6.0编译调试通过不能运行是哪里出了问题？

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

user: user-2
content: 又是++  --  这种东西惹的货 建议, 这种语句单独放一行执行,  并且不要做为函数参数.   这样就不会有问题了.  除非, 你能非常清楚的区分++, --放到什么位置, 有什么样的结果.

user: user-3
content: #include<stdio.h> int compt(int a); void main() { int a; scanf("%d",&a); printf("result:%d\n",compt(a)); } int compt(int a) { if(a==1) return 1; int i=1; int tmp=1; for(;i<=a;i++) { tmp*=i; } return tmp+compt(a-1); }

user: user-4
content: 此外，printf("result:\n",compt(a));  改成；  printf("result:%d\n",compt(a));

user: user-4
content: return tmp+compt(a--);  改成：  return tmp+compt(--a);  否则每次递归a的值都是一样的

user: user-5
content: 把a--改成--a试试，你一直以相同的参数调用这个函数，肯定会堆栈溢出的
user-0 提问:  新手一枚 qsort 无法结束输出 应该还有很多错 求助

回复:
user: user-1
content: 如果按照字母顺序排序，建议使用： return strcasecmp((char *)a, (char *)b);;不区分大写。

user: user-1
content: 字符串比较建议使用库函数，qsort不能执行完，是因为参数有问题。以下是可以执行的代码。 #include<stdio.h> #include<stdlib.h> int cmp(const void*a,const void*b) {     return strcmp((char *)a, (char *)b); }  void sort(char (*pstr)[21], int count) {     qsort(pstr, count, sizeof(pstr[0]), cmp); }  int main() {     int i;     int p[26];     char s[27];     int count,j;     char str[128];     char a[100][21]; #if 0     while(scanf("%s\n",s)!=EOF)     {         for(i=0;i<26;i++)             p[s[i]-'A']=i;     } #endif     fgets(str, 128, stdin);     str[strlen(str)-1] = 0;     count=0;i=0;     while(1)     {         j=0;         while(str[i]!=' ' && str[i])    /* '\0' is equal 0 */             a[count][j++]=str[i++];         a[count][j] = 0;         count++;         if(!str[i])             break;         else             i++;     }     //qsort(a, count, sizeof(a[0]), cmp);     sort(a, count);     for(i = 0; i < count-1; i++)     {         printf("%s ",a[i]);     }     printf("%s\n",a[i]);     return 0; }

user: user-0
content: Description   给定一组以一个空格分隔的只含大小写字母的字符串。与普通字典序不同，按照给定的字母顺序对这组字符串排序。设两个字符串的字母不会完全相同。如：Hat、hat、HAt等不会同时出现。 例如：字母顺序为QWERTYUIOPASDFGHJKLZXCVBNM时，一组字符串 hat cat bat book bookworm Dallas Austin Houston fire firefox fumble的排序结果为：Austin Dallas fumble fire firefox Houston hat cat book bookworm bat。  Input   每组数据由2行组成，第1行为字母顺序（26个大写字母），第2行是需要排序的一组字符串（只含大小写字母，长度不大于20）。 数据不多于100组。需要排序的一组字符串中包含的字符串个数至少1个，至多100个。  Output   对于每一组数据，输出排序后的字符串。字符串之间输出一个空格，最后一个字符串后面没有空格，而是输出一个换行符。  Sample Input   QWERTYUIOPASDFGHJKLZXCVBNM hat cat bat book bookworm Dallas Austin Houston fire firefox fumble QWERTYUIOPASDFGHJKLZXCVBNM How are you QAZWSXEDCRFVTGBYHNUJMIKOLP How are you ABCDEFGHIJKLMNOPQRSTUVWXYZ How are you  Sample Output   Austin Dallas fumble fire firefox Houston hat cat book bookworm bat you are How are you How are How you
user-0 提问: 新人求指导——scanf函数输入参数的问题

回复:
user: user-1
content: #include <stdio.h> #include <math.h>  int main() {     double x0=6, x1=1.5, a=1;     printf("Please input a =\n");     printf("%f is %f\n", a, x1);     scanf("%lf", &a);     x0 = a/2.0;     printf("%f is %f\n", a, x0);      return 0; } %f换成%lf 因为a是double类型，使用lf才能正确赋值给a； float占4个字节，double占8个字节。由于表示的精度不同，float和double在内存存放形式也不一样。

user: user-2
content: 用scanf输入的时候，double类型只能用%lf，输出可以用%f
user-0 提问: 纯虚数的幂，新手求助

回复:
user: user-1
content: 当溢出时，应该返回 return num_size - 1; 这个地方改一下。

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  #define MAX_NUM_LEN 2048  int cal_val(unsigned char *num_list, int num_size, int base, int num) {     int i = 0, j;     int len = 1, tmp, carry_bit;      num_list[1] = 1;      while (i < num) {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * base + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size-1 < len) {/* overflow */                 printf("Overflow!\n");                 return num_size;             }         }         i++;     }      return len; }   int main(void) {     unsigned char num_list[MAX_NUM_LEN];     int num_len, i;     int base, power;      memset(num_list, 0, sizeof(num_list));     printf("Please input two numbers: ");     scanf("%d%d", &base, &power);      if (base < 0 && power % 2)         num_list[0] = 1; /* negative number */     else         num_list[0] = 0;     base = abs(base);      num_len = cal_val(num_list, MAX_NUM_LEN, base, power);     printf("len = %d\n", num_len);     if (num_list[0])         putchar('-');     for (i = num_len; i >= 1; i--)         printf("%d", num_list[i]);     printf("\n");     return 0; }

user: user-2
content: 可以参考n的阶乘代码： #include<stdio.h> int main() {     static int a[100000000]; //设置一个超大数组来存储乘积结果。     int n;//要求的n的阶乘     int jw;//用来表示进位     int i, j;//控制循环     int len = 1;//初始化数组长度为1     int temp;//过程变量     printf("请输入n：");     scanf("%d", &n);     a[1] = 1;     for (i = 2; i <= n; i++)//遍历。从1到n     {         jw = 0;         for (j = 1; j <= len; j++)//从数组的低位开始乘         {             temp = a[j] * i + jw;//变量存储结果             a[j] = temp % 10;//将变量最后一位放入数组。             jw = temp / 10;//表示除了最后一位需要进位的数             if (j >= len && jw != 0)                 len++;  //数组长度加一          }       }          printf("n! =");          for (i = len; i >= 1; i--)//逆序输出数组就是结果         printf("%d", a[i]);     printf("\n");     return 0; }
user-0 提问: vc6  调试时提示access violation

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

user: user-2
content: 在调试下运行程序，出错可以通过调用堆栈定位到相关代码，以便分析原因

user: user-0

user: user-3
content: 把你的输入和输出顺便贴一下

user: user-0
content: 这个是求两个字符串 最大的相同子串
user-0 提问: Proteus中8086和8255A接口扩展电路的灯怎么不亮

回复:
user: user-1
content: 再好的仿真也不如三流的真硬件。我觉得。

user: user-0
content: 赵老师  您能告诉我这是什么问题吗   因为刚学很多东西不知道 所以 能帮忙解决吗

user: user-0
content: 第一次用proteus和8086仿真以及用emu8086软件，所以能帮帮忙吗  指导一下

user: user-1
content: 学会使用示波器或逻辑分析仪。

user: user-2
content: 8086还在用？
user-0 提问: 100以内的哥德巴赫猜想，有个问题

回复:
user: user-1
content: 通过验证，两个都是从4开始输出的；但是数量不一样/2，182个，不/2是349个

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

user: user-3
content: Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers
user-0 提问: CentOs Linux7中C语言代码疑问

回复:
user: user-0
content: 引用 3 楼 u011471566 的回复:[quote=引用 1 楼 jianwen0529 的回复:] %Lf //用大写L %lf //小写是指double类型  可是为什么最后那行又变了？好奇怪，刚刚改了下，第一行没问题了，第四个printf（）函数输出就变了[/quote]  谢谢啦，我搞懂了，也是用%Lf才行。书上写错了估计。

user: user-0
content: 引用 1 楼 jianwen0529 的回复:%Lf //用大写L %lf //小写是指double类型  可是为什么最后那行又变了？好奇怪，刚刚改了下，第一行没问题了，第四个printf（）函数输出就变了

user: user-0
content: 可是为什么最后那行又变了？好奇怪，刚刚改了下，第一行没问题了，第四个printf（）函数输出就变了

user: user-1
content: %Lf //用大写L %lf //小写是指double类型
user-0 提问: 一个c语言循环小问题

回复:
user: user-1
content: 在scanf("%c",&x);后面加fflush(stdin);清楚后面多余的字符。

user: user-2
content: 这个问题关系到有缓存输出与无缓存输出的区别。无缓存输出是输入字符之后马上就输出一个字符，而有缓冲输出是输入字符串之后字符串被储存在一个缓存区中，按下回车键之后，缓存区的字符串流才被输出到屏幕上。在你的程序中，你输入了小写的 'a'，按下了回车（等于输入了一个 '\n')，在第一次循环中，scanf读取了字符串流中的 'a'，可是还有一个 '\n' 还在字符串流中，这就被下一次循环读取了。'\n' 肯定不在 'A' 和 'Z' 之间，所以 '\n' 就被原样输出了。 这是我个人理解，具体的你可以参考《C Primer》这本书，里面讲的很详细。 希望对你有帮助。

user: user-3
content: scanf("%c", &x)；是从键盘缓冲区里拿，但是上次输入的‘\n’还在缓冲区里，所以你的第二次输入就是拿到的回车符

user: user-4
content: 使用能接收回车符的字符前，比如scanf %c,getchar这种，一定要注意输入缓冲区是否有遗留的字符（比如回车符）

user: user-5
content: 用个getchar去接收就好了。

user: user-5
content: 空格，回车也会被当做字符。

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

user: user-7
content: 没有回收垃圾（回车字符），第一次输入a，然后缓存区会有a和\n两个字符，让后scanf取走了a，留下了\n,下一次scanf会直接取走\n

user: user-0
content: 引用 3 楼 jianwen0529 的回复:第二种方法不要用，我试了下我连运行都有问题  用第一种 或者刷新下缓冲 scanf("%c", &x); fflush(stdin); 这个倒是可以，我只是不明白为什么看起来逻辑没什么大问题的小程序会出现这种问题，估计原理还挺复杂，多谢回复

user: user-8
content: 第二种方法不要用，我试了下我连运行都有问题  用第一种 或者刷新下缓冲 scanf("%c", &x); fflush(stdin);

user: user-0
content: 引用 1 楼 jianwen0529 的回复:scanf("%c",&x);//这个是我想的解决方法scanf("%c%*c",&x); getchar();  或者 scanf("%c\n",&x); 感谢回复，加getchar();和我的方法道理差不多，都是多收集一个字符，可是为什么要这样呢？加\n以后运行效果图，解决不了问题

user: user-8
content: scanf("%c",&x);//这个是我想的解决方法scanf("%c%*c",&x); getchar();  或者 scanf("%c\n",&x);
user-0 提问: C语言经典问题之指针问题返回字符串中字符的个数

回复:
user: user-0
content: 引用 1 楼 qq423399099 的回复:没有看你的str_c的逻辑。 main函数有2个问题： 1.a指针需要分配空间才行，char *a = (char *)malloc(sizeof(char) * 64); 2.你调用str_c引用的第二个参数c,在函数里也没用到，那你传进去干嘛的？c是字符c解决了，就是因为main函数里面的*a没有分配空间，导致出错，这和数组有着不同的地方，谢谢啦

user: user-0
content: c是字符c解决了，就是因为main函数里面的*a没有分配空间，导致出错，这和数组有着不同的地方，谢谢啦

user: user-1
content: if(*(s+i)=='c') 改为 if(*(s+i)== c) //跟变量c比较，而不是字符 ‘c'

user: user-2
content: 没有看你的str_c的逻辑。 main函数有2个问题： 1.a指针需要分配空间才行，char *a = (char *)malloc(sizeof(char) * 64); 2.你调用str_c的第二个参数c,在函数里也没用到，那你传进去干嘛的？

user: user-3
content: 除了需要对野指针a申请有效的内存空间之外，c的值也是随机的，随意还需要给c赋值一个有效的值。

user: user-4
content: 为什么定义指针之后需要用那个给他分配空间。不是定义之后就已经分配了吗。 我是新手。希望大家能解答一下。谢谢
user-0 提问: 初学C，请教一个小问题

回复:
user: user-1
content: m/j得到的数依旧是整形，需要转换成double型。 不论是强制转化还是隐形转换。

user: user-2
content: #include <stdio.h> int main() {     int j=1,n,m=1;     double i=0;      printf("Please input an number:");     scanf("%d",&n);     while(j <= n)     {         i = i + m *1.0/j;         j = j + 1;         m=-m;     }     printf("总和为:%f\n", i);      return(0); } 类型需要转换一下～

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

user: user-4
content: 数据类型不同导致的问题 要保证没问题，需要显式的进行类型转换 否则两个整数进行四则运算，结果还是整数，而非浮点数

user: user-5
content: i=i+(double)m/j; //对m进行强制转换为double类型  否则两个整形数相除的会取整操作，比如你程序得出来是0.xxx，但是只取整数部分0

user: user-6
content: i=i+m/j;   当j > m时 m / j == 0;
user-0 提问: 字符回显的基础问题

回复:
user: user-1
content: 越界了吧，你ch定义的大小是20，你用strlen求出的是23，而且你还没有结束符

user: user-2
content: #include<stdio.h> #include<string.h>  int main() {     char ch[20];     int i, len;      printf("enter a row:");     for(i = 0; (ch[i]=getchar()) !='\n'; i++)         ;     ch[i] = 0; /* add '\0' */     printf("reshow:");     len = strlen(ch);     printf("%d\n", len);     for(i = 1; i <= len; i++) {         printf("%c", ch[len-i]);     }     printf("\n");     return 0; }  一般遇到输出字符串时出现乱码，基本上都是没有加上字符串结束标记；建议下次遇到类似问题先检查字符串结束标识是否存在。

user: user-3
content: Debug模式下C程序，发现栈区开辟的存储空间都是使用0CCCCCCCCh来填充4字节单位的，也就是说，栈区开辟的存取局部变量的空间的每一个字节都被0xCC填充了。（为什么用0xCC，这个是int 3h的机器码，下断点用的）两个0xCC合起来输出时恰好对应中文“烫”字。动态分配的空间开辟的堆，VC的Debug用0xCD填充堆的空间，两个0xCD和在一起就是屯了。

user: user-4
content: 你的输入为什么要这样呢，既然是想输入字符串，就直接scanf("%s",ch);不就行了

user: user-5
content: windows里常见的内存填充数据含义  * 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory 漱 * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers 涵?  * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory 很?  * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger 撅饰 * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files 烫烫 * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory 屯屯 * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory 葺葺 * 0xDDDDDDDD : Used by Microsoft's free() or delete to mark freed heap memory 蕲蕲 * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash  * 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory  * 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory

user: user-6
content: 字符串要以\0结尾  for(i=0;(ch[i]=getchar())!='\n';i++) 		;  这句后面加上：  ch[i] = '\0';

user: user-7
content: for(i=0;(ch[i]=getchar())!='\n';i++) ; ch[i] = '\0'; 设置字符串结束标志

user: user-8
content: 字符数组末尾没有 ‘\0’ 结束符，这样 strlen 求出来的值自然就不对，而且还把回车符算进去了
user-0 提问: c语言中传参传指针，为什么打印函数中指针的地址和main函数的地址不一样？

回复:
user: user-1
content: 配了一把一样的钥匙而已，都可以开某个门，但两个钥匙本身是不同的东西（或者说材质，硬件上不是同一个东西）

user: user-2
content: 指针指向内容一致，指针本身地址肯定不同！

user: user-3
content: 参数传递，其实就是值传递；即把指针变量里的数据传递给子函数栈上的指针变量，这样，main函数里的指针指向哪个内存地址，那么子函数里的指针变量也就指向的那个内存地址。 具体问题还需要具体分析，最好能把你的代码贴出来，让大家给你分析一下。

user: user-4
content: 实参和形参并不是同一个指针，他们只是指向的内存区域一样而已

user: user-5
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-6
content: 指针本身是复制过去的，只是他们指向的对象是一样的  你打印 &a[0] 你会发现是一样的了

user: user-7
content: 因为你函数参数是按值传递的，也就是参数是复制的，函数中的指针只是main中指针的复制品，他们的地址当然不同  除非你按引用传递参数，也就是说参数类型为指针的引用

user: user-8
content: 打印的对象是对的么？ #include <stdio.h>   void fun( int a[] ) {          printf( "%-20s0x%X\n", "Parameter address:", a );            // additional code here... }   void main( int argc, char *argv[] ) {          int a[] = { 9, 5, 2, 7 };                   printf( "%-20s0x%X\n", "Source address:", a );            fun( a );                   getchar(); }

user: user-9
content: 从逻辑上来说，传地址肯定一致，你不会把指针的地址传过去了吧？ 指针的值和指针本身的地址不是一个概念

user: user-10
content: where is the code?
user-0 提问: 初学C，一个小小的结构体问题望解答

回复:
user: user-1
content: 非溢出，而是fun函数处理之后的数据没有拿到。 拿到fun处理后的数据有两种方式，一种就是通过返回值，另一种就是通过传入传出参数，即传结构体的地址过去。

user: user-2
content: 关注一下，我也是主学C的

user: user-2
content: 楼上说得都对

user: user-3
content: 传结构体的地址过去就可以了  改2处  ：  void fun( struct gas *name )  //... fun( &name1 );

user: user-0
content: 引用 1 楼 user-6 的回复:没有保存返回值 fun(name1); 改成name1 = fun(name1); 我明白了，谢谢。

user: user-4
content: #include <stdio.h>   struct gas {          float distance;          float gals;          float mpg; };   void fun( struct gas *name ) {          name->mpg = name->distance + name->gals; }   void main( int argc, char *argv[] ) {          struct gas name1;            scanf( "%f", &name1.distance );          scanf( "%f", &name1.gals );            fflush( stdin );            fun( &name1 );            printf( "%.2f %.2f %.2f%", name1.distance, name1.gals, name1.mpg );                   getchar(); }

user: user-5
content: 你在fun函数中操作的形参name和main函数里的实参name并不是同一个 解决方法： 1.传入指针 2.楼上所说的接收fun的返回值

user: user-6
content: 没有保存返回值 fun(name1); 改成name1 = fun(name1);