[英]Passing C array as char* function parameter
我有一些用以下变量声明维护的代码:
char tmpry[40];
此函数正在使用它:
char *SomeFunction(char *tmpryP) {
// Do stuff.
}
函数调用为:
SomeFunction(&tmpry[0]);
我非常确定这与以下内容相同:
SomeFunction(tmpry);
我什至检查了在两种情况下SomeFunction中的char *指针最终都指向与数组相同的内存位置。
我的问题是是否两个函数调用是否相同(因此原始程序员只是讨厌)?
两者是等效的,我认为SomeFunction(tmpry); 更具可读性。
他们是完全一样的。
someArray[i]
确切地意味着
*(someArray + i)
其中,第二种情况下的someArray是指向内存位置的指针。 同样,
&someArray[i]
确切地意味着
(someArray + i)
在这两种情况下,这些术语都是指向存储位置的指针。
如果SomeFunction
是一个宏并且使用其参数之一的"sizeof"
,这可能很重要,因为sizeof(tmpry)
不一定等于sizeof(&tmpry[0])
。
否则,正如其他人指出的那样,它们是完全相同的。
就像其他人所说的,这两种表示法是等效的。
我通常会使用较简单的方法,除非有多个这样的调用:
SomeFunction(&tmparry[0]);
SomeFunction(&tmparry[10]);
SomeFunction(&tmparry[NNN]);
理想情况下,所有常量(幻数)都是枚举(或#define
)常量。
尽管第二个看起来不错并且阐明了将数组传递给函数的意图,但两者都是相同的。 但是SomeFunction如何知道要传递的数组的大小,是否始终假定为40? 我觉得最好将大小也作为参数传递给SomeFunction。
这两个变体是等效的,并且像这样传递
SomeFunction(tmpry);
看起来更干净。
报关单
int a [10]; int * pa;
必须牢记数组和指针之间的区别。 指针是变量,因此pa = a和pa ++是合法的。 但是数组名称不是变量; 像a = pa和a ++这样的构造是非法的
作为函数定义中的格式参数,char s []和char * s是等效的;
来自: C编程语言第二版 ,第99-100页
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.