Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: memset为什么会导致数值翻转？

回复:
user: user-1
content: memset 第二个参数是int类型但是第一个参数是char * 类型，赋值的时候应该会把int 类型的最后一个字节赋值给 第一个参数，所以就会出现0xfffffff

user: user-2
content: 引用 9 楼 zhao4zhong1 的回复:[quote=引用 8 楼 lm_whales 的回复:] void *dmemset(void *d,int value,size_t n){          int *p= (int *)d;          for(;p<(int *)d+n; *p++= value );          return d;            }//这个程序中的循环.会自动生成 rep stosd 指令 说不准。 还必须输出Release版。 且也不一定。[/quote] 最保险的办法是在这段代码前临时插一句__asm int 3或DebugBreak();，再生成release版，且在IDE中运行，待停在插入的那句时，按Alt＋8键，亲眼看看紧跟其后的汇编指令是啥。

user: user-2
content: 引用 8 楼 lm_whales 的回复:void *dmemset(void *d,int value,size_t n){          int *p= (int *)d;          for(;p<(int *)d+n; *p++= value );          return d;            }//这个程序中的循环.会自动生成 rep stosd 指令 说不准。 还必须输出Release版。 且也不一定。

user: user-3
content: memset 中的第二个参数只取低8位的值

user: user-4
content: 引用 9 楼 zhao4zhong1 的回复:说不准。 还必须输出Release版。 且也不一定。  首先,这样写逻辑上没有问题 其次,debug 版,更重要的是逻辑,程序的正确性,而非效率 然后 至少VCRelease版,能够优化成 rep stosd 指令,这已经足够好了; 恰好实现了memset类似的功能.但是却是用int 填充,恰好满足需要.  不能够实现这种优化的编译器,可以扔掉了. 不想扔掉,自己写个内嵌汇编即可.

user: user-4
content: 引用 9 楼 zhao4zhong1 的回复:[quote=引用 8 楼 lm_whales 的回复:] void *dmemset(void *d,int value,size_t n){          int *p= (int *)d;          for(;p<(int *)d+n; *p++= value );          return d;            }//这个程序中的循环.会自动生成 rep stosd 指令 说不准。 还必须输出Release版。 且也不一定。[/quote] 编译器已经足够聪明了

user: user-4
content: void *dmemset(void *d,int value,size_t n){          int *p= (int *)d;          for(;p<(int *)d+n; *p++= value );          return d;            }//这个程序中的循环.会自动生成 rep stosd 指令

user: user-5
content: 如下是函数memset说明的一部分，参数2的类型虽然为int，但有效值仅为1 byte，常量0x7FFFFFFF被截短为0xFF作为填充内容，因此最终结果0xFFFFFFFF。  NAME        memset - fill memory with a constant byte  SYNOPSIS        #include <string.h>         void *memset(void *s, int c, size_t n);  如果要初始化int型数组，可以在循环中对数组元素逐个赋值。

user: user-6
content: memset 是以char 为单位的  这种东西怎么可以不知道

user: user-7
content: void * memset ( void * ptr, int value, size_t num );  Fill block of memory Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char). /* memset example */ #include <stdio.h> #include <string.h>  int main () {   char str[] = "almost every programmer should know memset!";   memset (str,'-',6);   puts (str);   return 0; }

user: user-8
content: 需要看一下你是如何memset的。

user: user-4
content: 看看有没有wmemset,dmemset,或者memsetw,dmemsetd可用, 没有自己写一个 memset 按字节填充

user: user-9
content: memset ！= memcpy

user: user-2
content: #include <stdio.h> float data[500]; int i; void main() {     for (i=0;i<500;i++) {data[i]=1.0f;printf("%g\n",data[i]);}     __asm {         push ecx         push edi         mov ecx,500         mov eax,0xBF800000 //-1.0f         lea edi,data         rep stosd         pop edi         pop ecx     }     for (i=0;i<500;i++) printf("%g\n",data[i]); }
user-0 提问: 函数内创建的数组在调用后，是不是就不存在

回复:
user: user-1
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-0
content: 谢谢大家的帮助。

user: user-2
content: 你想知道的是这些？ 用这样的方式，如 int a[16] 这个数组是被当作直接存取的数据，生命周期在作用域内，过了就不存在了。 但是如果用 int * a =new  int[16]; 这个数组需要手动释放，这就是C++反对者会说C++不好的原因之一了 但是需要知道 a 本身也是个 UNIT变量，所以如果这句话在函数中出现，那么 a 的生命周期也是这个函数体。 但是a指向的数组内存是一直存在的，需要手动释放。  PS：你问的这个问题，和堆栈关系不大。

user: user-3
content: 建议你去看看数据的存储，这就是一个数据存储类型的问题

user: user-1
content: 这样也对： char *getABC() {     static char str[10];     strcpy(str,"12345");     return str; }   void main() {     char *p = getABC();     printf("%s\n",p);   //这样正确吗？p 指向的位置是不是已被 自动释放了， }

user: user-4
content: 验证了一下： 写法1，打印出来的是乱码。 --- 数组被释放了，该内存地址内容是随机的，str[10]是全局变量就不存在问题。 方法2，是对的，指针传递。 不过有两处语法错误。

user: user-5
content: 就回收了的   栈就是这样

user: user-0
content: 测试的时候， 返回的结果都是正确的。  但我总感觉，第一种方式好像理论上不应该输出 12345

user: user-6
content: 生命周期的问题。 可以在堆上申请空间。

user: user-7
content: 第一种返回了局部变量的地址，这个地址指向的内容在函数结束后可能被修改，所以你取p的值的时候可能会得不到你想得到的内容

user: user-8
content: 第二种正确（如果不是写错的话）  c是一种比较靠近底层的语言。

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:这样也对： char *getABC() {     static char str[10];     .... }   }  加一个 static ，主要作用是什么？

user: user-9
content: char *getABC() {     char *str="12345";//这样也对     //strcpy(str,"12345");     return str; }   void main() {     char *p = getABC();     printf("%s\n",p);   //这样正确吗？p 指向的位置是不是已被 自动释放了， }

user: user-10
content: 引用 7 楼 zhao4zhong1 的回复:这样也对： char *getABC() {     static char str[10];     strcpy(str,"12345");     return str; }   void main() {     char *p = getABC();     printf("%s\n",p);   //这样正确吗？p 指向的位置是不是已被 自动释放了， } 恩，不过要尽量避免这样使用static，因为多线程是不安全的

user: user-11
content: 第二种方法是正确的，因为strcpy的字符串实际上是拷贝到了main函数的数组str中。所以，在main函数里可以正确输出拷贝后的字符串。

user: user-12
content: char *getABC() {     char str[10];     strcpy(str,"12345");     return str; //理论上,这是错误的 }  void  print_data() {           char str[80];           printf("str=%p",str); } void str_test() { 	char str[10]; 	char *s,*t;     char *p = getABC();     register int i; 	for(s=p,t=str,i=0;i<10;i++)        *t++=*s++; //这么处理,可以勉强把数据复制出来,而不错误         	 	printf("%s\n",str);   //输出是正确的,但是从C语言来说,却是错误的;        //因为返回的数组地址,是个超过生存周期的数组的地址,       //这个地址对应的内存,可能会另作他用比如,局部变量,调用函数传递的参数,函数返回地址等等       //这里  .str,"%s\n" 这两个参数,以及printf函数的局部变量;       //可能会占用p这个指针表示的地址.       //所以输出可能不正确.      printf("p = %p,",p); }
user-0 提问: 汇编中调用C函数

回复:
user: user-1
content: 将局部变量存入栈上可以通过ebp偏移也可以通过esp。 http://www.cnblogs.com/bangerlee/archive/2012/05/22/2508772.html

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

user: user-0
content: 找到原因了，ebp是在函数内入栈的

user: user-3
content: 你调用的时候 按你需要把参数压栈 剩下的就是call了
user-0 提问: C语言【下载网站图片】send()发送函数问题

回复:
user: user-1
content: 第2行memset(html, 0, m_nContentLength);多余。

user: user-1
content: html = (char *)malloc(m_nContentLength);     memset(html, 0, m_nContentLength);     bytesRead=0;     while(1)     {         ret = recv(sockfd, html + bytesRead, m_nContentLength - bytesRead, 0);         if(ret > 0)         {             bytesRead += ret;         } else break;     }      fstream file;     file.open("D:\\4.gif",ios::out | ios::app | ios::binary );     file.write(html,m_nContentLength);  “给定长度的byte数组”和“不给定长度的ASCIIZ字符串”不是一回事！

user: user-0

user: user-1
content: 没完全回去全部→没完全获取全部

user: user-1
content: 没完全回去全部说明你m_nContentLength的值不是gif文件的长度.   先学会使用抓包软件比如wireshark 然后对浏览器下载一个gif文件的全过程抓包,看抓包结果,看明白以后再编程.

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:    html = (char *)malloc(m_nContentLength);     memset(html, 0, m_nContentLength);     bytesRead=0;     while(1)     {         ret = recv(sockfd, html + bytesRead, m_nContentLength - bytesRead, 0);         if(ret > 0)         {             bytesRead += ret;         } else break;     }      fstream file;     file.open("D:\\4.gif",ios::out | ios::app | ios::binary );     file.write(html,m_nContentLength);  “给定长度的byte数组”和“不给定长度的ASCIIZ字符串”不是一回事！那我应该用什么类型存放返回的数据呢，我现在读取的数据只是一部分，没有完全获取全部！

user: user-1
content: 先学会使用抓包软件比如wireshark

user: user-2
content: 先把原图片下载下来，然后把2个文件，用UE等二进制编辑工具打开，比较2个文件，看看哪里有不同。

user: user-0
user-0 提问: 怎么改变矩形的填充颜色

回复:
user: user-0
content: bar（）产生的填充矩形默认为白色，怎么才能改变这个颜色？

user: user-0
content: 我用的是vs2010

user: user-1
content: 我的天还在用TC呢？
user-0 提问: 求杨辉三角

回复:
user: user-1
content: /* 本函数功能:输出杨辉三角 */ #include <stdio.h> #define   N  10 int main() { int i,j,a[N][N];     for(i=0;i<N;i++) {a[i][0]=1; a[i][i]=1; }    for(i=2;i<N;i++)    for(j=1;j<=i-1;j++)    a[i][j]=a[i-1][j]+a[i-1][j-1];        for(i=0;i<N;i++)    {    for(j=0;j<=i;j++)    printf("%6d",a[i][j]);     printf("\n");    }                               return 0; }

user: user-2
content: 一个广泛使用的教科书，错误这么多

user: user-3
content: //按如下格式打印杨辉三角形的前MAXN行。 //  1 //  1 1 //  1 2 1 //  1 3 3 1 //  1 4 6 4 1 //  1 5 10 10 5 1 #include <stdio.h> #define MAXN 68 unsigned __int64 y[MAXN][MAXN]; int i,j; void main() {     printf("1\n");     printf("1 1\n");     y[1][0]=1ui64;y[1][1]=1ui64;     for (i=2;i<MAXN;i++) {         y[i][0]=1ui64;printf("1 ");         for (j=1;j<=i-1;j++) {             y[i][j]=y[i-1][j-1]+y[i-1][j];             printf("%I64u ",y[i][j]);         }         y[i][i]=1ui64;printf("1\n");     } } //1 //1 1 //1 2 1 //1 3 3 1 //1 4 6 4 1 //1 5 10 10 5 1 //1 6 15 20 15 6 1 //1 7 21 35 35 21 7 1 //1 8 28 56 70 56 28 8 1 //1 9 36 84 126 126 84 36 9 1 //... //1 67 2211 47905 766480 9657648 99795696 869648208 6522361560 42757703560 247994680648 1285063345176 5996962277488 25371763481680 97862516286480 345780890878896 1123787895356412 3371363686069236 9364899127970100 24151581961607100 57963796707857040 129728497393775280 271250494550621040 530707489338171600 972963730453314600 1673497616379701112 2703342303382594104 4105075349580976232 5864393356544251760 7886597962249166160 9989690752182277136 11923179284862717872 13413576695470557606 14226520737620288370 14226520737620288370 13413576695470557606 11923179284862717872 9989690752182277136 7886597962249166160 5864393356544251760 4105075349580976232 2703342303382594104 1673497616379701112 972963730453314600 530707489338171600 271250494550621040 129728497393775280 57963796707857040 24151581961607100 9364899127970100 3371363686069236 1123787895356412 345780890878896 97862516286480 25371763481680 5996962277488 1285063345176 247994680648 42757703560 6522361560 869648208 99795696 9657648 766480 47905 2211 67 1

user: user-4
content: 悲催的我还在为考试而看老谭的《c程序设计》

user: user-5
content: 不谈算法好多年

user: user-6
content: for(i=0;i<N;i++)    for(j=0;j<=i;j++)    {printf("%6d",a[i][j]);    printf("\n");    }  改为   for(i=0;i<N;i++){    for(j=0;j<=i;j++)    {printf("%6d",a[i][j]);     }    printf("\n"); }

user: user-7
content: 谁叫你用谭浩强的书了，那本书只适合用来考试

user: user-8
content: 老谭酸菜，你就不要用了！换教辅吧！ 原理参考wiki http://en.wikipedia.org/wiki/Pascal%27s_triangle
user-0 提问: 关于头文件中声明变量的疑问

回复:
user: user-0
content: 引用 14 楼 baichi4141 的回复:在C语言中，int a;（未初始化）是弱定义，如果和初始化的强定义并存，可以看作声明 这和C++是不同的  我是楼主，该问题已经解决，14楼的答案是正确的。 但是有一点需要补充，“int a;（未初始化）是弱定义”必须满足条件：变量a是全局变量。 实例如下图：   当int a; int a= 1;都在main函数外时，编译没错，运行正确。 当int a; int a= 1;都在main函数内时，编译出错，显示重定义。 由此可判断int a 在main函数外时（即定义为全局变量），C编译器将int a（未初始化）语句看作弱定义 在main函数内时，则看作与int a =1;一样的强定义。  而在C++中，不管int a 语句在函数的哪个地方，都将其视作强定义（也就是C++中没有弱定义这个概念了）。   另外需要注意的一点是，如果int a 在main函数外（a是全局变量），而int a = 1;在main函数内，则此时发生了局部变量(int a=1在主函数main中)对全局变量的覆盖，此时编译没错，运行正确

user: user-1
content: 在C语言中，int a;（未初始化）是弱定义，如果和初始化的强定义并存，可以看作声明 这和C++是不同的

user: user-0
content: 引用 12 楼 beiye90 的回复:肯定有错啊！你编译器是假的吧！我也用的2010！ 8楼说错了，我用的是2008

user: user-2
content: 肯定有错啊！你编译器是假的吧！我也用的2010！

user: user-2
content: 名字得一样

user: user-0
content: 引用 7 楼 u012061345 的回复:什么编译器才会把 int a; 看做是声明？  我用的是visual studio 2008

user: user-0
content: 引用 6 楼 braveboyny 的回复:一个简单的验证性的程序。头文件file2.h中定义变量a并初始化为1，源文件file1.c中又定义了a,应该发生了重定义，编译器为什么没有报错？  你确定是重定义？？请百度声明和定义的区别  我当然知道声明和定义的区别，毫无疑问在file1.c中，编译器把int a 当成了声明。 但是，当我把#include "file2.h"去掉之后，编译器仍然不报错，毫无疑问，编译器又把int a 当成了定义

user: user-0
content: 我用的是visual studio 2010

user: user-3
content: 什么编译器才会把 int a; 看做是声明？

user: user-4
content: 一个简单的验证性的程序。头文件file2.h中定义变量a并初始化为1，源文件file1.c中又定义了a,应该发生了重定义，编译器为什么没有报错？  你确定是重定义？？请百度声明和定义的区别

user: user-5
content: #include "file1.h"

user: user-6
content: 第2个只是声明，你对它初始化和头文件一致看看报错不？

user: user-6
content: 编译器比较烂

user: user-7
content: 引用 1 楼 u012061345 的回复:真的没报错？  确实没有报错，估计将file1.c中的“int a;”当作声明了！

user: user-3
content: 真的没报错？
user-0 提问: gcc新版发布啦？

回复:
user: user-1
content: 看来我还需要加把劲啊

user: user-0
content: 对了，答对的人给分。

user: user-0
content: 接楼上的话：说得不错。但有人说已经支持泛型选择了。如果是这样的话，那些家伙们可以提前预测一下，下面的代码打印什么： printf(_Generic("hello!",                 char : "char.\n",                 char * : "char *.\n",                 char [7] : "char [7].\n",                 const char * : "const char *",                 default: "???\n")        );

user: user-2
content: http://gcc.gnu.org/ GCC 4.9.0 released [2014-04-22] 看它支持不支持C11标准中的_Generic？对吧？估计够呛，它还是以C99为主。据说GCC正在改写成面向对象的设计方案

user: user-3

user: user-4
user-0 提问: poj上一题，崩溃的青蛙约会问题

回复:
user: user-1
content: 太多了  没看

user: user-2
content: #include <iostream> #include <math.h> using namespace std;  int gcd(int a,int b) {	 	int temp; 	while(b) 	{ 		temp = a % b; 		a = b; 		b = temp; 	} 	return a; } void main() { 	int x,y,m,n,L,a=1,b=0,temp; 	cout<<"输入x,y,m,n,L,中间以空格隔开"<<endl; 	cin>>x>>y>>m>>n>>L; 	long long gcm;  	gcm = gcd(L,abs(n-m)); 	gcm = L/gcm*(abs(n-m)); 	do 	{ 		temp = ((n-m)*a+y-x)%L; 		a++; 	} 	while(temp!=0&&a<gcm); 	 	if(a == gcm ) 		cout<<"无法相遇"<<endl; 	else 	{ 		a--; 		cout<<"最少跳跃次数为:"<<a<<endl; 	} 	 }

user: user-3
content: 算法的力量。用扩展欧几里得，一个数组一个链表都不用，几个变量折腾一下答案就出来了。
user-0 提问: 10的ASC码如何计算

回复:
user: user-1
content: ASC码数字部分是0~9，没有10

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

user: user-3
content: 你这样说得不清不楚的，在stackoverflow早就删帖了。 stackoverflow有名的原因就是通过删帖保证论坛质量。 CSDN再这样和稀泥，没希望的。

user: user-4
content: 如果你是这个意思 printf("%d\n",10); 如果你是这个意思 printf("%d %d\n",'1','0');

user: user-5
content: 字符串"10"的ASC码才是'1'的ASCII码加上'0'的ASC码. 如果10本身就是一个数值类型, 比如int类型.  那么就没有ASC码一说了.

user: user-6
content: 引用 楼主 u013145766 的回复:大神们帮帮我吧,10的asc码值是不是1的ASC码连接上0的ASC码 是的。 就和AB，是A的ASCII码链接上B的ASCII码，一样的。

user: user-7
content: 字符才有ASC码。10不是字符，没有ASC码。
user-0 提问: 伪代码解释gdb命令

回复:
user: user-1
content: 为什么要用伪代码呢？gdb是开源的啊。

user: user-2
content: 这个问题比较多，一般都是通过修改代码指令实现的 这里有个codeproject中的文档，介绍的很详细，关于调试器的，不过不是GDB http://www.codeproject.com/Articles/43682/Writing-a-basic-Windows-debugger

user: user-3
content: server 用过没理解里面的东西   这个有文档介绍么？
user-0 提问: 如何将一句话的每一个字，分别存入不同的变量之中呢？

回复:
user: user-1
content: void  StrToInt(char *buf,unsigned short *x) {     unsigned char  *p=(unsigned char  *)buf; 	unsigned short *q=x; 	unsigned short  m;      while(*p)     { 		if(*p<0xa0) 			m=*p&0xff; 		else 		{ 			if(*(p+1)<0xa0) 				m=*p&0xFF; 			else 			{ 				m=*p&0xFF; 				m<<=8; 				p++; 				m|=*p&0xFF; 			} 		} 		*q=m; 		p++; 		q++;              	} }   举例 void main()  { 	char *str="你abcd好!欢迎光efg临！"; 	unsigned short pp[240]={0};  	StrToInt(str,pp);  	printf("%04X\n%04X\n%04X\n%04X\n%04X\n%04X\n",pp[0],pp[1],pp[2],pp[3],pp[4],pp[5]); }

user: user-2
content: 这个要用c++的宽字符

user: user-3
content: 问题是如果有英文的标点怎么办

user: user-4
content: 引用 4 楼 zhou007jie 的回复:[quote=引用 2 楼 zxh707wk 的回复:] 英文可以这样做 汉字不行吗？ 每一个变量之中，只存储一个字符 多余的字符，存储到另外的变量中去[/quote] 英文每个字母占用一个字节，但是汉字每个占用两个字节。  不过，我觉得可以讲它读入一个字符串，然后对字符串进行分解

user: user-0
content: 引用 2 楼 zxh707wk 的回复:英文可以这样做 汉字不行吗？ 每一个变量之中，只存储一个字符 多余的字符，存储到另外的变量中去

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:汉字占用的字节数和英文字母是不一样的，在定义变量时，应该注意这个地方吧！ 要怎么样将每一个字符，存入不同的变量之中呢？ 而不是所有的字符，都存入到一个变量中去了？

user: user-3
content: 英文可以这样做

user: user-5
content: 汉字占用的字节数和英文字母是不一样的，在定义变量时，应该注意这个地方吧！
user-0 提问: C语言面向对象的内容

回复:
user: user-1
content: 可以不需要，但是你下面函数的实现也要与之对应就可以，这里的fun2是一个函数指针。    将函数赋值给函数指针，一定要满足参数个数，顺序，类型都相同，且返回值的类型要一样，除了void型。

user: user-0
content: 引用 12 楼 yangyuyu77584 的回复:不明白你说的，1.构造函数是没有返回值。2.你结构体并没有自己定义虚函数。  struct son { struct parent p; int b; void(*func2)(struct son* _this); }; 就是 void(*func2)(这里的第一个参数，必须是struct son*类型嘛？)

user: user-1
content: 不明白你说的，1.构造函数是没有返回值。2.你结构体并没有自己定义虚函数。

user: user-2
content: 原来面向对象是这个意思

user: user-0
content: 引用 5 楼 yangyuyu77584 的回复:因为son中声明parent是类变量，不是类指针变量。所以这里当你去new son时，系统随机给parent分配一块内存，但是这块内存是不能操作。所以当你运行时就会报内存访问出错。修改方案： 方案1.将son中parent修改从指针变量，然后在new_son函数中，对p进行new parent操作。  方案2.在struct son * b = new_son();后加入b->p = p;就是对son中的parent变量赋值。 方案3.修改son和parent的构造函数，你现在都是用默认的构造函数。  谢谢你的回答~~还有一个问题想想问~~ struct son { struct parent p; int b; void(*func2)(struct son* _this); }; 这里的虚函数里面的参数类型，是必须要定义一个指向自身的一个指针类型嘛？如果是，请问为什么呢？或者这么定义除了能指向自身之外，还有什么用处呢？ 我一直有点纳闷，构造函数不是可以返回一个指向这个结构的一个指针啊？但是，我看很多的定义都是将这个虚函数的第一参数定义为指向自己的指针？

user: user-3
content: struct son * b = (struct son*)malloc(sizeof(struct parent)); 这里应该是struct son 吧

user: user-4
content: 不明觉厉，这算舍近求远吗？

user: user-5
content: 哎呦 不错哦

user: user-6
content: ((struct parent*) b)->func1(b);//请问这一句有什么错误 你没有初始化内部的p，能调成功才见鬼了阿 这种转化在C中不推荐。和C++不一样的。C面向对象至多采用内嵌函数指针实现面对向的成员方法

user: user-1
content: 因为son中声明parent是类变量，不是类指针变量。所以这里当你去new son时，系统随机给parent分配一块内存，但是这块内存是不能操作。所以当你运行时就会报内存访问出错。修改方案： 方案1.将son中parent修改从指针变量，然后在new_son函数中，对p进行new parent操作。  方案2.在struct son * b = new_son();后加入b->p = p;就是对son中的parent变量赋值。 方案3.修改son和parent的构造函数，你现在都是用默认的构造函数。

user: user-0
content: 引用 3 楼 yangyuyu77584 的回复:修改成((struct parent*) b)->func1((struct parent*)b) 首先，感谢你的回答。但是，我一开始就这么调试的，语法没的错~~只是，在运行的时候要异常停止，而且，没有成功调用func1这个函数~~另外，我自己有一个地方写错了    “struct son * b = (struct son*)malloc(sizeof(struct parent));   //对于C中的子类，这里的父类该怎么初始化呢？或者需不需要初始化呢？”最后那里 的parent应该改成son，改了还是不对？你看是还有什么问题嘛？

user: user-1
content: 修改成((struct parent*) b)->func1((struct parent*)b)

user: user-1
content: ((struct parent*) b)->func1(b); 因为func1的函数的参数是parent*，而不是son*，所以不能将son*的b，转化成parent*。

user: user-0
content: 或者请大家帮帮谢谢 new_son这个函数？谢谢罗
user-0 提问:  波特率的问题

回复:
user: user-0
content: 引用 1 楼 bigwatercar 的回复:http://wenku.baidu.com/link?url=lEZvfvC3KbTscRa9XsqLzo7Ty-eNYGeoBRGkAt8-L6WoeNyP113giMZpGy6d81TwVUiCaTiV0bMjI5VkenCAs1zhJ_nYbonxmoWCo51Ck8W  这里有篇论文，可以参考。  这个内容不错。

user: user-0
content: 引用 2 楼 truelance 的回复:只要接收端速率大于等于发送端速率, 就可以自适应了.  接收设备的波特率不确定，有可能会小于发送的波特率。

user: user-0
content: 引用 2 楼 truelance 的回复:只要接收端速率大于等于发送端速率, 就可以自适应了.  也有一个效率问题，快速准确，一次判断出，用算法还是有些延迟。 如果码元定时测量能准确，那就好了。

user: user-1
content: 只要接收端速率大于等于发送端速率, 就可以自适应了.

user: user-2
content: http://wenku.baidu.com/link?url=lEZvfvC3KbTscRa9XsqLzo7Ty-eNYGeoBRGkAt8-L6WoeNyP113giMZpGy6d81TwVUiCaTiV0bMjI5VkenCAs1zhJ_nYbonxmoWCo51Ck8W  这里有篇论文，可以参考。
user-0 提问: 大数加法的程序不知道错在哪里求大神帮忙看看吧

回复:
user: user-1
content: 仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110
user-0 提问: warning: assignment from incompatible pointer type问题

回复:
user: user-0
content: 把代码单独拎出来编译又没问题了，奇怪 2楼的用法好像也见过

user: user-1
content: ww是指针变量   函数名是个函数指针常量，  常量和变量类型不兼容。

user: user-1
content: mm.aa = &qq;  函数指针和函数名效果一行，但编译器认的不一样。

user: user-2
content: 没看出什么问题，猜测楼主编译的时候aa定义为ww *aa;，或者ww定义为typedef  uint16 *(*ww)(uint8 *gg, int32 hh);，这2种情况下都会出现上述编译告警。 建议将贴出来的部分代码单独编译一下试试。
user-0 提问: swu 为什么16行的j变为了《5？17 18行printf两次？

回复:
user: user-1
content: 介系双重循环

user: user-0
content: 已改 问题：为什么16行的j要《5？而i不用？想不通。

user: user-1
content: 你不在"%d"后面加空格"%d "，怎么区别 1,0,1 10,1 101 ?
user-0 提问: 请教一个select的问题

回复:
user: user-1
content: 引用 4 楼 flt1119 的回复:[quote=引用 3 楼 mujiok2003 的回复:] void pulse_recv() {     printf("pulse_recv() Called!\n\n"); }  当socket可读的时候，你要把数据取走，要不然，你下次select的时候，肯定还是可读的状态，所以引用select就会疯狂的调用pulse_recv函数。 万分感激！！！不过我好像只有20多分了[/quote] 分无所谓， 最重要是问题解决了。

user: user-0
content: 引用 3 楼 mujiok2003 的回复:void pulse_recv() {     printf("pulse_recv() Called!\n\n"); }  当socket可读的时候，你要把数据取走，要不然，你下次select的时候，肯定还是可读的状态，所以引用select就会疯狂的调用pulse_recv函数。 万分感激！！！不过我好像只有20多分了

user: user-1
content: void pulse_recv() {     printf("pulse_recv() Called!\n\n"); }  当socket可读的时候，你要把数据取走，要不然，你下次select的时候，肯定还是可读的状态，所以引用select就会疯狂的调用pulse_recv函数。

user: user-0
content: 代码每次循环开始都会调用下面两句，试过使用FD_CLR也不行。         FD_ZERO(&fd_read);         FD_SET(sock_bind, &fd_read);

user: user-2
content: 操作完成后应该重置select处理的套接字描述符
user-0 提问: 这道poj的题目是个什么意思？没看懂

回复:
user: user-1
content: google啊...

user: user-2
content: 不懂英文没关系,  连接搜索都不愿意去做, 那就是你的不对了.  百度一下, 一大堆在线翻译.
user-0 提问: 有n个人围成一圈，顺序排号。从第一个人开始报数，凡报到3的人退出圈子，问最后留下的是几号？

回复:
user: user-1
content: #include <stdio.h> int main() { 	int a[100]; 	int n; 	int i; 	int count; 	int j=0; 	int index=0; 	scanf("%d",&n); 	 	for(i=0;i<n;i++) 		a[i]=i+1; 	for(i=0,count=1;(n-index)!=1;i=(i+1)%(n-index),count++) 	{ 		if(count%3==0) 		{ 			for(j=i;j<n-index;j++) 				a[j]=a[j+1]; 			count++;		//判断是否是3（被3整除） 			index++;		//index记录淘汰了几个数 		} 	}	 		 	printf("%d\n",a[0]); 	return 0; }

user: user-1
content: #include <stdio.h> int main() { 	int a[100]; 	int n; 	int i; 	int count; 	int j=0; 	int index=0; 	scanf("%d",&n); 	 	for(i=0;i<n;i++) 		a[i]=i+1; 	for(i=0,count=1;(n-index)!=1;i=(i+1)%(n-index),count++) 	{ 		if(count%3==0) 		{ 			for(j=i;j<n-index;j++) 				a[j]=a[j+1]; 			count++;		//判断是否是3（被3整除） 			index++;		//index记录淘汰了几个数 		} 	}	 		 	printf("%d\n",a[0]); 	return 0; }

user: user-1
content: #include <stdio.h> int main() { 	int a[100]; 	int n; 	int i; 	int count; 	int j=0; 	int index=0; 	scanf("%d",&n); 	 	for(i=0;i<n;i++) 		a[i]=i+1; 	for(i=0,count=1;(n-index)!=1;i=(i+1)%(n-index),count++) 	{ 		if(count%3==0) 		{ 			for(j=i;j<n-index;j++) 				a[j]=a[j+1]; 			count++;		//判断是否是3（被3整除） 			index++;		//index记录淘汰了几个数 		} 	}	 		 	printf("%d\n",a[0]); 	return 0; }

user: user-2
content: m等于n-1时，圈内只有1个人了，while循环不用再执行了。如果while循环条件改为m<n，while循环退出后，数组num的元素全部被置0，无法输出最后一个出圈人的编号。

user: user-0
content: 引用 1 楼 halfword1982 的回复:m等于n-1时，圈内只有1个人了，while循环不用再执行了。如果while循环条件改为m<n，while循环退出后，数组num的元素全部被置0，无法输出最后一个出圈人的编号。 我看懂了，谢谢你。因为之前没有想明白，然后自己在草稿纸上计算时也弄错了。

user: user-3
content: 同上。。。。
user-0 提问: 求3*3矩阵对角线元素和

回复:
user: user-1
content: 1、scanf 没有加取地址符“&”  =====》scanf("%d",&a[i][j]); 2、如果是自己练习学习，想看到明显结果，可以再后面加一句getchar()； 这样程序运行后会等待你输入字符今后结束。  #include <stdio.h> int main() {     int i, j, a[3][3], s = 0;     printf("请输入任意9个数字:  ");     for (i = 0; i<3; i++)     {         for (j = 0; j<3; j++)             scanf("%d", &a[i][j]); // 修改的地方     }       for (i = 0; i<3; i++)     {         for (j = 0; j<3; j++)         if (i == j)         {                s += a[i][j] + a[i][2 - j];         }     }     printf("%d\n", s);      getchar();//修改的地方     return 0; }

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

user: user-3
content: scanf没有取地址scanf("%d",&a[i][j]);

user: user-4
content: #include <stdio.h> int main() { int i,j,a[3][3],s=0; printf("请输入任意9个数字:  "); for(i=0;i<3;i++) {for(j=0;j<3;j++)         scanf("%d",&a[i][j]); }     for(i=0;i<3;i++) {   //printf("%d%d",i,j); 	j=i; s+=a[i][j];  }	 printf("%d\n",s);  return 0;     }

user: user-5
content: #include <stdio.h> int main() { 	int i, j, a[3][3], s = 0; 	printf("请输入任意9个数字:  "); 	for (i = 0; i<3; i++) 	{ 		for (j = 0; j<3; j++) 			scanf("%d", &a[i][j]); //scanf("%d", a[i][j]); 	}  	for (i = 0; i<3; i++) 	{ 		for (j = 0; j<3; j++) 		if (i == j) 		{   //printf("%d%d",i,j); 			s += a[i][j] + a[i][2 - j]; 		}  	} 	printf("%d\n", s);  	return 0; }
user-0 提问: Apache Lucy使用C 语言编写，提供 Perl 语言的绑定，c++能调用吗？

回复:
user: user-1
content: C++将待加工的数据写到文本文件a.txt中,启动Perl Perl从文件a.txt中读取数据，调用Apache Lucy，将结果写到文本文件b.txt中，写完后将b.txt改名为c.txt,退出。 C++从c.txt文件中读出结果。  以上C++通过纯文本文件间接调用了Apache Lucy（使用C 语言编写，提供 Perl 语言的绑定）

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 你说的能具体点吗？c++怎么调用Lucy？

user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。
user-0 提问: VC输出字体，如图

回复:
user: user-0
content: 高手快来帮帮忙啊，急

user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> extern "C" HWND WINAPI GetConsoleWindow(); int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;      system("color F0");     system("cls");     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(12,0,900,900,0,0,0,0,0,0,0,0,0,"宋体");     SelectObject(hdc,hfont);     TextOutW(hdc,100,200,L"臭氧总量相对差别∕％",10);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     return 0; }   好强大！

user: user-2
content: #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> extern "C" HWND WINAPI GetConsoleWindow(); int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;      system("color F0");     system("cls");     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(12,0,900,900,0,0,0,0,0,0,0,0,0,"宋体");     SelectObject(hdc,hfont);     TextOutW(hdc,100,200,L"臭氧总量相对差别∕％",10);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     return 0; }
user-0 提问: 关于tc的图形初始化问题，高手请给个指点呗

回复:
user: user-1
content: 没定义　　　声明一下就可以了

user: user-2
content: http://www.easyx.cn

user: user-3
content: 你的TC是安装版还是解压拷贝版？设置里面关于directory的看一下，如include、lib等目录要与TC所在的目录一致。 TC在Windows下使用不方便（除非Win98），你也可以看一下http://www.easyx.cn，可以在VC里面使用TC的绘图函数，差不多完全兼容，看个示例就明白了。

user: user-0
content: 那怎样设置呢？

user: user-4
content: 没设置链接graphic的库？
user-0 提问: c语言文件问题求帮助

回复:
user: user-1
content: fwrite(head,sizeof(head),1,fp); fread(pnew,sizeof(head),1,fp); 这两句的sizeof都不正确。head是一个指针，sizeof得到的大小是指针类型的大小，也就是4。 而代码的愿意是把整个结构体写入文件，再读出来。所以这两句都要改成sizeof(struct sale)

user: user-2
content: 对,sizeof(head)得到的是指针占用空间大小有时和int占用同样大小.所以读int是这样用可能能得到正确结果,而读字符串是就不行了.因为字符串占了10个字节,肯定大于这个值.
user-0 提问: 数据转换

回复:
user: user-1
content: 通过位操作很难得到1,2,3这样的值吧，得到的应该是0,1,2,4这样的

user: user-2
content: 虽然你不希望用一个特定函数来做 但是看你初学的份上,就不屌你了  int    BinToDec(char *b,BOOL type) {        char ch;        int     r;        if(type) ch='1';        else  ch='0';        for(r=0;r<4;r++)        if(*(b+r)==ch) break;        r=4-r;        return r; }  type=false时转换串一类型 type=true时转换串二类型

user: user-3
content: 位操作都是 2*n   |可以

user: user-2
content: 第一串 char  *x="1110"; int       y; for(y=0;y<4;y++)    if(*(x+y)=='0') break; y=4-y; y就是转换的结果 第二串 char  *x="0010"; int       z; for(z=0;z<4;z++)    if(*(x+z)=='1') break; z=4-z; z就是转换的结果

user: user-4
content: 只看描述，要求用一个函数进行转换是不合理的。

user: user-5
content: 若只想得到结果，与、或、取反、异或、左移、右移组合使用肯定可以，但是好像没什么意思
user-0 提问: OpenGL如何设置鼠标位置？

回复:
user: user-1
content: 鼠标位置设置和OPENGL绘图有关系？

user: user-0
content: 引用 3 楼 vshoot99 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] C标准库和OpenGL都不应该负责在什么位置显示鼠标吧。     那么应该怎么指定鼠标位置呢？有什么思路或者解决办法吗？[/quote] SetCursorPos（）是需要windows支持的。

user: user-2
content: 找OpenGL的API啊，去官网找它的手册，这都是开放的东西

user: user-3
content: SetCursorPos The SetCursorPos function moves the cursor to the specified screen coordinates. If the new coordinates are not within the screen rectangle set by the most recent ClipCursor function, the system automatically adjusts the coordinates so that the cursor stays within the rectangle.   BOOL SetCursorPos(   int X,  // horizontal position   int Y   // vertical position );   Parameters X  Specifies the new x-coordinate, in screen coordinates, of the cursor.  Y  Specifies the new y-coordinate, in screen coordinates, of the cursor.  Return Values If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. To get extended error information, callGetLastError.   Remarks The cursor is a shared resource. A window should move the cursor only when the cursor is in its client area.   The calling process must have WINSTA_WRITEATTRIBUTES access to the window station.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Unsupported.   Header: Declared in winuser.h.   Import Library: Use user32.lib.  See Also Cursors Overview, Cursor Functions, ClipCursor, GetCursorPos, SetCaretPos, SetCursor, ShowCursor

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:C标准库和OpenGL都不应该负责在什么位置显示鼠标吧。     那么应该怎么指定鼠标位置呢？有什么思路或者解决办法吗？

user: user-3
content: 搜网络教程“学OpenGL编3D游戏”？

user: user-3
content: C标准库和OpenGL都不应该负责在什么位置显示鼠标吧。
user-0 提问: 0x1L在c语言中是什么意思

回复:
user: user-1
content: 0x1L long型整数。

user: user-2
content: C++ Integer Constants Integer constants are constant data elements that have no fractional parts or exponents. They always begin with a digit. You can specify integer constants in decimal, octal, or hexadecimal form. They can specify signed or unsigned types and long or short types.  Syntax  integer-constant :  decimal-constant integer-suffixopt octal-constant integer-suffixopt hexadecimal-constant integer-suffixopt 'c-char-sequence'  decimal-constant :  nonzero-digit decimal-constant digit  octal-constant :  0 octal-constant octal-digit  hexadecimal-constant :  0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-constant hexadecimal-digit  nonzero-digit : one of  1 2 3 4 5 6 7 8 9  octal-digit : one of  0 1 2 3 4 5 6 7  hexadecimal-digit : one of  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F  integer-suffix :  unsigned-suffix long-suffixopt long-suffix unsigned-suffixopt  unsigned-suffix : one of  u U  long-suffix : one of  l L  64-bit integer-suffix :  i64  To specify integer constants using octal or hexadecimal notation, use a prefix that denotes the base. To specify an integer constant of a given integral type, use a suffix that denotes the type.  To specify a decimal constant, begin the specification with a nonzero digit. For example:  int i = 157;   // Decimal constant int j = 0198;  // Not a decimal number; erroneous octal constant int k = 0365;  // Leading zero specifies octal constant, not decimal  To specify an octal constant, begin the specification with 0, followed by a sequence of digits in the range 0 through 7. The digits 8 and 9 are errors in specifying an octal constant. For example:  int i = 0377;   // Octal constant int j = 0397;   // Error: 9 is not an octal digit  To specify a hexadecimal constant, begin the specification with 0x or 0X (the case of the “x” does not matter), followed by a sequence of digits in the range 0 through 9 and a (or A) through f (or F). Hexadecimal digits a (or A) through f (or F) represent values in the range 10 through 15. For example:  int i = 0x3fff;   // Hexadecimal constant int j = 0X3FFF;   // Equal to i  To specify an unsigned type, use either the u or U suffix. To specify a long type, use either the l or L suffix. For example:  unsigned uVal = 328u;             // Unsigned value long lVal = 0x7FFFFFL;            // Long value specified                                    //  as hex constant unsigned long ulVal = 0776745ul;  // Unsigned long value

user: user-3
content: 整形常量的后缀表示其类型，包括如下后缀，其中U和L的大小写通用 后缀        类型 L           long int LL         long long int U          unsigned int UL        unsigned long int ULL      unsigned long long int

user: user-4
content: 字面值，后缀L表示是一个long型。0x1说它是一个十六进制数。

user: user-5
content: 没见过东西   好像不是asic码吧
user-0 提问: C语言子程序定义了返回类型，未return，为何能返回值

回复:
user: user-1
content: 读了函数名指向内存

user: user-2
content: 在你没找到编译器明确遵循的ABI前只能当成是运气。 不管怎么说从C的角度上这样写就是错的。

user: user-3
content: 不要盲目相信编译器 因为编译器也是人写的

user: user-4
content: EAX被默认为存储着返回值的Register.

user: user-5
content: 只是声明了void   只好还是看编译器
user-0 提问: openGL旋转时变形！

回复:
user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:改用平行投影？  没试过平行投影    能给点提示吗？谢谢

user: user-1
content: 改用平行投影？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:透视投影的话，不拉伸才不正常吧。我猜。 是啊    旋转的时候肯定会造成拉伸，我想要在旋转的时候图像不拉伸，应该如何修改呢

user: user-1
content: http://blog.csdn.net/pizi0475  搜网络教程“学OpenGL编3D游戏”。

user: user-1
content: 透视投影的话，不拉伸才不正常吧。我猜。
user-0 提问: 求大神帮我把这个C代码换成C++代码！！

回复:
user: user-1
content: 泡面吧的？ 引用 楼主 u014650107 的回复:求矩阵的逆矩阵 #include <stdlib.h> #include <math.h> #include <stdio.h>  double *inv(double *a,int n) {  int *is,*js,i,j,k,l,u,v;     double d,p;     is=(int*)malloc(n*sizeof(int));     js=(int*)malloc(n*sizeof(int));     for (k=0; k<=n-1; k++)       { d=0.0;         for (i=k; i<=n-1; i++)         for (j=k; j<=n-1; j++)           { l=i*n+j; p=fabs(a[l]);             if (p>d) { d=p; is[k]=i; js[k]=j;}           }         if (d+1.0==1.0)           { free(is); free(js); printf("err**not inv\n");             return NULL;           }         if (is[k]!=k)           for (j=0; j<=n-1; j++)             { u=k*n+j; v=is[k]*n+j;               p=a[u]; a[u]=a[v]; a[v]=p;             }         if (js[k]!=k)           for (i=0; i<=n-1; i++)             { u=i*n+k; v=i*n+js[k];               p=a[u]; a[u]=a[v]; a[v]=p;             }         l=k*n+k;         a[l]=1.0/a[l];         for (j=0; j<=n-1; j++)           if (j!=k)             { u=k*n+j; a[u]=a[u]*a[l];}         for (i=0; i<=n-1; i++)           if (i!=k)             for (j=0; j<=n-1; j++)               if (j!=k)                 { u=i*n+j;                   a[u]=a[u]-a[i*n+k]*a[k*n+j];                 }         for (i=0; i<=n-1; i++)           if (i!=k)             { u=i*n+k; a[u]=-a[u]*a[l];}       }     for (k=n-1; k>=0; k--)       { if (js[k]!=k)           for (j=0; j<=n-1; j++)             { u=k*n+j; v=js[k]*n+j;               p=a[u]; a[u]=a[v]; a[v]=p;             }         if (is[k]!=k)           for (i=0; i<=n-1; i++)             { u=i*n+k; v=i*n+is[k];               p=a[u]; a[u]=a[v]; a[v]=p;             }       }     free(is); free(js);     return a; }   void display(double M[],int n) /*显示结果*/ {   int i,j; double *result=NULL,*A=NULL;  /*显示原矩阵*/ printf("\n\nThe OriginalMatrix is:\n");      for(i=0;i<n;i++) {    for(j=0;j<n;j++)    {        printf("%10.4f\t", M[i*n+j]);         }       printf("\n"); }        A=(double*)malloc(n*n*sizeof(double)); for(i=0;i<n*n;i++) A[i]=M[i]; result=inv(A,n); if(result!=NULL) {    printf("\n\nThe InverseMatrix is:\n");    for(i=0;i<n;i++)    {    for(j=0;j<n;j++)    {        printf("%10.4f\t", result[i*n+j]);         }       printf("\n");    } } else {    printf("The Matrix is singular ! Can't be inverse!\n"); } free(A); }   #include <conio.h> /* Test */ void main() { double matrix[3][3]={{1,-5,-2},{-1,3,1},{3,-4,-1}}; double matrix1[3][3]={{0,0,0},{-1,3,1},{3,-4,-1}}; double matrix2[4][4]={{3,2,1,1},{2,3,5,9},{-1,2,5,-2},{1,0,-1,3}}; display(matrix[0],3); display(matrix1[0],3); display(matrix2[0],4); printf("push any key to be end ."); getch(); } 求编译好用

user: user-2
content: C++直接调呗， extern "C"

user: user-3
content: 求逆矩阵？ 高斯消元法吧， 网上很多现成代码,搜索gaussj

user: user-4
content: 引用 1 楼 user-5 的回复:引用赵老师的话，1000行以内的代码不要用C++写。  记不得哪位C++大牛在哪本学习C++的书的前言里面说过 “用C语言1000行源码能完成的工作千万不要用C++重写！”  不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。

user: user-0
content: 这只是一部分。。 求帮忙！

user: user-5
content: 引用赵老师的话，1000行以内的代码不要用C++写。
user-0 提问: 广义表问题求解

回复:
user: user-1
content: ((c))的 tail 不是 (c)么？？难道一个元素的表尾为空表？？ 不过却是不懂这东西。 写个lisp 程序验证一下

user: user-0
content: UPUP..我认为第二个Tail得到的是(((c)))。。。

user: user-2
content: 第二个Tail得到(((c)))才对吧？外面还有一个括号。。  比如C=(a,(b,c,d)) Tail(c)=((b,c,d))

user: user-3
content: 结果为空。 第一个Head得到((a,b),((c))) 第二个Tail得到((c)) 第三个Tail得到空。
user-0 提问: lua与 C交互问题，请教各位

回复:
user: user-1
content: sql2zy大大，问题，解决了吗？ 我遇到同样的问题。 能告诉我你的解决方法吗？我的邮箱 39514004@qq.com

user: user-2
content: http://blog.codingnow.com/
user-0 提问: gsoap 客户端程序如何获取返回的字符串

回复:
user: user-1
content: 那这样在server端进行申请空间不释放，不会造成内存泄露吗

user: user-0
content: 没有回应啊,我找到原因了，是客户端调用的方法不对。  客户端接收参数应用如下形式 char *t; soap_call_ns2__getstr(&soap,server,"",argv[2],&t);

user: user-0
content: 再明确一下问题： 如何返回字符串类型？  How to return string from GSOAP method?
user-0 提问: 我装了一个vc++6.0，但是运行遇到了很多问题，求助！！

回复:
user: user-1
content: VC6，如果按计算机纪元，相当于中世纪的东西，除非你打算穿越到宋朝，否则不要用。

user: user-0
content: 那我应该下一个什么版本的啊？？？要学c语言。。。      求下载地址，不要试用期的那种

user: user-2
content: 引用 10 楼 u014403258 的回复:那我应该下一个什么版本的啊？？？要学c语言。。。      求下载地址，不要试用期的那种 可以使用C-Free，http://download.csdn.net/detail/u012421456/7374337

user: user-3
content: vs2013，6.0太老了吧

user: user-4
content: 兼容性问题。可以去找绿色版下载。

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

user: user-6
content: VC2010

user: user-7
content: 楼主，现在已经是2014年了。编程不是搞考古，用个新点的版本吧。

user: user-8
content: 起码也得用个VS2008吧。

user: user-2
content: 这个好像不用管啊！我的也有，不过不提醒，平时好像也不耽误使用啊！还有VC6.0已经很老了，存在一些问题，如果非要使用，建议在装一个新一点儿的编译器

user: user-9
content: 楼上赵老师正解，这个问题微软给出了解决方案，但这个问题的根源好像是来自office2007，不是操作系统。

user: user-5
content: 以XP兼容模式运行 以管理员身份运行  FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn
user-0 提问: C语言中的宏定义

回复:
user: user-1
content: 请亲自阅读  引用 2 楼 zyaiwx 的回复:int范围是-2^32 -- 2 ^32 - 1。 你没超过这个范围，自然不用做转换。 而且，如果加了UL，前面最好变为unsigned long s = SECONDS_PER_YEAR; 否则容易溢出 请给出 int范围是-2^32 -- 2 ^32 - 1 的证据。 60*60*24*365 为啥容易溢出 ？？

user: user-2
content: 请亲自阅读include\limits.h的内容。

user: user-3
content: 60*60*24*365 =31536000； 2**32 -1 =4294967295; 没有超过int

user: user-4
content: int范围是-2^32 -- 2 ^32 - 1。 你没超过这个范围，自然不用做转换。 而且，如果加了UL，前面最好变为unsigned long s = SECONDS_PER_YEAR; 否则容易溢出

user: user-5
content: 31536000又没有超过int类型的上限...
user-0 提问: 求懂C编程也懂一点虚拟化libvirt相关技术的人解答小问题

回复:
user: user-1
content: 这个是因为链接的时候没有链上动态库，所以在编译的时候把libvirt的so文件链上就行了 就是楼上说的：gcc -lvirt

user: user-2
content: 编译的时候加上 -lvirt gcc -lvirt

user: user-0
content: 引用 1 楼 user-3 的回复:-L -l指定库路径哈。 大哥能不能详细点，我centos 刚入门，解决问题了满分奉上！跪求

user: user-3
content: -L -l指定库路径哈。
user-0 提问: 求牛人来解答个tcp问题？

回复:
user: user-1
content: seq 用于表示你已经发送了多少数据， ack 用于表示你已经接收确认了多少数据。

user: user-2
content: 学会使用抓包软件比如wireshark。

user: user-3
content: 引用三次握手期间是否也可以传输数据呢？ 不可以。   引用建立连接后，seq 和ack序列号怎么变化 ？是seq  ack 就确定了吗 还是和三次握手一样，每次都有确认新的ack+1 变化呢？    引用其次如果数据太大，一个包无法传输完毕， TCP没有包的概念，TCP是流， 需要自行粘包。

user: user-4
content: 楼主下个软件Ethereal，然后监听一下，看TCP/IP详解就什么都明白了。

user: user-5
content: 握手期间不传数据。序号的变化需要阅读TCP的书或者规范，有个滑动窗口协议，还有点小复杂。
user-0 提问: 很简单的一个程序，但是总是出错不知道是为什么？

回复:
user: user-0
content: #include<stdio.h> void main() {double i,j,k;        //j为买的天数，i为买的苹果个数，k为总价。 double v; k=0; j=0;   for(i=2;i<=100;i*=2)  {    k=k+i*0.8;        ++j; } i=i/2;    //上面循环的时候会让i多循环一轮，这样产生的i=128的时候跳出循环，最后j的值正常是6，但是i不正常是128所以除以二  v=k/j; printf("%f\n%f\n%f\n",i,j,v); }  这是我参考各位的回复最后的程序。

user: user-1
content: 恩，还真是呢。这些小问题可不能忽视呀，不然编译不通过甚是没撤。虽然都是不起眼的小问题，可是不杜绝的活。要是写个稍微大些的程序可是要纠结死的啦，楼主你说是吧？ 慢慢来，会一步步的走起来的。

user: user-2
content: 问话费？得去找移动。 小问题不少 首先，v不是int的 其次，i*=2 然后，j赋值错了，因为j++的位置 最后，printf里斜杠打反了。

user: user-3
content: 问题有两个。 一是for循环中 i=*2,应该写作 i*=2 第二个，k的类型应该为float，不应该是int k = 0; k = k + i * 0.8

user: user-4
content: 既然自己搞不对，就不要认为它很简单

user: user-5
content: #include <stdio.h> void main() { 	double i,j,k,v;        //j为买的天数，i为买的苹果个数，k为总价。 	k=0; 	j=1; 	for(i=2;i<=100;i*=2) 	{ 		k=k+i*0.8; 		j++; 	} 	j--; 	v=k/j; 	printf("%f %f",j,v); }

user: user-5
content: i=*2，这个应该是i*=2吧，就是i=i*2; 还有，既然你k=k+i*0.8，那你k就需要定义为float型，你这里k为int类型，又没有强转，精度会下降的

user: user-6
content: j=1; //这里J初始值应该是0，不然的话在第一天买2个苹果的时候，J就增长到2了 for(i=2;i<=100;i=*2)  //应该是i*=2，而不是i=*2  {    k=k+i*0.8;    j++; }

user: user-7
content: 引用 3 楼 a515360208 的回复:是不是这里的问题for(i=2;i<=100;i*=2)注意是i*=2还有一个问题，j的初始值应该是0,不是1

user: user-7
content: 是不是这里的问题for(i=2;i<=100;i*=2)注意是i*=2

user: user-8
content: 用不用考虑购买的天数呢？第七天是128，超过100，所以你的算法只能算前六天的平均花费 个人见解，不喜忽略

user: user-9
content: 参考 #include<stdio.h> int main() { 	int sum=0; 	int day; 	int day_num=2; 	for(day=1;day_num<=100;day++) 	{ 		sum+=day_num; 		day_num*=2; 	} 	day--; 	printf("%3d %3d %.3f",day,sum,sum*1.0/day); 	return 0; }
user-0 提问: 第一次在poj上做题，被accepted了

回复:
user: user-1
content: poj 是神马？有链接吗？

user: user-0
content: 引用 1 楼 u012061345 的回复:最好打印换行符。不拘小节，你也写过poj的题目吗，多少题了啊

user: user-0
content: 引用 3 楼 fetag 的回复:poj 是神马？有链接吗？http://poj.org/

user: user-2
content: poj里我还有个题至今还是top（

user: user-3
content: 最好打印换行符。
user-0 提问: 关于return返回局部变量指针问题

回复:
user: user-1
content: 字符数组str。数组名str代表的是这个str[0]即第一个字符的地址，也就是说，如果你使用*str 那么它的值是一个字符的地址。如果你使用%s的话，那么就会出问题。 而显式的定义字符指针char * str 那么str指向的是一个字符串的首地址。若使用%s来输出那么可以得到正确结果。

user: user-2
content: 不要返回局部变量的地址或引用

user: user-0
content: 引用 9 楼 u013163178 的回复:#include <stdio.h> char (& arry1())[12]; char * arry2(); int main(void) { 	char *ch1,*ch2; 	ch1 =arry1(); 	ch2 =arry2(); 	printf("%s\n",ch1); 	printf("%s\n",ch2); 	 	return 0; } char (& arry1())[12] { 	static char s[12]="Hello Word!"; 	return s; } char *arry2() { 	char *s="Hello Word!"; 	return s; } ------------------------------------------------------------------------------------------------------------------------------------------- #include <stdio.h> char * arry1(); char * arry2(); int main(void) { 	char *ch1,*ch2; 	ch1 =arry1(); 	ch2 =arry2(); 	printf("%s\n",ch1); 	printf("%s\n",ch2); 	 	return 0; } char *arry1() { 	static char s[12]="Hello Word!"; 	return s; } char *arry2() { 	char *s="Hello Word!"; 	return s; }  bingo!!!~~加static不释放局部变量

user: user-3
content: 我就不重复了，给你找了个帖子，你注重区分一下，栈区和静态数据段区的不同！ http://blog.csdn.net/daiyutage/article/details/8605580

user: user-4
content: char * a ="helo"; char *b ="helo"; a==b char c []="helo"; a!=c;

user: user-5
content: 刚刚又查了下相关资料，建议LZ去看看数据的存储方式 http://blog.sina.com.cn/u/2218913762

user: user-6
content: 返回的地址不一样，一个是常量字符串的存储地址，一个是局部变量的存储地址。 常量字符串的存储地址，读取是没有问题的，不可写； 局部非静态变量的存储地址，读写都很有问题。因为函数已经结束运行了。 那部分地址另有安排了。

user: user-7
content: ls说的对 array1中返回的字符数组为局部变量，函数结束后数组中数据内存被收回。  array2中str是指针， str被撤销，但是其指向的地址数据未改变，返回的地址中数据依然存在。

user: user-5
content: 这个你要弄清楚常量和变量的概念，char str1[] = "hello"; char *str2 = "hello"; 1、return str1 返回的是一个临时变量的地址 2、str2指向的是一个常量字符串，return str2返回的是指向常量字符串的地址，是一直存在的 但这种做法不太好，一般是先动态分配一块内存，用完后free掉

user: user-8
content: 引用 1 楼 a515360208 的回复:2、str2指向的是一个常量字符串，return str2返回的是指向常量字符串的地址，是一直存在的 但这种做法不太好，一般是先动态分配一块内存，用完后free掉 直接return字符串字面量 在C语言里面 没什么不好

user: user-9
content: #include <stdio.h> char (& arry1())[12]; char * arry2(); int main(void) { 	char *ch1,*ch2; 	ch1 =arry1(); 	ch2 =arry2(); 	printf("%s\n",ch1); 	printf("%s\n",ch2); 	 	return 0; } char (& arry1())[12] { 	static char s[12]="Hello Word!"; 	return s; } char *arry2() { 	char *s="Hello Word!"; 	return s; } ------------------------------------------------------------------------------------------------------------------------------------------- #include <stdio.h> char * arry1(); char * arry2(); int main(void) { 	char *ch1,*ch2; 	ch1 =arry1(); 	ch2 =arry2(); 	printf("%s\n",ch1); 	printf("%s\n",ch2); 	 	return 0; } char *arry1() { 	static char s[12]="Hello Word!"; 	return s; } char *arry2() { 	char *s="Hello Word!"; 	return s; }

user: user-0
content: 引用 2 楼 y_gemini 的回复:ls说的对 array1中返回的字符数组为局部变量，函数结束后数组中数据内存被收回。  array2中str是指针， str被撤销，但是其指向的地址数据未改变，返回的地址中数据依然存在。3Q

user: user-0
content: 引用 1 楼 a515360208 的回复:这个你要弄清楚常量和变量的概念，char str1[] = "hello"; char *str2 = "hello"; 1、return str1 返回的是一个临时变量的地址 2、str2指向的是一个常量字符串，return str2返回的是指向常量字符串的地址，是一直存在的 但这种做法不太好，一般是先动态分配一块内存，用完后free掉谢谢，现在大概有些了解了~

user: user-0
content: 引用 5 楼 user-10 的回复:楼主这是啥开发环境，好奇特啊,跟我们的不一样我用的Qt

user: user-10
content: 楼主这是啥开发环境，好奇特啊,跟我们的不一样
user-0 提问: 关于buf是什么意思

回复:
user: user-1
content: 64字节的缓冲区？

user: user-2
content: long static int const long volatile unsigned x;     printf("%d",sizeof x);

user: user-3
content: 无符号的整形数组，buf是指向数组的指针

user: user-4
content: 你没说清楚，我猜UINT8 buf[64]只是一个保存数据的缓冲区
user-0 提问: 查找一个指定字符在给定字符串中的出现的位置(和个数)

回复:
user: user-1
content: //返回字符在字符串中出现的位置，如果没找到返回NULL int* findchar(char* str, char c, int& count) { 	if( str == NULL ) 		return NULL; 	count = 0; 	for(int i(0);str[i]!='\0';i++) 	{ 		if( str[i] == c ) 			count++; 	} 	if( count<1 ) 		return NULL; 	int* pos = new int[count]; 	int index = 0; 	for(int i(0);str[i]!='\0';i++) 	{ 		if( str[i] == c ) 		{ 			pos[index] = i; 			index++; 		} 	} 	return pos; }  int main() { 	int count; 	char _str[100]; 	char c; 	cout<<"请输入字符串:"<<endl; 	cin>>_str; 	cout<<"请输入待查找的字符:"<<endl; 	cin>>c; 	int* pos = findchar(_str,c,count); 	if( pos ) 	{ 		cout<<"个数为:"<<count<<endl; 		cout<<"对应字符串的位置:"; 		for(int i(0);i<count;i++) 			cout<<pos[i]<<"  "; 		cout<<endl; 	} 	else 		cout<<"没有找到对应字符"<<endl; 应该ok的，你试试吧

user: user-2
content: int num(char *p, char *p2, int *n) { 	 	char *temp;    //临时指针用来做判断 	int k = strlen(p);//算出字符串Str的长度;也就是strinp的长度； 	while (p2 != '\0')   //如果到了那个比较长的字符串的末尾跳出循环 	{ 		temp =strstr(p2, p); 		if(temp!= NULL)  //判断字符串STROUT。里面是否存在str  没有存放的话就等于null下面就直接跳出循环 		{ 			(*n)++;     //调入进来的n++; 			p2 = p2 + strlen(p);  			continue; 		} 		else          		{ 			break;   		} 	}  }  int main() { 	char strinp[] = "crazyspopcorn";  //定义一个字符型数组变量 	char strout[] = "crazyspopcornzuishuaiqilecrazyspopcornzuipiaole"; 	int n = 0; 	num(strinp, strout, &n); 	printf("%d",n); 	system("pause");   }   头文件的话。楼主自家加哦~~这是调用函数的。楼主可以自己改写成一个函数的。希望能帮助到你;谢谢里面都有注释的。

user: user-3
content: 写个伪代码: for(每个字符位置){     如果(发现 字符 ch)     {          计数加一;输出数据位置;    }    否则/** 没发现,**/            什么也不做; } 输出计数;
user-0 提问: 不理解C Primer Plus上高级数据表示那一章

回复:
user: user-1
content: “实际参数有的是movies，有的却是&movies” 是不是前者形参是引用，后者形参是指针？

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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: 引用 2 楼 shimachao 的回复:我猜指针的指针是必须的。如果要改变一个指针变量的值，那就传指针的地址，那么函数形参就是指针的指针，实参就是取指针变量的地址。如果只是改变指针指向的变量。那就直接传指针就行，那么函数形参就是指针类型，实参也直接传入指针变量就行。但是函数的原型里形参都是指针的指针

user: user-0
content: 引用 3 楼 sholber 的回复:movies是啥子撒？没看过这本书。movies是一个指向链表的指针变量

user: user-3
content: movies是啥子撒？没看过这本书。

user: user-4
content: 我猜指针的指针是必须的。如果要改变一个指针变量的值，那就传指针的地址，那么函数形参就是指针的指针，实参就是取指针变量的地址。如果只是改变指针指向的变量。那就直接传指针就行，那么函数形参就是指针类型，实参也直接传入指针变量就行。

user: user-5
content: 上机实验，就知道哪个对了
user-0 提问: 在for loop内没寻找到某值的提示？

回复:
user: user-0
content: Thank you so much.

user: user-1
content: bool b=false; for(i=1;i<=10000;i++) {   x=sqrt(i+60);   y=sqrt(i+252);   if(x*x==i+60&&y*y==i+252）   {     printf("i is a complete number and is:%ld\n",i);     b = true;   } } if(false == b)   printf("complete number not found\n");