将strcpy应用于指向数组+;一些偏移量
这是一个语言问题将strcpy应用于指向数组+;一些偏移量,c,arrays,pointers,language-lawyer,C,Arrays,Pointers,Language Lawyer,这是一个语言问题 strcpy功能的说明见7.24.2.3(p2): strcpy函数复制s2指向的字符串(包括 s1指向的数组中的终止空字符) 考虑下面的代码: char test[8] = "123"; strcpy(test + 3, "4567"); printf("%s\n", test); //1234567 它按预期工作,但我对test+3指向的对象感到困惑。很明显,test指向的对象声明了类型char[8]。但就我所见,标准并没有明确定义这种类型: “如果我们有一个n元素数组,
strcpy
功能的说明见7.24.2.3(p2)
:
strcpy
函数复制s2指向的字符串(包括
s1指向的数组中的终止空字符)
考虑下面的代码:
char test[8] = "123";
strcpy(test + 3, "4567");
printf("%s\n", test); //1234567
它按预期工作,但我对test+3
指向的对象感到困惑。很明显,test
指向的对象声明了类型char[8]
。但就我所见,标准并没有明确定义这种类型:
“如果我们有一个n
元素数组,那么指向i
th元素的指针可以被视为指向n-i
元素数组的第一个元素的指针。”
由于函数
strcpy
要求它的第一个操作数是一个数组,我们可以学究般地说,像我上面所说的那样应用指针算法吗?是的,因为即使函数strcpy
的语义只在处理数组而不是指针时才有意义,但是strcpy
(或任何其他函数)来判断它是传递给数组还是传递给数组的指针,因为当数组作为参数传递给函数时,它会衰减为指向其第一个元素的指针。当然s1
并不指向数组,它指向的是字符。
[…]如果函数参数被描述为数组,则实际传递给函数的指针的值应确保所有地址计算和对对象的访问(如果指针确实指向该数组的第一个元素,则该值将是有效的)[…]
对于strcpy(test+3,“4567”);访问
test[3+0…4]
应该是有效的,如果test
是一个至少包含8个字符的数组,那么这种实用主义的论点是有意义的,但似乎对[语言律师]的问题没有太大的反应。