我对某件事有些困惑。我原本以为使用scanf()
读取C字符串的正确方法是:
(不用担心可能的缓冲区溢出,这只是一个简单的例子)
char string[256];
scanf( "%s" , string );
然而,以下方法似乎也可以起作用:
scanf( "%s" , &string );
这是仅限于我的编译器(gcc),纯属运气,还是其他原因?
scanf("%s", string)
等同于scanf("%s", &string[0])
。另一方面,scanf("%s", &string)
传递了一个char [256]
的指针,但它指向的是同一个位置。
然后scanf
在处理其参数列表尾部时,将尝试提取char *
。当你传递string
或&string[0]
时,这是正确的,但当你传递&string
时,你依赖于语言标准没有保证的东西,即指向不同类型和大小的对象,但从相同的位置开始的指针&string
和&string[0]
被表示为相同的方式。我认为以下内容是准确的,它可能会有所帮助。如果您发现任何错误,请随意更正。我对C语言还很陌生。
char str[]
char *strPtr; strPtr = &str[0];
strPtr
是指向char
的指针strPtr
指向数组str
strPtr
是一个具有自己内存地址的变量strPtr
是一个存储&str[0]
地址值的变量strPtr
自身在内存中的地址与它所存储的内存地址(即数组在内存中的地址,也就是&str[0]
)不同&strPtr
表示strPtr
本身在内存中的地址我认为您可以声明一个指向指针的指针:
char **vPtr = &strPtr;
声明并初始化为strPtr指针的地址
或者你可以分成两个部分:
char **vPtr;
*vPtr = &strPtr
*vPtr
指向 strPtr
指针*vPtr
是一个具有自己内存地址的变量*vPtr
是一个存储地址和 &strPtr
值的变量str++
,因为 str
的地址是一个常量,但是你可以执行 strPtr++
scanf
的方法,并且问题和接受的答案都专注于此,并省略了在实际代码中应该使用的最大输入长度的_至关重要_限制(但对于这个问题来说不是重点)。 - Arkku