关于指针和数组的问题

来源:百度知道 编辑:UC知道 时间:2024/05/05 08:27:09
这是书上的一个选择题。

【1】
char str[20];
scanf("%s",&str[2]);

【2】
char str[20],*p=str;
scanf("%s",p[2]);

书上认为第一个是错的,第二个是对的。
而我认为两个都是对的。

于是上机,再底下加上了printf,以检查正确与否。校对都通过。运行,输入数据回车后,都显示“内存错误”或“此程序出错需要关闭”,无法正常运行。

向大家请教原因。谢谢!
谢谢longinus。

按我初学者的理解来说,scanf后面需要接取地址符号&,所以第一个是正确的。后面加上printf,应该能正确读出刚才输入的放到的&str[2]的数据。第二个也正确,因为指针本身就是指向地址,与&同意义,故也应能正确输出其值。

至于“左值”我们没有学过这样的概念。系大一,首次接触。但我会好好查查 :)

用printf,后面可以跟str[2],或者*p,我是这样理解的。

我用的ms vs v6 sp6,我会下载你使用的(或最新的)来试试。

无论你是否有新的“解释”,请回复一声。谢谢。

显然1错2对。
2楼的不会不要乱说。
注意:%s是输入一个字符串,在C语言中,字符串是放在一个字符数组中的,所以后边应是一个数组的地址。而第一个中给的地址是数组中第三个元素的地址。难道你想把一个字符串放到一个字符中??显然是不对的。
当然,你也可以这样输入一个字符串:
for(i=0;i<n;i++)
scanf("%c"&str[i]);
通过一个for循环逐个输入字符。这里是"%c"。
第二种情况就不同了,他用了指针。
这样输入的时候,输入项给了一个指针变量名p,则系统先将第一个字符储存到它所指向的空间,然后系统会使p自动加1,使之指向下一个字符空间,这样才能依次输入一个字符串。

虽然这两种写法表面上看是一样的,都是第三个元素的地址,但在实现上却是不同的。不能只看表面现象。还有这非常基本,可见楼主是个新手,还需多努力,最好找个老师。

【1】
char str[20],*p=str;

scanf("%s",&str[2]);
printf("str1=%s\n", &str[2]);

scanf("%s",p+2);
printf("str2=%s\n", p+2);

// “字符串”不同于简单类型

争什么争?

(Migoler)

一好问题啊!
以下都亲自测试过。
我们看一看第一个。
char p;
scanf("%s",&p);
请问错在哪儿?
看出来了吧,要把%s换成%c因为p是字符(没串)。
请问!!源问题中str[2]是字符串还是字符?(记住,字符串后面有'\0')
所以第一个是错滴!
但是:
main()
{
char str[20];
scanf("%s",&