渔村暮火 发表于 2024-4-25 16:56:15

指针传值

#include <iostream>

char* dd2 (char* data)
{
    return data;
}

int dd1 (char* data)
{
    char j = "ssss";
    // data = j;
    data = dd2(j);
    return 0;
}



int main ()
{
    char m = {0};
    dd1(m);
    printf("%s\n",m);
return 0;
}
如何让m成功获取值,改变dd1函数类型

FishC 发表于 2024-4-25 16:56:31

这段代码中存在一些问题。首先,函数`char* dd2 (char* data)`返回了一个指针类型的值,但在`dd1`函数中并没有正确地接收这个返回值。其次,在`dd1`函数中,你想要将一个字符串赋值给字符指针`data`,但是你使用了一个字符变量`j`来存储这个字符串,这是不正确的。

下面是对代码进行修改后的版本:

#include <stdio.h>
#include <stdlib.h>

char* dd2()
{
    char* data = "ssss";
    return data;
}

void dd1(char** data)
{
    *data = dd2();
}

int main()
{
    char* m = NULL;
    dd1(&m);
    printf("%s\n", m);
    free(m);// 需要手动释放内存
    return 0;
}

在这个修改后的代码中,我们将`dd2`函数修改为直接返回一个字符串指针。然后,在`dd1`函数中,我们将`data`参数改为指向指针的指针类型`char**`,并使用间接赋值运算符(即`*`)来修改指针指向的内存地址,实现传递并更改指针的值。

在`main`函数中,我们通过传递`&m`来传递指向指针`m`的指针,以便在`dd1`函数中修改`m`的值。最后,我们使用`printf`打印出`m`的值,然后使用`free`函数手动释放`m`所指向的内存空间。

请注意,在使用`free`函数之前必须正确地分配内存。在上述例子中,我们可以直接将`m`初始化为`NULL`,然后在`dd2`函数中分配内存,这样就不需要手动分配或释放内存空间了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

渔村暮火 发表于 2024-4-25 16:59:35

FishC 发表于 2024-4-25 16:56
这段代码中存在一些问题。首先,函数`char* dd2 (char* data)`返回了一个指针类型的值,但在`dd1`函数中并 ...

不要改变dd1函数的类型,只能是int dd1 (char* data)

FishC 发表于 2024-4-25 16:59:55

渔村暮火 发表于 2024-04-25 16:59
不要改变dd1函数的类型,只能是int dd1 (char* data)

如果我们不能改变`dd1`函数的返回类型,并且仍然需要通过`dd1`函数来改变`m`的值,那么我们可以使用指针的指针来实现。

下面是修改后的代码:

#include <stdio.h>

char* dd2()
{
    char* data = "ssss";
    return data;
}

int dd1(char** data)
{
    *data = dd2();
    return 0;
}

int main()
{
    char* m = NULL;
    dd1(&m);
    printf("%s\n", m);
    return 0;
}

在这个修改后的代码中,`dd1`函数的返回类型仍然是`int`。我们使用了指向指针的指针`char**`作为参数类型,以便可以通过间接赋值操作来修改传入的指针`m`的值。然后,在`main`函数中,我们将`&m`传递给`dd1`函数,以便在`dd1`函数内部改变`m`的值。

这样,你就可以正确地通过`dd1`函数改变`m`的值,并在`main`函数中打印出修改后的结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

渔村暮火 发表于 2024-4-25 17:03:01

FishC 发表于 2024-4-25 16:59
如果我们不能改变`dd1`函数的返回类型,并且仍然需要通过`dd1`函数来改变`m`的值,那么我们可以使用指 ...

dd1函数的参数只能是一级指针

FishC 发表于 2024-4-25 17:03:20

渔村暮火 发表于 2024-04-25 17:03
dd1函数的参数只能是一级指针

如果`dd1`函数的参数只能是一级指针,那么我们可以将`dd1`函数修改为返回一个指针,并在`main`函数中接收这个返回值来改变`m`的值。

下面是修改后的代码:

#include <stdio.h>

char* dd2()
{
    char* data = "ssss";
    return data;
}

char* dd1(char* data)
{
    char* result = dd2();
    // 修改data指向的值
    // ...
    return result;
}

int main()
{
    char* m = NULL;
    m = dd1(m);
    printf("%s\n", m);
    return 0;
}

在这个修改后的代码中,`dd1`函数的参数仍然是一级指针`char*`,但返回类型改为`char*`,即指向字符的指针。在`dd1`函数内部,我们调用了`dd2`函数来获取需要赋值给`m`的字符串指针,并将其存储在一个临时指针变量`result`中。根据你的需求,你可以在`dd1`函数中修改`data`指向的值。最后,`dd1`函数将`result`作为返回值返回给`main`函数,然后在`main`函数中将其赋值给`m`,实现了通过`dd1`函数改变`m`的值。

注意,在使用指针时要小心内存管理,确保分配和释放内存的正确性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

渔村暮火 发表于 2024-4-25 17:04:15

FishC 发表于 2024-4-25 17:03
如果`dd1`函数的参数只能是一级指针,那么我们可以将`dd1`函数修改为返回一个指针,并在`main`函数中接 ...

dd1函数返回值只能是整型,参数只能是一级指针

FishC 发表于 2024-4-25 17:04:38

渔村暮火 发表于 2024-04-25 17:04
dd1函数返回值只能是整型,参数只能是一级指针

如果`dd1`函数返回值只能是整型,参数只能是一级指针,那么我们可以使用传入指针的方式来改变指针指向的值。以下代码演示了如何在这种情况下实现指针传值:

#include

char* dd2()
{
    char* data = "ssss";
    return data;
}

int dd1(char* data)
{
    char* result = dd2();
    // 修改data指向的值
    // ...
    return 0;
}

int main()
{
    char* m = NULL;
    dd1(m);
    printf("%s\n", m);
    return 0;
}

在上述代码中,`dd1`函数的返回值类型为`int`,参数类型为一级指针`char*`。在`dd1`函数内部,我们调用`dd2`函数获取需要赋值给`m`的字符串指针,并将其存储在临时指针变量`result`中。根据你的需求,在`dd1`函数中你可以修改`data`指向的值。但请注意,由于`data`是一级指针,它所指向的值的更改只在`dd1`函数内部有效,不会影响到`main`函数中的`m`。

所以,最终在`main`函数中打印`m`的值时,输出结果仍然为空指针。由于`dd1`函数不能返回指针,我们无法通过直接调用`dd1`函数来实现改变`m`的值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

芜湖666 发表于 2024-4-25 20:18:50

oo

poly 发表于 2024-4-26 10:35:30

学习

dfn 发表于 2024-4-26 10:37:20

poly 发表于 2024-4-26 10:35
学习

用局部变量的指针作为返回值是不是会有问题阿

harryhan123 发表于 2024-5-2 17:01:36

学习

行客 发表于 2024-5-6 14:13:39

挺好的

尹玄睿 发表于 2024-5-7 15:49:21

为了凑人气!冲!

ZZxxccvvbbnnmm 发表于 2024-5-9 17:05:58

LLkkjjhhggffdds 发表于 2024-5-9 17:09:12

Mnklpo 发表于 2024-5-9 17:11:25

AAssddffgghhjjk 发表于 2024-5-9 17:12:55

Poklmn 发表于 2024-5-9 17:15:47

MMnnbbvvccxxzz 发表于 2024-5-9 17:18:31

页: [1] 2
查看完整版本: 指针传值