Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在这种情况下如何通过引用传递?_C_Pointers_Pass By Reference - Fatal编程技术网

C 在这种情况下如何通过引用传递?

C 在这种情况下如何通过引用传递?,c,pointers,pass-by-reference,C,Pointers,Pass By Reference,我尝试使用change()函数更改y的内容。 我想问,当我将x分配给“abc”时,当我删除*时,为什么y不能更改 另外,我发现&*x与&y相同,这是否意味着指针x的地址被分配为与*y指向的内容的地址相同?还有,为什么&x不等于“abc” 我的代码: 它应该是change(y)notchange(&y),change(&y)是*y的地址,而不是y中的地址。所以y给出了字符串中第一个字符的地址,其中&y给出了y的地址,而不是第一个字符串的地址 它应该是change(y)notchange(&y),c

我尝试使用
change()
函数更改
y
的内容。 我想问,当我将
x
分配给
“abc”
时,当我删除
*
时,为什么
y
不能更改

另外,我发现
&*x
&y
相同,这是否意味着指针
x
的地址被分配为与
*y
指向的内容的地址相同?还有,为什么
&x
不等于
“abc”

我的代码:

它应该是
change(y)
not
change(&y)
change(&y)
*y
的地址,而不是y中的地址。所以y给出了字符串中第一个字符的地址,其中&y给出了y的地址,而不是第一个字符串的地址

它应该是
change(y)
not
change(&y)
change(&y)
*y的地址,而不是y中的地址。所以y给出了字符串中第一个字符的地址,其中&y给出了y的地址,而不是第一个字符串的地址

为什么&x不等于“abc”

因为
&x
给出的是
x的地址,而不是它所指向的值。要获得值,您需要
*x

y
无法更改,因为它指向常量字符串文本。任何试图改变它的行为都会导致UB

这是否意味着指针x的地址被指定为与*y指向的内容的地址相同

当您将
y
的地址作为参数传入函数时,指针
x
具有指针
y
的地址

为什么&x不等于“abc”

因为
&x
给出的是
x的地址,而不是它所指向的值。要获得值,您需要
*x

y
无法更改,因为它指向常量字符串文本。任何试图改变它的行为都会导致UB

这是否意味着指针x的地址被指定为与*y指向的内容的地址相同


指针
x
具有指针
y
的地址,当您将
y
的地址作为参数传入函数时。

您的代码中存在许多问题,请指出其中的一些问题

  • y
    指向字符串文本。任何修改字符串文字的尝试都是无效的
  • 若要打印地址,请使用
    %p
    格式说明符,并对参数强制转换为
    (void*)
    ,使用不正确的参数类型是错误的。同样,要打印
    字符
    ,您需要
    %c
    ,要打印字符串,您需要
    %s
    。阅读更多
  • change()
    函数中,
    *x
    的类型为
    char
    ,您试图为其分配一个指针(字符串文本的基址
    “abc”

  • 够了!!让你的编译器告诉你剩下的。(换句话说,请启用编译器警告并尝试修复报告的问题。)

    您的代码中有许多问题,请指出其中的一些问题

  • y
    指向字符串文本。任何修改字符串文字的尝试都是无效的
  • 若要打印地址,请使用
    %p
    格式说明符,并对参数强制转换为
    (void*)
    ,使用不正确的参数类型是错误的。同样,要打印
    字符
    ,您需要
    %c
    ,要打印字符串,您需要
    %s
    。阅读更多
  • change()
    函数中,
    *x
    的类型为
    char
    ,您试图为其分配一个指针(字符串文本的基址
    “abc”

  • 够了!!让你的编译器告诉你剩下的。(换句话说,请启用编译器警告并尝试修复报告的问题。)

    您必须阅读有关指针和参数传递的更多信息。 指针是一个变量,它在内存中保存另一个变量的地址。 当您在代码中引用变量时,编译器使用该变量的值,因此,当您引用指针时,您将获得其内容,即地址

    运算符
    &
    返回变量的地址,因此在代码段中:

    int a = 10;
    int *p = &a;
    
    指针
    p
    将保存变量
    a
    的内存地址。如果我们在
    p
    上使用操作符
    *
    ,我们将获得
    a
    所持有的内存地址的内容:

    printf("%d", *p);
    
    将打印
    10

    如果我们写
    &*p
    ,虽然它不是完全正确的,而且许多编译器甚至会发出警告,但我们得到的是指针指向的值,而不是要求该内容的地址,也就是说,返回作为指针内容的数据地址

    现在是函数,当您在函数中传递一个参数时,变量的一个副本被推送到堆栈上,从该堆栈中可以访问函数。 这些值是本地值,当您离开函数时,对它们所做的任何更改都将丢失。当然,如果您传递一个指针,即变量的地址,然后使用指针更改值,您可以在实际变量上反映更改

    但是,当您在函数proto中声明指向char的指针时,代码中出现了一个大错误:

    void change(char *x)
    
    您正在传递
    更改(&y)
    char**
    y
    char*
    &y
    char**
    )。你应该得到很多警告。 无论如何,调用方的概念是正确的,您传递存储字符串地址的地址,更改它将指向新字符串。这是完全合法的,因为您正在使用另一个常量字符串更新指针(而不是更改非法的常量字符串)。 但是您需要字符串指针的地址,您的函数必须是:

    void change(char **x)
    {
        *x = "abc";
        printf("S3: %p\n", (void *)&x);
        printf("S4: %p\n", (void *)&*x);
    }
    
    int main(int argc, char *argv[])
    {
        char *y = "def"; 
        printf("S1: %p\n", (void *)&y);
        printf("S2: %p\n", &*y);
        change(&y);
        printf("result: %s\n", y);
        return 0;
    }
    
    最后在
    printf
    中为poi使用正确的格式
    void change(char **x)
    {
        *x = "abc";
        printf("S3: %p\n", (void *)&x);
        printf("S4: %p\n", (void *)&*x);
    }
    
    int main(int argc, char *argv[])
    {
        char *y = "def"; 
        printf("S1: %p\n", (void *)&y);
        printf("S2: %p\n", &*y);
        change(&y);
        printf("result: %s\n", y);
        return 0;
    }