回 帖 发 新 帖 刷新版面

主题:指针急救!!!

#include<stdio.h>
main()
{ char *p;
p="visual c++";
scanf("%s",p);
printf("%s\n",p);
}
如果这样写程序运行就会出错,而如:
#include<stdio.h>
main()
{ char *p,s[14]="visual c++";
p=s;
scanf("%s",p);
printf("%s\n",p);
}
这样写就是正确的。不知道是什么原因造成的请那位大侠帮帮忙解释一下,要详细点哦。并说说他们的区别。拜托!!!

回复列表 (共17个回复)

11 楼

我想纠正的是file2里的a会指向file1里面那片内存,这个就是咱俩争论的焦点

12 楼

[quote]我想纠正的是file2里的a会指向file1里面那片内存,这个就是咱俩争论的焦点[/quote]
我一直说因为类型不同所以指不过去……

13 楼

能,你可以试下

14 楼

你好:
   p="visual c++"; 指针P指向的字符常量,scanf("%s",p);不能对常量赋值;
而char *p,s[14]="visual c++";p=s; p指向数组变量,则可赋值。希望最你有帮助。

15 楼

[quote]第一个,因为初始化指针后,系统给p的只是一个4字节的指针地址,不能赋值为一个字符串常量,如果写成char *p="Visual C++",系统将p看作是const char *类型,将字符串常量的首地址赋值给p,但从此p变为只读类型,不能更改,但可以指向别的char类型,例如*(p+1)='a'是错的,char a='A';p=&a;是正确的。
第二个,在通常情况下,指针和数组是等价的,但这只是指针最一般的用法,就像你写的,p=a;此时p和a是等价的,p[1]和a[1]只指向的同一个内存单元。但这只是通常情况,当在其他文件中定义了一个数组时,在其他地方在声明是,必须用数组,用指针就是错误的。
不知道你明白了没有,这个是我个人理解。
[/quote]

所以说遇到"char *p="Visual C"
最好是直接声明 成" const char *p="Visual C",这样就不会出现改变const的情况了

不知道各位是怎么看的

16 楼

[quote][quote]第一个,因为初始化指针后,系统给p的只是一个4字节的指针地址,不能赋值为一个字符串常量,如果写成char *p="Visual C++",系统将p看作是const char *类型,将字符串常量的首地址赋值给p,但从此p变为只读类型,不能更改,但可以指向别的char类型,例如*(p+1)='a'是错的,char a='A';p=&a;是正确的。
第二个,在通常情况下,指针和数组是等价的,但这只是指针最一般的用法,就像你写的,p=a;此时p和a是等价的,p[1]和a[1]只指向的同一个内存单元。但这只是通常情况,当在其他文件中定义了一个数组时,在其他地方在声明是,必须用数组,用指针就是错误的。
不知道你明白了没有,这个是我个人理解。
[/quote]

所以说遇到"char *p="Visual C"
最好是直接声明 成" const char *p="Visual C",这样就不会出现改变const的情况了

不知道各位是怎么看的
[/quote]
写不写前面那个const都不允许改变这个字符串常量的值(const不能真正保护变量的TC除外),写上只是让代码看起来明确一点,写代码的时候难保不会出现有人昏头仍然要改的情况

17 楼

你定义新的指针,如果想给它赋值的话,就必须给它分配空间,可以用malloc()实现,你第一个里面*p系统只给它分配了sizeof(char *)的空间,你给他赋值当然就不能实现了;而你如果想让它指向一个已存在的指针的话,就不用分配空间,就像你第二个里面将p指向字符数组是s[14]的首地址。

我来回复

您尚未登录,请登录后再回复。点此登录或注册