我的代码如下:
#include <stdio.h>
void print_pointer(char **str);
void print_array(char *str[20]);
void print_array2(char str[20][20]);
void print_array3(char str[][20]);
int main(int argc, char *argv[])
{
char str[20][20] = {"test1", "test2", "test3"};
print_pointer(str);
print_array(str);
print_array2(str);
print_array3(str);
return 0;
}
void print_pointer(char **str)
{
int i = 0;
for(; i < 20; i++)
{
printf("%s", str[i]);
}
}
void print_array(char *str[20])
{
int i = 0;
for(; i < 20; i++)
{
printf("%s", str[i]);
}
}
void print_array2(char str[20][20])
{
int i = 0;
for(; i < 20; i++)
{
printf("%s", str[i]);
}
}
void print_array3(char str[][20])
{
int i = 0;
for(; i < 20; i++)
{
printf("%s", str[i]);
}
}
编译此代码时,遇到两个编译错误:
error C2664: 'print_pointer' : cannot convert parameter 1 from 'char [20][20]' to 'char ** '
error C2664: 'print_array' : cannot convert parameter 1 from 'char [20][20]' to 'char *[]'
我的问题是这4个函数之间的实际区别是什么?
为什么print_array
和print_pointer
功能在print_array2
和print_array3
正常工作时无效?
答案 0 :(得分:7)
是的,这就是一个数组可以像指针一样对待的想法。
“char [20] [20]”表示一个包含400个字符的数组,以20x20的方式排列。 不是一个包含20个指针的数组,每个指针包含20个字符的数组。因此,将char [20] [20]转换为char **是不正确的(如果你明确地这样做,你会得到垃圾结果)。
出于同样的原因(char [20] [20]不是指针数组),你不能转换为char * [20]。
是一个数组数组,这是你为print_array2和print_array3声明的。
答案 1 :(得分:4)
char**
是指向指针的指针。
你想要一个指向数组的指针(提示:它不是char* []
,因为这是一个与上面相当的指针数组。)
您需要char (*)[size]
(注意括号)。这将很乐意接受char[20][20]
类型的输入。为了完整起见,char [][size]
也是等价的(在两种情况下都需要指定第二个数组的大小)。