如何使用指针返回2个值?(参见以下代码) 浮点根(float*p,float*r,intj); main() { 浮点数a[3],i; 浮根; printf(“输入三个值”); scanf(“%f%f%f”、&a[0]、&a[1]、&a[2]); 对于(i=0;i

如何使用指针返回2个值?(参见以下代码) 浮点根(float*p,float*r,intj); main() { 浮点数a[3],i; 浮根; printf(“输入三个值”); scanf(“%f%f%f”、&a[0]、&a[1]、&a[2]); 对于(i=0;i,c,pointers,C,Pointers,您在代码中混合了“值”、“指针”和“数组”概念: 在这一行 float roots(float *p,float *r,int j); main() { float a[3],i; float root; printf("enter three value"); scanf("%f%f%f",&a[0],&a[1],&a[2]); for(i=0;i<2;i++) { roots(&a,&

您在代码中混合了“值”、“指针”和“数组”概念:

在这一行

float roots(float *p,float *r,int j);
main()
{
    float a[3],i;
    float root;
    printf("enter three value");
    scanf("%f%f%f",&a[0],&a[1],&a[2]);
    for(i=0;i<2;i++)
    {
        roots(&a,&root,i);
    printf("%f\n",root);
    }
}
float roots (float *p,float *r,int j)
{
    if(j==0)
    {
        *r=(- *(p+1)+sqrt((*(p+1) * *(p+1))-4*(*p) * *(p+2)))/2*(*p);
    return(*r);
    }
    if(j==1)
    {
         *r=(- *(p+1)-sqrt((*(p+1) * *(p+1))-4*(*p) * *(p+2)))/2*(*p);
    return(*r);
    }

}
由于您希望访问其元素,因此无需使用(&)运算符的地址来传递数组a,因为“a”已经是数组a的第一个元素的标签,即a已经持有数组的第一个元素的地址。使用&a实际上传递的是:

在标准C中,&arr生成指向整个数组的指针,类型为pointer-to-array-of-T

对于简单数组

INTA[10]

对a的引用具有指向int的类型
指针,“,&a是指向10 int数组的
指针。”

在函数的定义中

    roots(&a,&root,i);
您混合使用了解引用运算符和乘法运算符,这使得代码的可读性大大降低,并且更容易出现错误:

float roots (float *p,float *r,int j)
看起来您正在尝试实现,但这并不是很明显

最后,在函数的定义中,您还使用解引用操作符返回r值的副本,但结果被main丢弃,函数在指针上运行:不需要return语句,您可以将返回数据类型更改为void和remove

    *r=(- *(p+1)+sqrt((*(p+1) * *(p+1))-4*(*p) * *(p+2)))/2*(*p);

从代码来看,由于对通过取消引用指针访问的值的任何操作都相当于直接访问实际持有该值的变量,即,由于您将&root作为参数传递,因此任何涉及*r的操作都会更新根变量中的值。

要从函数返回两个值,请声明函数w指向两个值的第i个指针,例如

return(*r);
void roots( float *p, float *root1, float *root2 )
{
    *root1 = ...
    *root2 = ...
}
然后使用两个值的地址调用函数,例如

return(*r);
void roots( float *p, float *root1, float *root2 )
{
    *root1 = ...
    *root2 = ...
}
根据的建议,您可以使用数组:

int main( void )
{
    float a[3], r1, r2;

    // ... get user input for a[]

    roots( a, &r1, &r2 );
    printf( "%f %f\n", r1, r2 );
}
这在功能上是相同的,但更好地描述了参数

另外:对于没有根的方程呢?您可能希望在函数中检查它,并返回根的数量,例如使用函数的返回值


顺便说一句,标准库函数使用
struct
返回两个值;问题状态为“不要使用struct求解二次方程的根”没有任何理由,因此可能
struct
仍然是一个可接受的选项。

如果我是对的,那么函数应该是返回类型
void
。在函数中,您可以只为指针变量
p
r
赋值。调用函数后,您可以使用在t中传递的变量o函数作为指针(
a
root
)。
float root[2];
root(a,root);
请将循环头更改为
,因为(i=0;实际上这是解二次方程的正确方法,我认为程序的逻辑也有缺陷。。