在C中通过引用正确传递char数组和char指针

Ais*_*yes 3 c arrays pointers c-strings

有没有一种正确的方法来调用一个char数组和一个char指针来转到一个函数,但它是通过引用传递的,它也将被操作?

像这样的东西:

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

void manipulateStrings(char *string1, char *string2[])
{

    strcpy (string1, "Apple");
    strcpy (string2, "Banana");

    printf ("2 string1: %s", string1);
    printf ("2 string2: %s", &string2);

}


int main ()
{
    char *stringA;
    char stringB[1024];

    stringA = (char *) malloc ( 1024 + 1 );

    strcpy (stringA, "Alpha");
    strcpy (stringB, "Bravo");
    printf ("1 stringA: %s", stringA);
    printf ("1 stringB: %s", stringB);

    manipulateStrings(stringA, stringB);

    printf ("3 stringA: %s", stringA);
    printf ("3 stringB: %s", stringB);


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不确定我是否正确理解如何将这些变量传递给函数并更改那些恰好是char/strings的变量的值

编辑:我的问题是 - 你怎么能改变函数中两个字符串的值?

Ed *_* S. 12

在C中没有通过引用传递的东西.C中的所有东西都是通过值传递的.这导致您需要的解决方案; 添加另一个间接层.

但是,您的代码还有其他问题.您不需要将指针传递给指针(或指向数组的指针),因为您不会改变输入,只会改变它所引用的内容.您想复制一个字符串.大.你需要的只是一个指向char的指针,初始化为指向足够的内存量.

将来,如果需要改变输入(即为其分配值),则使用指向指针的指针.

int mutate(char **input) 
{
    assert(input);
    *input = malloc(some_size);
}

int main(void)
{
    /* p is an uninitialized pointer */
    char *p;
    mutate(&p);
    /* p now points to a valid chunk of memory */
    free(p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • @SevenBits:不,肯定是*不*.`&`是运营商的地址.通过引用传递*不是与取得soem变量的地址相同.我想知道有多长时间才会出现并错误地将另一级别的间接等同于通过引用传递. (7认同)
  • 大多数肯定是在C中通过引用传递.您可以使用前缀变量的&符号. (4认同)
  • @AisIceEyes:*引用*可以变异,但除非你将指针传递给*它,否则`stringB`不能.如果你想到通过价值传递的所有东西(例如,副本,它就是这样)会更容易.您不能改变副本,但在这种情况下,您传递的内容(值)是一个地址.所以,您仍然可以查看该地址的内容,但如果您想修改inout本身,则需要获取***地址.请注意,在这种情况下,您有一个数组,因此获取其地址会产生指向数组的指针,而不是指向char的指针.您无法直接修改数组 (2认同)
  • @SevenBits:不,这是不同的.例如,接受参数的方法; `void whatever(int*p){p = malloc(sizeof(int))`.调用者无法看到对"p"的更改,因为该函数仅改变其本地副本.这不是通过引用传递; 你是按值传递指针.当然,您可以通过解除引用来改变指针*引用*的内容,但这并不是通过引用传递内容的意思.C仅按值传递. (2认同)