我有一些代码我正在使用以下变量声明:
char tmpry[40];
它正在使用此功能:
char *SomeFunction(char *tmpryP) {
// Do stuff.
}
函数调用是:
SomeFunction(&tmpry[0]);
我非常确定这与以下内容相同:
SomeFunction(tmpry);
我甚至检查过SomeFunction中的char *指针最终指向与两种情况下的数组相同的内存位置。
我的问题是检查两个函数调用是否相同(因此原始程序员只是讨厌)的健全性检查?
答案 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页