如何将指针传递给函数?

时间:2012-08-11 05:25:56

标签: c arrays pointers parameter-passing

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

喜欢做什么

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

6 个答案:

答案 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)

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

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

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

相同

enter image description here

明智的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); }

我认为这会对你有所帮助。