如何将数组传递给函数,该函数可以编辑它的内容?
喜欢做什么
function(int *x)
{*x = 10;}
main()
{int x;
function(&x);}
我怎么能用字符数组做同样的事?
每当我做
function(char *array[], int *num)
{ int x = *num;
*array[x] = 'A'; }
main()
{ char this[5] = "00000"; //not a string
int x = 3;
function(&this, &x); }
DEV C ++说
[Warning] passing arg 1 of `function' from incompatible pointer type
显然我做错了,所以请告诉我如何解决这个问题。谢谢:D
答案 0 :(得分:1)
你应该写:
void function(char array[], int *num)
{
int x = *num;
array[x] = 'A';
}
void main()
{
char my_array[5] = "00000";
int x = 3;
function(my_array, &x);
}
符号char *array[]
是一个你不需要的指针数组。
当您在某处传递数组时,不应该使用其地址。默认情况下,数组会调整为指针。
编辑:
功能原型:
void function(char array[], int *num);
void function(char *array, int *num);
完全相同。它们之间甚至没有细微差别。
答案 1 :(得分:1)
由于数组只能通过地址传递,所以你真的不需要char *数组,只需要一个char数组:
rettype function(char *array, int *num)
{
array[*num] = 'A';
}
int main()
{
char arr[] = "1234567890";
int i = 2;
function(arr, &i);
}
答案 2 :(得分:0)
首先不要使用。对不起,没有意识到这是一个C问题。this
作为变量名,它是一个C ++关键字
main()
{
char foo[5] = "00000"; //not a string
int x = 3;
function(foo, &x);
}
你不要使用foo
的内存地址。 foo
在指针接受上下文中使用时会降级为指向第一个元素的指针。 *foo
与foo[0]
相同,与*(foo + 0)
明智的foo[3]
与*(foo + 3)
相同(编译器负责将元素大小相乘)。
答案 3 :(得分:0)
好的,首先要记住的是,没有指向“数组”的指针,尽管你会经常听到这种说法。这很草率。
(如下所述,术语“指向数组的指针”确实具有一定的含义 - 但我认为你已经被它弄糊涂了。真正发生的是每个指针都包含一个地址。根据声明,编译器可以识别它是否在上下文中正确使用,这就是您的错误消息真正告诉您的内容:您在函数中声明的是指向字符数组的指针,也就是说同样的事情作为char **
,而不是char *
,这是您传递的内容。但char *
,char **
或char ******
,重点是您使它太复杂了 - 您已经拥有了阵列名称所需的地址。)
指针是指针,它们是地址。
C中的数组只是一个已分配的内存块,它的名称代表第一个元素的地址。所以
char a[42];
是一个内存块42 char的长,a是它的地址。
您可以将第二个功能重写为
void foo(char* a, int num){ // (3)
// notice that you don't need the word function and
// for lots of reasons I wouldn't use it as a function name.
a[num] = 'A'; // (4)
}
int main(){
// Sadly "00000" IS a string no matter what your comment
// says. Use an array initializer instead.
char arry[5] = {'0','0','0','0','0' } ; // (1)
foo(arry,3); // (2)
}
这就是我认为您的代码意味着要做的事情。注意
(1)由于“00000”确实是一个字符串,它实际上创建了一个数组 6 元素,可以用数组初始化程序初始化
{'0','0','0','0','0', 0 }
(2)数组(我将'arry'命名为'this'而不是'this',因为'this'通常是C语言中的关键字,为什么风险混乱?)已经是一个地址(但不是< / em>一个指针。它可以在指针的右侧,但不在左侧。)
所以当我打电话时
foo(arry,3);
我正在使用arry的第一个元素的地址调用foo
,使用数字3调用{(您不需要为此声明变量。)
现在,我可以也把它写成
foo(&arry[0],3);
你会把它读作“找到arry
的第0个元素,取其地址。”对于任何数组,它都是C中的标识
char c[len];
表达式c
和&c[0]
表示相同的地址。
(3)也可以定义为foo(char arry[], int num)
。那些是等价的。
(4)当你引用a[num]
时,你直接引用num
所指向的内存的a
元素,该元素位于数组arry
的开头。您不需要所有解除引用。
不要感到不安,这有点难以理解 - 当他们开始使用C时,每个人都很难。
答案 4 :(得分:0)
在C中,数组名称“转移”到指向数组头部的指针,通过传递“&amp; array”,您将指向指向数组头部的指针,即警告。 / p>
char array[512];
myfunc(array, foo);
是做你想做的事的正确方法。
答案 5 :(得分:0)
实际上你已经采用了一维数组。所以你可以用两种方式定义函数......
(i)
function(char array[], int *num)
{ int x = *num;
*array[x] = 'A'; }
main()
{ char this[5] = "00000"; //not a string
int x = 3;
function(this, &x); }
和
(ii)
function(char *array, int *num)
{ int x = *num;
*array[x] = 'A'; }
main()
{ char this[5] = "00000"; //not a string
int x = 3;
function(this, &x); }
但是在你的函数定义中,你写了*array[]
作为参数,这意味着数组是二维数组。所以你应该将数组声明为二维数组。
function(char *array[], int *num)
{ int x = *num;
//implement your code }
main()
{ char this[5][10];
// you can initialize this array.
int x = 3;
function(this, &x); }
我认为这会对你有所帮助。