在将数组传递给像printf这样的可变函数时,我应该将数组转换为指针吗?

时间:2012-04-09 08:54:12

标签: c++ c printf

我可以直接将数组传递给printf:

char text[1024] = "text";
printf("%s", text);

或者我应该将它显式地转换为char指针:

char text[1024] = "text";
printf("%s", (char*) text);

我问,因为我想它可能会将数组元素直接复制到va_list中,而不是仅仅将指针放到第一个元素上。

5 个答案:

答案 0 :(得分:6)

是的,您可以直接传递数组。确切地说,数组的名称表示数组的地址,与char *没有区别。

答案 1 :(得分:4)

(char*)texttext在这个例子中几乎没有任何区别!当作为函数参数传递时,数组的基址会衰减为指针。

事实上,即使text不是char数组,它仍然不会对printf产生任何影响,因为它是一个可变参数函数

int printf(const char *format, ...);

所有关心的都是关于第一个论点。逻辑可能会出错,但printf并不关心!

答案 2 :(得分:2)

简短回答,是的,数组在C _are_a中指向它们的第一个元素。(编辑:更长的答案,实际上,C中的数组是标识符或标签,它们只是名称,但在使用时作为表达式的一部分,它不以&或sizeof为前缀,它们被转换为或以其他方式作为指针进行评估。)

更长的答案:你看,函数不能真正接收数组作为参数,但编译器必须向它们发送一些东西,所以它会向它们发送一个指针。因此,第一句应该以“就像printf()这样的函数而言......”开始。

有些函数声称采用数组,但这只是一种幻觉。这两个功能是相同的。

func(char *a);
func(char a[]);

下面的C FAQ条目详细介绍了数组和指针之间的细微差别:

char a[] = "this";
char *b = "that";

a [0]生成的代码与b [0]完全不同,但它们大致相同,因为下标运算符[]给出了预期的结果。

有趣的是,格式说明符“%s \ n”也作为指针传递给printf()

http://www.lysator.liu.se/c/c-faq/c-2.html

Isn't an array/arrayname always a pointer to the first element in C?

答案 3 :(得分:1)

除非它是sizeof或一元&运算符的操作数,或者是用于初始化声明中的另一个数组的字符串文字,否则表达式为类型“{-1}}的N元素数组”将被“指向T的指针”类型的表达式替换,其值是数组的第一个元素的地址。

写作时

T

表达式printf("%s", text); 被类型为text的新表达式替换,其值为char *,此指针值将传递给&text[0]。这意味着您不必抛出参数。它还意味着您不能将数组表达式作为函数参数传递,并且被调用函数将其作为数组 type 接收。转换在调用函数之前发生。

答案 4 :(得分:0)

指针和数组的名称是可交换的。 (除了内存分配)

当你有

char *a = "abcdef";
char b[5];

你可以写

char z = a[2]; // 'c'
char x = *b;
char y = *(b+2);

但你做不到

b ++; 

您可以将array b视为char * const b作为不可修改的指针