用scanf读取一个string
我有点困惑。 我的印象是用scanf()读取Cstring的正确方法是沿着
(不要介意可能的缓冲区溢出,这只是一个简单的例子)
char string[256]; scanf( "%s" , string );
但是,以下似乎也工作,
scanf( "%s" , &string );
这只是我的编译器(gcc),纯粹的运气,还是别的什么?
提前致谢
一个数组“decay”成指向其第一个元素的指针,所以scanf("%s", string)
等同于scanf("%s", &string[0])
。 另一方面, scanf("%s", &string)
传递一个指向char[256]
的指针,但它指向相同的地方。
然后scanf
,当处理其参数列表的尾部时,将尝试拉出一个char *
。 这是正确的事情,当你已经传递了string
或&string[0]
,但是当你传入&string
你取决于语言标准不能保证的东西,即指针&string
和&string[0]
– 指向不同types和大小的对象的指针在同一个地方开始 – 都以相同的方式表示。
我不相信我曾经遇到过一个不行的系统,实际上你可能是安全的。 无论如何,这是错误的,它可能会在一些平台上失败。 (假设的例子:一个包含每个指针的types信息的“debugging”实现,我认为符号“Lisp Machines”上的C实现是这样的)。
我认为这下面是准确的,它可能会有所帮助。 如果发现任何错误,请随时纠正。 我是新来的
char str[]
- chartypes的值的数组,在内存中有自己的地址
- chartypes的值的数组,在内存中拥有自己的地址,与数组中的元素一样多
-
包括终止空字符
'\0'
&str
,&str[0]
和str
,所有三个表示内存中的相同位置,它是数组str
的第一个元素的地址char * strPtr =&str [0]; //声明和初始化
或者,您可以将其分成两部分:
char *strPtr; strPtr = &str[0];
-
strPtr
是一个指向char
的指针 -
strPtr
指向数组str
-
strPtr
是一个在内存中拥有自己地址的variables -
strPtr
是一个存储address&str[0]
值的variables, -
strPtr
在内存中的自己的地址不同于它存储的内存地址(内存中的地址又称为&str [0]) -
&strPtr
表示strPtr本身的地址
我认为你可以声明一个指针指针为:
char **vPtr = &strPtr;
用strPtr指针的地址声明并初始化
或者你可以分成两部分:
char **vPtr; *vPtr = &strPtr
-
*vPtr
指向strPtr指针 -
*vPtr
是一个在内存中拥有自己地址的variables -
*vPtr
是一个存储address&strPtr值的variables - 最后的评论:你不能做
str++
,str
地址是一个const
,但是你可以做strPtr++