0

您如何将数组传递给该函数可以编辑其内容的函数?

喜欢做的时候

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

开发 C++ 说

[Warning] passing arg 1 of `function' from incompatible pointer type 

显然我做错了什么,所以请告诉我如何解决这个问题。感谢:D

4

6 回答 6

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

Notationchar *array[]是一个在这里不需要的指针数组。

当你在某处传递一个数组时,你不应该获取它的地址。数组默认调整为指针。

编辑:

函数原型:

void function(char array[], int *num);
void function(char *array, int *num);

是完全一样的。它们之间甚至没有细微的区别。

于 2012-08-11T05:29:21.313 回答
1

由于数组只能通过地址传递,所以这里不需要 char * 数组,只需要一个 char 数组:

rettype function(char *array, int *num)
{
    array[*num] = 'A';
}

int main()
{
    char arr[] = "1234567890";
    int i = 2;
    function(arr, &i);
}
于 2012-08-11T05:31:08.380 回答
0

首先不要this用作变量名,它是 C++ 关键字。抱歉没有意识到这是一个 C 问题。

main()
{ 
  char foo[5] = "00000"; //not a string
  int x = 3;
  function(foo, &x); 
}

你不取的内存地址foofoo在接受指针的上下文中使用时会降级为指向第一个元素的指针。*foofoo[0]一样的*(foo + 0)

在此处输入图像描述

like wisefoo[3]*(foo + 3)(编译器负责乘以元素大小)相同。

于 2012-08-11T05:29:31.657 回答
0

好的,首先要记住的是,没有“指向数组”的指针之类的东西,尽管您会经常听到这种说法。这是马虎。

(正如下面所指出的,术语“指向数组的指针”确实具有严格的含义——但我认为你已经被它弄糊涂了。真正发生的是每个指针都包含一个地址。根据声明,编译器可以识别它是否在上下文中正确使用,这就是您的错误消息真正告诉您的内容:您在函数中声明的是指向字符数组的指针,也就是说与 a 相同char **,而不是 a char *, 这就是你要传递的内容。但是char *, or char **, or char ******, 重要的一点是你让它太复杂了——你已经有了你需要的由数组名称标识的地址。)

指针是指针,它们是地址。

C 中的数组只是分配的一块内存,它的名称表示第一个元素的地址。所以

char a[42];

是一块 42 字符长的内存块,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' 通常是类 C 语言中的关键字,为什么会有混淆的风险?)已经是一个地址(但不是指针。它可以在指针赋值的右侧,但不在左侧。)

所以当我打电话时

foo(arry,3);

foo用 arry 的第一个元素的地址和数字 3 调用(您不需要为此声明变量。)

现在,我也可以把它写成

foo(&arry[0],3);

您可以将其理解为“找到 的第 0 个元素arry,获取其地址”。它是 C 中的一个标识,对于任何数组

char c[len];

表达式c&c[0]引用相同的地址。

(3) 也可以定义为foo(char arry[], int num)。这些是等价的。

(4) 当您引用时,a[num]您直接引用指向num的内存的 -th 元素,该元素a位于数组的开头地址arry。你不需要所有的取消引用。

不要因为这有点难以理解而感到不安——每个人在开始 C 时都很难。

于 2012-08-11T05:29:33.897 回答
0

在 C 中,数组名称“转移”为指向数组头部的指针,通过传递“&array”,您将传递一个指向数组头部指针的指针,从而发出警告。

char array[512];

myfunc(array, foo);

是做你想做的事情的正确方法。

于 2012-08-11T05:30:17.460 回答
0

实际上你已经采用了一维数组。所以你可以用两种方式定义函数......

(一世)

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

(二)

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

我想这会对你有所帮助。

于 2012-08-11T05:49:32.500 回答