数组名称作为变量

时间:2012-09-15 06:31:25

标签: c arrays pointers

我正在浏览K& R,它说数组名称不是变量,它不能用于像a = pa或++这样的结构中。

这里不是s数组名吗?

    #include<stdio.h>
    main(){
        printf("%d", strlen("test"));
    }

    int strlen(char s[])
    {
        int n;
        for (n = 0; *s!= '\0';s++) // why is s++ valid even though it is declared as an array
            n++;
        return n;
    }

4 个答案:

答案 0 :(得分:3)

不,在此上下文中,它是指向char的指针。您的函数声明完全等同于:

int strlen(char *s)

正如您将看到的,实际上不可能将数组传递给函数:指向第一个元素的指针实际上是传递的。

因此,由于s实际上是指针而不是数组,因此您可以随意修改它。

答案 1 :(得分:3)

来自horse's mouth

6.3.2.1左值,数组和函数指示符

...
3除非它是sizeof运算符,_Alignof运算符或运算符的操作数 一元&运算符,或者是用于初始化数组的字符串文字,一个包含的表达式 类型'' type ''的数组被转换为类型为''指向 type ''指针的表达式 到数组对象的初始元素,而不是左值。如果数组对象有 register存储类,行为未定义。

表达式"test"是一个字符串文字,其类型为“5个元素数组char”。当您将"test"作为strlen的参数传递时,根据上面的规则,实际传递的是一个指针,其值是"test"中第一个字符的地址。

这将我们带到......

6.7.6.3函数声明符(包括原型)

...
7参数声明为'' type ''的数组应调整为''限定指针 type '',其中类型限定符(如果有)是在[和]中指定的类型 数组类型推导。如果关键字static也出现在[]内 数组类型派生,然后对每个函数调用,对应的值 实际参数应提供至少与数组一样多的数组的第一个元素的访问权限 由大小表达式指定的元素。

因此,在strlen的原型中,char s[]相当于char *s; s被声明为指向char的指针,而不是char的数组。

与其他语言相比,C对数组的处理有点巴洛克式。这部分归功于BCPL和B遗产。如果您对原因感到好奇,可以阅读dmr的The Development of the C Language以获得一些见解。

答案 2 :(得分:1)

不,实际上s是一个指针名称。 声明int strlen(char s[])int strlen(char *s)

相同

答案 3 :(得分:1)

当Char s [] = {...}声明地址附加到s时,它永远不会改变(如常量指针),任何尝试更改此属性的内容都会变成非法操作,例如s ++。

但是在函数调用 int strlen(char s [])中,数组作为指针传递。