在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]);
记住:
- 数组的值是指向其第一个元素的指针(数组对象被转换为指针)
- 在函数声明中,类型为
T
的数组的参数被聚集到指向T
的类型指针
这里有一个关于如何读取C声明的提示:
- 查找标识符名称
- 向右看
- 向左看
为了精确起见,必须用括号进行修改,但它可以广泛应用。
当你看到[说"一个阵列"
当你看到(说"一个功能"
例如: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]
。