我可以直接将数组传递给printf:
char text[1024] = "text";
printf("%s", text);
或者我应该将它显式地转换为char指针:
char text[1024] = "text";
printf("%s", (char*) text);
我问,因为我想它可能会将数组元素直接复制到va_list中,而不是仅仅将指针放到第一个元素上。
答案 0 :(得分:6)
是的,您可以直接传递数组。确切地说,数组的名称表示数组的地址,与char *
没有区别。
答案 1 :(得分:4)
(char*)text
和text
在这个例子中几乎没有任何区别!当作为函数参数传递时,数组的基址会衰减为指针。
事实上,即使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
作为不可修改的指针