将C数组作为char*函数参数传递

7

我需要维护一些代码,其中包括以下变量声明:

char tmpry[40];

这个函数正在使用它:

char *SomeFunction(char *tmpryP) {
   // Do stuff.
}

函数调用是:

SomeFunction(&tmpry[0]);

我很确定这只是相同的意思:“
SomeFunction(tmpry);

我甚至检查了SomeFunction中的char*指针在两种情况下最终指向的内存位置是否相同。
我的问题是一个合理性检查,即这两个函数调用是否相同(因此原始程序员只是故意为难人)?

我认为最好也向 SomeFunction 传递一个长度,以防万一... :) - AndersK
1
字符数组的名称是数组第一个元素的地址的别名。 - David
你好,我是那些写代码像这样的“讨厌”的程序员之一。通常,我在C++代码中这样做,原因是为了更少地耦合到当前使用的数组抽象。也就是说,对于一个抽象的类似数组的数据结构(如std::vector<char>),重载了operator []表达式的x&x[0]将会有非常不同的含义,而第二个更适合我的意图。当然,在纯C中这一切都不太重要,因为在C中几乎没有数据抽象;因此,应该优先选择具有卓越可读性的拼写方式。 - ulidtko
8个回答

12

它们完全一样。

someArray[i]

意思是精确地

*(someArray + i)

在第二种情况下,someArray是一个指向内存位置的指针。类似地,

&someArray[i]

确切地意味着

(someArray + i)

在这两种情况下,术语是指向内存位置的指针。


12

这两种写法是等效的,我认为 SomeFunction(tmpry); 更易读。


7

如果SomeFunction是一个宏并且对其某个参数使用了"sizeof",那么sizeof(tmpry)可能不等于sizeof(&tmpry[0]),这时候就很重要。

否则,正如其他人指出的那样,它们完全相同。


在这种情况下,没有宏参与。但是宏会如何不同对待它们?宏不是像字符串搜索和替换一样工作吗,因此它生成的函数无论如何都等效于普通函数吗? - sipsorcery
如果宏使用sizeof(宏参数),则结果会有所不同。 - Alex B
#define 宏(x) 实际函数调用(x,sizeof(x)) // 例如 - dreamlax

5

3

正如其他人所说,这两种表示法是等价的。

通常我会使用更简单的一种,除非有多个类似这样的调用:

SomeFunction(&tmparry[0]);
SomeFunction(&tmparry[10]);
SomeFunction(&tmparry[NNN]);

理想情况下,所有常量(魔数)都应该是枚举(或#define)常量。


即使如此,tmparry + 10比&tmparray [10]更好。 - hasen
1
我不同意 - 但这是一个主观的决定。 - Jonathan Leffler

1

这两个变量是等价的,并且可以像这样传递

SomeFunction(tmpry);

看起来更清爽。


1

两者本质上是相同的,尽管第二个看起来更好,并且澄清了将数组传递给函数的意图。但是,SomeFunction如何知道传递的数组大小,它总是假定为40吗?我认为最好也将大小作为参数传递给SomeFunction。


我同意,你应该传递数组的大小和数组本身。 - Jason Coco
如果是新代码,我同意,但如果代码已经编写完成,更改数据结构可能并不容易。 - Naveen
此外,我们不知道C++是否可行,因为问题中说到的是C数组,标签仅为C。 - Jason Coco

1

声明

int a[10]; int *pa;

数组和指针之间有一个必须记住的区别。 指针是一个变量,所以pa=a和pa++是合法的。 但是数组名不是一个变量;像a=pa和a++这样的构造是非法的。

作为函数定义中的格式参数, char s[] 和 char *s 是等价的;

来自:The C Programming Language 2th, 第99-100页


引用第99页内容:“当数组名称传递给函数时,传递的是初始元素的位置” - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接