注册 登录
编程论坛 C语言论坛

求大神解答一下,为啥指针s不做变化

赵宇宁 发布于 2022-04-11 16:31, 1740 次点击
#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);
}
5 回复
#2
rjsp2022-04-11 17:59
我都看不懂你这代码是想实现什么功能,为什么不将题目贴出来呢?

是这个意思吗?
程序代码:
#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.
#3
赵宇宁2022-04-12 18:02
回复 2楼 rjsp
第一次用不太了解,我是想问那个程序里的calloc是开辟了后面一个内存吗,然后让指针指向的后面,所以指针没有改变,因为我试了试,没有这一个语句程序是指针是改变的值
#4
rjsp2022-04-12 22:29
我听不懂你在说什么呀!
要不,我自说自话,看看能不能碰巧回答你的问题

程序代码:
#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 );
}
#5
lwei2022-04-13 10:22
#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);
}
#6
taotie_脉络2022-04-15 17:27
额,首先呢,你这个引入 #include "stdio.h" 的方式是不对的,如果不是自己封装的头部文件,是不能使用"",需要用<>。其次你的main函数,为什么不完整?
1