标题:求大神解答一下,为啥指针s不做变化
只看楼主
赵宇宁
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2022-4-11
结帖率:0
已结贴  问题点数:20 回复次数:5 
求大神解答一下,为啥指针s不做变化
#include"stdio.h"
#include"stdlib.h"
void fun(double *p1,double *p2,double *s)
{
s=(double *)calloc(1,sizeof(double));
*s=*p1+*(p2+1);

}
main
{double a[2]={1.1,2.2},b[2]={10.0,20.0},*s=a;
fun(a,b,s);
printf("%5.2f\n",*s);
}
搜索更多相关主题的帖子: 指针 double include 变化 fun 
2022-04-11 16:31
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:7 
我都看不懂你这代码是想实现什么功能,为什么不将题目贴出来呢?

是这个意思吗?
程序代码:
#include <stdio.h>

void fun( const double p1[], const double p2[], double* s )
{
    *s = p1[0] + p2[1];
}

int main( void )
{
    double a[2] = { 1.1, 2.2 };
    double b[2] = { 10.0, 20.0 };
    fun( a, b, a );
    printf( "%5.2f\n", a[0] );
}
仍然挺奇怪的。

而“为啥指针s不做变化”,可以这么想
程序代码:
#include <stdio.h>

void fun( int a )
{
    a = 3;
}

int main( void )
{
    int b = 0;
    fun( b );
    printf( "%d\n", b ); // 这里的b值依然是0
}

上面的输出结果能理解吗?换成指针也一样
程序代码:
#include <stdio.h>

void fun( void* a )
{
    a = (void*)3;
}

int main( void )
{
    void* b = 0;
    fun( b );
    printf( "%p\n", b ); // 这里的b值依然是0
}

你先给a赋了一个值,然后又给赋了另一个值,难道第一个值就会变成第二个值?
a = 0;
a = 1;
此时 0 依然是 0,不会因为它赋值给a,a又变成了1,它自身就会变成1.
2022-04-11 17:59
赵宇宁
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2022-4-11
得分:0 
回复 2楼 rjsp
第一次用不太了解,我是想问那个程序里的calloc是开辟了后面一个内存吗,然后让指针指向的后面,所以指针没有改变,因为我试了试,没有这一个语句程序是指针是改变的值
2022-04-12 18:02
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
我听不懂你在说什么呀!
要不,我自说自话,看看能不能碰巧回答你的问题

程序代码:
#include <stdio.h>

double fun( double a, double b )
{
    return a + b;
}

int main( void )
{
    double result = fun( 1.1, 20.0 );
    printf( "%5.2f\n", result );
}

这就是一个正统的,通过返回值带回结果的例子。

对于上面的代码,如果不通过返回值来返回,而是通过参数来返回的话,你得将一个接受结果的地址给函数,让函数把结果填写到其上
程序代码:
#include <stdio.h>

void fun( double a, double b, double* p )
{
    *p = a + b;
}

int main( void )
{
    double result;
    fun( 1.1, 20.0, &result );
    printf( "%5.2f\n", result );
}


如果是想将结果存在一段内存中,然后返回这段内存的地址,那么就是
程序代码:
#include <stdio.h>
#include <stdlib.h>

double* fun( double a, double b )
{
    double* p = malloc( sizeof(double) );
    *p = a + b;
    return p;
}

int main( void )
{
    double* p = fun( 1.1, 20.0 );
    printf( "%5.2f\n", *p );
    free( p );
}


对于上面的代码,如果不通过返回值来返回,而是通过参数来返回的话,你得将一个接受结果的地址给函数,让函数把结果填写到其上
程序代码:
#include <stdio.h>
#include <stdlib.h>

void fun( double a, double b, double** pp )
{
    *pp = malloc( sizeof(double) );
    **pp = a + b;
}

int main( void )
{
    double* p;
    fun( 1.1, 20.0, &p );
    printf( "%5.2f\n", *p );
    free( p );
}
2022-04-12 22:29
lwei
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:197
专家分:369
注 册:2005-5-4
得分:7 
#include"stdio.h"
#include"stdlib.h"
void fun(double *p1,double *p2,double *s)  //C函数是值传递的,在函数内部不管你对s如何操作退出后都是原来的值,这里不变的是指针本身,
{

s=(double *)calloc(1,sizeof(double));  //这里s指向了新的地址,同外面那个s指向的地址不一样了,在函数退出之后,这个会被丢弃掉的
*s=*p1+*(p2+1);

}
main
{double a[2]={1.1,2.2},b[2]={10.0,20.0},*s=a;  //如果你把这个×s=a去掉,程序会报错的。
fun(a,b,s);
printf("%5.2f\n",*s);
}

2022-04-13 10:22
taotie_脉络
Rank: 1
等 级:新手上路
帖 子:1
专家分:7
注 册:2022-3-26
得分:7 
额,首先呢,你这个引入 #include "stdio.h" 的方式是不对的,如果不是自己封装的头部文件,是不能使用"",需要用<>。其次你的main函数,为什么不完整?
2022-04-15 17:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-508823-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.304261 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved