c语言-初学C语言,一个小问题

问题描述

初学C语言,一个小问题

#include
#include
void fun(float *p1,float *p2,float *s)
{s=(float *)calloc(1,sizeof(float));
*s=*p1+*p2++;
}
void main()
{float a[2]={1.1,2.2},b[2]={10.0,20.0},*s=b;
fun(a,b,s);printf("%5.2fn",*s);
}
为什么程序的结果是10.00呢?

解决方案

因为fun函数中float *s _只能改变s指向地址的值,针对本身地址的指向不会做改变。
所以函数中对s重新calloc,只是在函数域中自动为s重新创建一个临时的空间,这时的s就不再是实参指向的s(main函数中)了,可以简单的认为是函数域自己的一个局部变量s指向了一块临时空间,之后的操作只是对临时空间的操作,并不会影响实参s,即main函数中float
*s_。
要想改变main函数中s的值,没必要在函数中重新对s分配一块空间:
void fun(float *p1,float *p2,float *s)
{
*s=*p1+*p2++;
}

解决方案二:

s 在函数中分配的地址,只在函数中有效,出了函数就无效了。想有效,必须 使用指向指针的指针。

解决方案三:

因为fun函数中float *s _只能改变s指向地址的值,针对本身地址的指向不会做改变。
所以函数中对s重新calloc,只是在函数域中自动为s重新创建一个临时的空间,这时的s就不再是实参指向的s(main函数中)了,可以简单的认为是函数域自己的一个局部变量s指向了一块临时空间,之后的操作只是对临时空间的操作,并不会影响实参s,即main函数中float
*s_。
要想改变main函数中s的值,没必要在函数中重新对s分配一块空间:
void fun(float *p1,float *p2,float *s)
{
*s=*p1+*p2++;
}

解决方案四:

局部变量函数结束后就释放了

解决方案五:

这个还是蛮重要的概念 楼上那些人说的对,要想改变p的值就要用1.指针的指针传入函数。2.用return返回一个值,在main中有变量接受

好好学,我也是菜鸟,加油~

解决方案六:

你的函数其实什么都没做,就是相当于输出*s ,*s取的是b的首地址,那你觉得*s除了输出10还想输出什么???

解决方案七:

一开始s=b[0],然后将s地址传给fun函数,但是fun中为s重新开辟空间,返回main函数后其实s原来空间的值没有改变

解决方案八:

一开始s=b[0],然后将s地址传给fun函数,但是fun中为s重新开辟空间,返回main函数后其实s原来空间的值没有改变

解决方案九:

像calloc,malloc函数分配的是堆空间,动态的,是不能返回地址的。其实你想要它返回地址,只要给子函数传一个二级指针过去就行了,如下:

void main()
{
float a[2]={1.1,2.2},b[2]={10.0,20.0},*s=b;
fun(a,b, &s);printf("%5.2fn",*s);
}

解决方案十:

子函数中改成:
*s=(float *)calloc(1,sizeof(float));

时间: 2024-09-16 19:56:22

c语言-初学C语言,一个小问题的相关文章

C语言字符串指针的一个小问题

问题描述 C语言字符串指针的一个小问题 题目如图,答案是又定义了一个指针变量做的.而我的答案编译出来结果也对,就是会运行结束之后出现一个警告对话框.不明白怎么回事,第三幅我的答案有什么问题吗?请问如果不用答案的那种编译方法,我的这种方法可不可行?能改进不报错吗? 解决方案 你的程序没有发现问题 #include <stdio.h> void fun(char * a) { int i = 0, j = 0; while (a[i] == '*') i++; for (; a[i] != '';

printf-c语言中阶乘的一个小问题,求解答

问题描述 c语言中阶乘的一个小问题,求解答 #include #include #include #include int main() { const int MODE=1000000; int s=0; int i,j,n; scanf("%d",&n); for(i=1;i<=n;i++) { int factorial=1; for(j=1;j<=i;j++) factorial=(factorial*j%MODE); s=(s+factorial)%MOD

Java初学一枚 一个小程序 求有人帮我看看

问题描述 Java初学一枚 一个小程序 求有人帮我看看 package malnAV; public class Work3_3 { public static void main(String[] args) { //??? //方法 main 不能声明为"静态":只能在静态类型或顶级类型中才能声明静态方法 Emp e1=new Emp(001,"张三"); Emp e2=new Emp(002,"李四"); Emp e3=new Emp(00

c语言-关于opengl的一个小游戏

问题描述 关于opengl的一个小游戏 刚学的图形学,老师只讲了点理论就要我们做课设,所以opengl都没来得及认真学.在做一个小游戏,需要从窗口上方随机的一个位置掉下来一个东西,在这个东西运动一段距离后,还有陆陆续续掉东西(屏幕上会出现多个东西,而且运动轨迹不同,也不会彼此收到影响).我只能做到一个物品消失后再生成,怎样实现多个物品在屏幕上依次出现并做各自的运动?希望有经验的各位多多指教,提供一种方法,能有源码参考就更好了.谢谢!用C语言实现. 解决方案 http://www.pudn.com

c语言-初学C语言中数组下标的问题

问题描述 初学C语言中数组下标的问题 void strtol(char s[]){ int i=0; while(s[i++]); while(i>=0) s[i--]=s[i]; } 发现没有报错,怎么解释呢 显然会出现s[0]=s[-1]不是吗 解决方案 s[i--]=s[i]; 这个执行的是s[i]=s[i]; i--; 再说了,就算数组访问下溢,也不会报错. 解决方案二: s[-1]相当于*(s-1),也就是说数组的第一项之前的一字节内存.越界了.编译器没有你想象的那么智能,所以没报错

初学JAVA的一个小问题,望高人解答!

问题描述 packagechapter3;importjavax.swing.*;importjava.awt.*;publicclassColoredRectangle{//描述对象的实例变量privateintwidth;//矩形宽度privateintheight;//矩形高度privateintx;//矩形的x坐标privateinty;//矩形的y坐标privateJFramewindow;//显示矩形的窗口privateColorcolor;//矩形的颜色//ColoredRecta

c语言-C语言的一个小问题 求解答

问题描述 C语言的一个小问题 求解答 计算机问题求解答">如题 我的代码是这样 #includeint main(){ double xy; printf(""输入数据:""); scanf(""%lf""&x); if(x<1) y=x;else if(x>=1&&x<=10) y=2*x-1;else if(x>10) y=3*x-11;printf(&quo

ascii-C语言文件读写和类型转换的一个小问题

问题描述 C语言文件读写和类型转换的一个小问题 #include <stdio.h> #include <Windows.h> main() { FILE *f; int c; errno_t err = fopen_s(&f,"E:\workspace\TVPLAY\data\diffFrame\txts\file2.txt","r"); if (err) { printf("can't open filen")

图片-有关C语言数组的一个小问题

问题描述 有关C语言数组的一个小问题 这是题目 这是我做的 但是不知道为什么我这个写出来只能完成一半 那个"不存在"的提醒不管什么情况都会显示出来 想请教一下啊 谢谢了 解决方案 首先i应该从0开始赋值,否则就会把a[0]也就是T漏掉.其次,判断不存在应该是所有位置都找过以后以后才能判断确实不存在,而不是每个位置都在判断. 具体做法是把不存在的输出放在循环体外面进行判断,然后增加一个变量t并赋初值为0,在找到的时候让t的值变为1,这样一来可以明白:在循环完成之后如果t的值为1就说明找到