通过引用传递c中的指针数组

时间:2018-08-28 16:09:34

标签: c arrays pointers

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

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;

}

是的,我知道。这是一个无意义的例子,但我对语法有疑问。请检查!

4 个答案:

答案 0 :(得分:5)

您在这里有视图问题。

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

第二,您尝试使用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;
}

答案 1 :(得分:1)

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;
}

答案 2 :(得分:0)

这可能更接近您要尝试的操作,不是吗?

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

只需在主char array_in_main[SIZE]中声明。之后,您只需指定char array[]作为参数并直接传递array_in_main即可。传递给函数的是数组&(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;
}

答案 3 :(得分:0)

您需要了解如何使用C编程语言将array传递给函数的机制。当您将数组传递给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放入您程序中的功能。

相关问题