【问题标题】:Pass by reference an array of pointers in c在c中通过引用传递一个指针数组
【发布时间】:2018-08-28 16:09:34
【问题描述】:

我认为通过引用以错误的方式传递我的数组,因为我有很多警告。你能帮帮我吗?

void func (char **array[], char b){
*array[0]=&b;
}

int main () {

char *array_in_main[SIZE];
char b_in_main='b';
func (*array_in_main, b_in_main);
return 0;

}

是的,我知道。这是一个毫无意义的例子,但我怀疑语法。请检查一下!

【问题讨论】:

  • 欢迎来到 Stack Overflow。你需要帮助哪一部分?您收到哪些错误和警告?
  • 你不能在其作用域之外使用局部变量的地址。

标签: c arrays pointers


【解决方案1】:

你在这里有一个视图问题。

首先,您将错误的类型传递给您的函数。如果要在函数中修改数组,则不必将其与指向数组的指针一起传递,因为数组会衰减为指向其第一个元素的指针。

第二次尝试使用b的地址,它是一个局部变量,其作用域以函数func结尾,你不能在外面使用它。

此代码将起作用:

#include <stdio.h>
#define SIZE 10

void func (char *array[], char *b)
{
    array[0]=b;
}

int main () 
{
    char *array_in_main[SIZE];
    char b_in_main='b';
    func (array_in_main, &b_in_main);

    return 0;
}

【讨论】:

  • 好的,但是当 func() 以 main 结束时,array_in_main 是否仍然被修改?我不明白在函数中传递数组是否像传递一个简单的变量。
  • @ilacollie 是的,它仍在修改中。
【解决方案2】:

C 中的数组在用作参数时被分解为指向第一个元素的指针。

只需传递数组本身。不需要指向它的指针。

另外,就像 Osiris 所说,您不能在其范围之外使用局部变量的地址。

void func (char *array[], char b){  /* Changed &b to b */
    array[0][0]=b; /* Changed array[0] to array[0][0], assuming that array is a 2D array */
}
int main () {
    char *array_in_main[SIZE];
    char b_in_main='b';
    func (array_in_main, b_in_main); /* Changed *array_in_main to array_in_main */
    return 0;
}

【讨论】:

  • array[0][0]=b; 指针从未初始化,所以我认为这会导致未定义的行为。
  • 是的,虽然我确实经常将*char[] 用于二维字符数组,因此我的推理
【解决方案3】:

这可能更接近你想要做的,不是吗?

除了编译问题(已经在Tau's answerOsiris' answer 中解释过),值得注意的是数组本身已经是指针。

只需在主char array_in_main[SIZE] 中声明即可。之后您可以指定char array[] 作为参数并直接传递array_in_main。传递给函数的是数组&amp;(array_in_main[0])中第一个位置的地址,所以可以从函数中有效地更新数组。

代码:

#define SIZE 10

void func(char array[], char b) {
  array[0] = b;
}

int main () {
  char array_in_main[SIZE];
  char b_in_main='x';
  func(array_in_main, b_in_main);
  return 0;
}

【讨论】:

    【解决方案4】:

    您需要了解 array 如何传递给 C 编程语言中的函数的机制。当您将数组传递给 C 中的函数时,指向数组第一个元素的指针(地址)将传递给函数,并且由于您有对它的引用,因此您可以在函数中修改数组的内容(但您可以'不改变数组指向的内存位置)。我建议看看这个question

    下面的程序有两个功能。 rightFunc 函数是一种简单而正确的方法来实现您一直在尝试做的事情。但是,我提供了func,它显示了将指针(或引用)传递给指针数组的方式。

    #include <stdio.h>
    
    #define SIZE 100
    
    void rightFunc(char *array[], char *b)
    {
        array[0] = b;
    }
    
    void func(char *(*array)[], char *b)
    {
        (*array)[0] = b;
    }
    
    int main(int argc, char *argv[]) 
    {
        char *array_in_main[SIZE];
        char b_in_main = 'b';
    
        func(&array_in_main, &b_in_main);
        printf("Character is %c\r\n", *array_in_main[0]);
    
        b_in_main = 'c';
        rightFunc(array_in_main, &b_in_main);
        printf("Character is %c\r\n", *array_in_main[0]);
        return 0;
    }
    

    我想指出您程序中的一个错误。您可以获得局部变量的地址 (automatic storage class),但该地址在函数外部无效(当函数退出时)。为了纠正您程序中的问题,我修改了您程序中的函数以使用pointer to char

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 2020-03-14
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2011-10-07
      相关资源
      最近更新 更多