我经常听说数组被隐式转换为指针但是 如何以及何时需要。字符串是否也隐式转换为指针? 我听到的一个更常见的词是数组是指针的十年,所以当它和plzz如何发生时 编程实例。
答案 0 :(得分:2)
6.3.2.1左值,数组和函数指示符
...
3除非它是sizeof
运算符,_Alignof
运算符或运算符的操作数 一元&
运算符,或者是用于初始化数组的字符串文字,一个包含的表达式 类型'' type ''的数组被转换为类型为''指向 type ''指针的表达式 到数组对象的初始元素,而不是左值。如果数组对象有 注册存储类,行为未定义。
给出以下代码:
char foo[]="This is a test";
printf( "Contents of foo = \"%s\"\n", foo ); // prints "This is a test"
printf( "Value of foo = %p\n", (void *) foo ); // prints address of first element
printf( "Value of &foo = %p\n", (void *) &foo ); // prints address of array
printf( "Size of foo = %zu\n", sizeof foo ); // prints number of bytes used
// by foo
表达式 foo
的类型是“char
的15个元素数组”。在前两个printf
调用中,表达式foo
不是sizeof
或一元&
运算符的操作数,因此它将转换为类型为“指针”的表达式char
“及其值是数组中第一个元素的地址;此指针值是传递给printf
的值。
在第三次printf
调用中,表达式foo
是一元&
运算符的操作数,因此转换规则不适用;表达式&foo
的类型是“指向 15元素 char
数组的指针”。最后两行将打印相同的值(数组的地址与数组的第一个元素的地址相同),但类型不同。
在上次printf
调用中,表达式foo
是sizeof
运算符的操作数,因此转换规则不适用;表达式sizeof foo
的结果是分配给数组的总字节数(15)。
请注意foo
指定的对象是一个数组,而不是一个指针;除了数组元素本身之外,没有为指针对象留出存储空间。
答案 1 :(得分:1)
何时需要?
经常。很方便。例如,strlen(s)
看起来不如strlen(&s[0])
那么难看,首先是隐式转换,两者都相等
字符串是否也隐式转换为指针?
是
使用数组和指针几乎是一样的。有区别:
sizeof(array)
与sizeof(pointer)
函数参数,即使声明为数组,也只是指针。它们可以是l值,sizeof()就可以返回指针的大小
答案 2 :(得分:1)
C中的数组表达式通常转换为指针表达式,并且可以这样观察......例如,给出这个简单的演示代码:< / p>
#include <ansi_c.h>
int main(void)
{
int a[20]={2,3,5,8,6,4,3,2,1,7,8,9,0,4,6,7,8,9,0,2};
char s[3][10] = {"one","two","three"};
char *pS;
pS = calloc (20, sizeof(char));//char array of 20 bytes, (string)
strcpy(pS, "this is a string");
printf("a[1] = %d\n", a[1]);
printf("a (pointer) = %p\n\n", a);
printf("s[0] = %s\ns[1] = %s\ns[2] = %s\n", s[0], s[1], s[2]);
printf("s (pointer) = %p\n\n", s);
printf("pS = %s\npS (pointer) = %p\n", pS, pS);
free(pS);
getchar();
return 0;
}
产生此输出,显示指针(地址)到数组a的第一个元素: