2

在 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]。然而它不起作用?

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

4

3 回答 3

2
void myFunc (char *mynewArray[]);

在 C 中等价于:

void myFunc (char **mynewArray);

但你数组的值是char (*)[10].

你需要有类似的东西:

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

或其等价物

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

记住:

  1. 数组的值是指向其第一个元素的指针(数组对象被转换为指针)
  2. 在函数声明中,类型数组的参数T调整为指向的类型指针T
于 2013-02-16T15:38:40.653 回答
0

以下是有关如何阅读 C 声明的提示:

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

必须用括号修改以供参考,但它可以广泛应用。

当你看到 [ 说“一个数组”

当你看到(说“一个功能”

例如:char *mynewArray[]

(name) mynewArray 是(向右看)一个指向 char 的(向左看)指针数组。

接下来:char myArray[10][10];

myArray 是一个由 10 个 10 个字符组成的数组。

有什么区别?

如果你增加mynewArray地址将改变一个指向 char 的指针的大小。

如果您增加myArray地址将改变 10 个字符的大小。

这就是为什么它们是不同的。

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

于 2013-02-16T16:07:59.017 回答
0

这是一个如此常见的问题,以至于comp.lang.c新闻组多年来一直专门针对这个问题提供一个常见问题解答条目:那么 C 中的“指针和数组等价”是什么意思?

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

标准说:

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

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


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

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

于 2013-02-16T16:44:50.437 回答