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

时间:2009-04-08 04:35:40

标签: c arrays

我有一些代码我正在使用以下变量声明:

char tmpry[40];

它正在使用此功能:

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

函数调用是:

SomeFunction(&tmpry[0]);

我非常确定这与以下内容相同:

SomeFunction(tmpry);

我甚至检查过SomeFunction中的char *指针最终指向与两种情况下的数组相同的内存位置。

我的问题是检查两个函数调用是否相同(因此原始程序员只是讨厌)的健全性检查?

8 个答案:

答案 0 :(得分:12)

这两个是等价的,我认为SomeFunction(tmpry);更具可读性。

答案 1 :(得分:12)

它们完全一样。

someArray[i]

意味着

*(someArray + i)

其中someArray在第二种情况下是指向内存位置的指针。同样,

&someArray[i]

意味着

(someArray + i)

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

答案 2 :(得分:7)

可能可能是重要的,如果SomeFunction是一个宏并且取其{1}}的一个参数,因为"sizeof"可能不一定等于{ {1}}。

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

答案 3 :(得分:5)

C Programming FAQ上的arrays and pointers部分解决了这个问题(以及许多其他常见的C问题和混淆。

答案 4 :(得分:3)

正如其他人所说,这两个符号是等价的。

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

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

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

答案 5 :(得分:1)

两者都是同一个,虽然第二个看起来不错,并阐明了将数组传递给函数的意图。但SomeFunction如何知道传递的数组的大小,它总是假设为40?我觉得最好将大小作为参数传递给SomeFunction。

答案 6 :(得分:1)

这两个变体是等效的并且像这样传递

SomeFunction(tmpry);

看起来更干净。

答案 7 :(得分:1)

声明

int a [10]; int * pa;

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

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

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