我认为要通过引用以错误的方式传递数组,因为我对此有很多警告。你能帮我吗?
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;
}
是的,我知道。这是一个无意义的例子,但我对语法有疑问。请检查!
答案 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 answer和Osiris' 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
放入您程序中的功能。