c-字符串和函数的多维数组



在C…中

假设我有一个像这样的多维字符串数组:

//Array declared in main. Will Contains strings from user-input later on
char myArray[10][10];

为什么我不能将数组传递给这个函数

//Function prototype:
void myFunc (char *mynewArray[]);
// Function call in main()
myFunc(myArray);

我对数组和指针的理解是,当我调用myFunc时,我正在传递数组的地址。接收函数接收存储在中的此地址作为指针。然后我应该能够访问myFunc中的mynewArray[1]。但是它不起作用?

我是否错误地理解了数组和指针?

void myFunc (char *mynewArray[]);

在C中相当于:

void myFunc (char **mynewArray);

但数组的值是CCD_ 1。

你需要有这样的东西:

void myFunc (char (*mynewArray)[10]);

或其等效

void myFunc (char mynewArray[][10]);

记住:

  1. 数组的值是指向其第一个元素的指针(数组对象被转换为指针)
  2. 在函数声明中,类型为T的数组的参数被聚集到指向T的类型指针

这里有一个关于如何读取C声明的提示:

  1. 查找标识符名称
  2. 向右看
  3. 向左看

为了精确起见,必须用括号进行修改,但它可以广泛应用。

当你看到[说"一个阵列"

当你看到(说"一个功能"

例如:char *mynewArray[]

(name)mynewArray是指向char的(look right)指针数组。

下一篇:char myArray[10][10];

myArray是一个包含10个字符的10个数组的数组。

有什么区别?

如果递增mynewArray,则地址将更改一个指向char的指针的大小。

如果递增myArray,则地址将按10个字符的大小更改。

这就是它们不同的原因。

在函数原型中,最左边的[]集合应该是空的(或被*替换),随后的char (*)[10]0集合应该有一个大小。

这是一个经常出现的问题,以至于comp.lang.c新闻组多年来一直有一个FAQ条目专门针对这个问题:那么,C中的"指针和数组等价"是什么意思呢?

TL;DR:指针算术数组索引是等效的。因此,即使它们不同(数组分配存储,指针只引用内存地址),指针也可以用于访问数组的元素或模拟数组。

标准上写着:

对出现在表达式中的类型为array-of-T的对象的引用会衰减(除了三个例外)为指向其第一个元素的指针;结果指针的类型是指针对T。

例外情况是数组是sizeof&运算符的操作数。


这意味着在您的代码中,myArray等效于&myArray[0]& myArray[0]的类型为char *[10]。这与char **甚至char *[]的类型不同,因为它们具有不同的存储器布局。因此编译器拒绝转换(这是无效的)。

混乱来自一维数组。即使类型char *char []char [10]不同(它们具有不同的内存布局),如果定义两种数组类型的变量,它们也会衰减为等效于char *类型的&a[0]

相关内容

  • 没有找到相关文章

最新更新