如何通过引用char * foo [SIZE] [SIZE]传递给函数并取消引用它?

时间:2016-06-25 00:18:09

标签: c arrays pointers

我真的很难理解如何将一个二维char指针数组的地址传递给一个函数,并实际为它赋值。

void fillWithStrings( 'pointer to foo'  ){ // How to do this part?
   for( int i = 0; i < SIZE; i++ ) {
       for( int j = 0; j < SIZE; j++ ) {
           char * temp = malloc( sizeof(char) * 3 );
           temp = "hi";
           *foo[i][j] = temp; // And this part?
       }
   }
}

int main(){
   char * foo[SIZE][SIZE];

   fillWithStrings( &foo );

   return 0;
}

是的,在声明它的范围内填充 foo 会更容易,但关键是,如何在另一个函数中执行此操作?

4 个答案:

答案 0 :(得分:1)

首先,在 C 中,通过引用传递没有这样的事情。一切都是通过值传递。数组被“传递”为指向其第一个元素的指针。此指针也通过值传递。它被复制为函数参数,但它指向的数组保留为,可以从你的函数中看到。

char * foo[SIZE][SIZE]是一个二维的字符指针数组。这些指针可能指向charactres或字符数组。由于没有指定这些字符数组的大小,因此可以假设这些数组是fillWithStrings()个终止的字符串。{1}} 运行此演示代码可能有助于更好地了解您的函数中发生的事情。

\0

答案 1 :(得分:1)

没有必要将foo的地址传递给fillWithStrings(),因为该函数不想更改foo的值(BTW,甚至不会可能foo是一个数组)。

只需传递foo,然后将衰减到指向第一个元素的指针。它的第一个元素是char * [SIZE],后者的地址是char * (*) [SIZE]

这样做的代码可能如下所示:

#include <stdio.h>
#include <stdlib.h>

#define SIZE (7)

int array_init(char * (*a)[SIZE])
{
  for (size_t i = 0; i < SIZE; ++i)
  {
    for (size_t j = 0; j < SIZE; ++j)
    {
      a[i][j] = calloc(42, sizeof *(a[i][j])); /* Allocate 42 times the size of 
                                               what (a[i][j]) points , that is a char.*/
      if (NULL == a[i][j])
      {
        return -1;
      }
    }
  }

  return 0;
}

int main(void)
{
  char * a[SIZE][SIZE] = {0};

  if (-1 == array_init(a))
  {
    perror("array_init() failed");
    exit(EXIT_FAILURE);
  }

  /* Do stuff. */

  /* Free a's elements here. */

  return EXIT_SUCCESS;
}

答案 2 :(得分:-1)

对于第一部分,将d <- read.table(text = "V1 60346241,[37.55 55.22 5km],katekin,55.745011917 37.604520766,2013-12-04 11:59:07 603423423,[37.55 55.22 5km],#hello,#yes,miguel,53.23452 38.7379422,2013-12-04 11:49:09", header = TRUE, comment.char = "", sep = "\t") 替换为'pointer to foo' 这分解如下:

char* (*foo)[SIZE][SIZE]表示foo是指向某事物的指针, (*foo)表示foo指向某些东西的2D数组, (*foo)[SIZE][SIZE]表示foo指向指向char的2D数组。

使用括号是必要的,以避免将其解释为指向char指针的2D数组。

对于第二部分,char* (*foo)[SIZE][SIZE]

(*foo)[i][j] = temp;将获得原始数组foo指向和 (*foo)指定分配将在该数组中的位置。

编辑:修复了第二部分并添加了解释

答案 3 :(得分:-3)

这应该有效:

typedef char *FOO_TYPE [SIZE][SIZE];  // Or whatever your size/name is

void fillWithStrings (FOO_TYPE& foo)
{
}

然后,您可以使用它,就像在本地声明它一样。