我真的很难理解如何将一个二维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 会更容易,但关键是,如何在另一个函数中执行此操作?
答案 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)
{
}
然后,您可以使用它,就像在本地声明它一样。