当数组被隐式转换为c中的指针时

时间:2014-02-20 20:13:08

标签: c arrays string

我经常听说数组被隐式转换为指针但是 如何以及何时需要。字符串是否也隐式转换为指针? 我听到的一个更常见的词是数组是指针的十年,所以当它和plzz如何发生时 编程实例。

3 个答案:

答案 0 :(得分:2)

来自horse's mouth

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调用中,表达式foosizeof运算符的操作数,因此转换规则不适用;表达式sizeof foo的结果是分配给数组的总字节数(15)。

请注意foo指定的对象是一个数组,而不是一个指针;除了数组元素本身之外,没有为指针对象留出存储空间。

答案 1 :(得分:1)

何时需要?
经常。很方便。例如,strlen(s)看起来不如strlen(&s[0])那么难看,首先是隐式转换,两者都相等

字符串是否也隐式转换为指针?

使用数组和指针几乎是一样的。有区别:

  • 数组变量不能是l值
  • 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的第一个元素:
enter image description here