C 数组名作为变量

C 数组名作为变量,c,arrays,pointers,C,Arrays,Pointers,我通过K&R,它说数组名不是一个变量,不能用在像a=pa或a++这样的结构中 这里不是数组名吗 #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 i

我通过K&R,它说数组名不是一个变量,不能用在像a=pa或a++这样的结构中

这里不是数组名吗

    #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;
    }
#包括
main(){
printf(“%d”,strlen(“测试”);
}
int strlen(字符s[]
{
int n;
for(n=0;*s!='\0';s++)//为什么s++即使声明为数组也有效
n++;
返回n;
}

否,在这种情况下,它是指向
字符的指针。您的函数声明完全等同于:

int strlen(char *s)
正如您将看到的,实际上不可能将数组传递给函数:实际传递的是指向第一个元素的指针


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

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

相同,当char s[]={…}被声明的地址附加到s时,该地址永远不会更改(如常量指针),任何试图更改此属性的操作都会变成非法操作,如s++

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

来自:

6.3.2.1左值、数组和函数指示符 …
3除非它是
sizeof
运算符、
\u
运算符或 一元
&
运算符,或是用于初始化数组的字符串文字,一个具有 类型“”的数组“”已转换为类型为“”指向类型“”的指针的表达式 指向数组对象的初始元素,并且不是左值。如果数组对象具有
注册
存储类,行为未定义。 表达式
“test”
是一个字符串文本,其类型为“char
的5元素数组”。当您通过
“test”
作为
strlen
的参数时,根据上述规则,实际通过的是一个指针,其值是
“test”
中第一个字符的地址

这让我们想到

6.7.6.3功能声明器(包括原型) …
7将参数声明为“类型数组”应调整为“指向 类型“”,其中类型限定符(如有)为 数组类型派生。如果关键字
static
也出现在 数组类型派生,然后为每个函数调用 实际参数应提供对数组第一个元素的访问,该元素至少具有相同的数量 尺寸表达式指定的元素。 因此在strlen的原型中,
chars[]
相当于
char*s
s
声明为指向
char
的指针,而不是
char
的数组


与其他语言相比,C对数组的处理有点巴洛克风格。这部分是由于BCPL和B的传统。如果你想知道为什么,你可以阅读dmr的一些见解

数组在传递给函数时会衰减为指针。您甚至没有声明
n
。那么,为什么即使char s[]等同于char*s,也对修改数组名称有限制?如果我写char s[10],为什么我不能说s++?@ben因为
char s[10]
没有衰减到指针,因为它不是一个函数参数…?如果它是一个局部数组变量,那么你就不能修改它。关于C中数组的一切都有点随意性。大多数其他类型都是一流的——您可以分配它们,它们复制整个值。数组在值上下文中使用时会自动衰减为指针,但为了与其他类型保持一致,它们决定在变量声明中将其视为名称。@ben:中有一些内容。基本上,这是因为C数组是从以前的构造演变而来的,在这种构造中,数组的名称实际上是一个指针,而数组本身是一个独立于引用它的变量的内存块那么为什么语句
a++无效?其中a声明为类似
inta[10]。在这里,我们不使用
sizeof
\u Alignof
&
运算符。那么,它是否应该转换为“类型指针”?@hatter:
++
--
运算符(前缀和后缀)的操作数必须是可修改的左值(6.5.2.4/1和6.5.3.1/1);但是,数组表达式不是可修改的左值(6.3.2.1/1)。无法更改
a
的值,因为没有为变量
a
预留独立于数组元素本身的存储空间。