我正在浏览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;
}
答案 0 :(得分:3)
不,在此上下文中,它是指向char
的指针。您的函数声明完全等同于:
int strlen(char *s)
正如您将看到的,实际上不可能将数组传递给函数:指向第一个元素的指针实际上是传递的。
因此,由于s
实际上是指针而不是数组,因此您可以随意修改它。
答案 1 :(得分:3)
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
的数组。
答案 2 :(得分:1)
不,实际上s
是一个指针名称。
声明int strlen(char s[])
与int strlen(char *s)
答案 3 :(得分:1)
当Char s [] = {...}声明地址附加到s时,它永远不会改变(如常量指针),任何尝试更改此属性的内容都会变成非法操作,例如s ++。
但是在函数调用 int strlen(char s [])中,数组作为指针传递。