const char类型的赋值

实达诚实 2009-10-12 05:03:48
我定义了一个变量
const char *name_s


我想让这个变量接收sacnf的赋值,请问该怎么写?
...全文
1208 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
实达诚实 2009-10-14
  • 打赏
  • 举报
回复
你们好强大
liyulun 2009-10-14
  • 打赏
  • 举报
回复
指针常量...常量指针...
勤奋的沉沦 2009-10-14
  • 打赏
  • 举报
回复
在c语言里const只是告诉用户这个代码不要尝试去更改他的值.
但是, 想要改也是可以的.
jiangjuntang 2009-10-14
  • 打赏
  • 举报
回复
貌似定义时就得赋值,且不能再改了
pur_e 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 starcat 的回复:]
你试试能不能改变字符串的值嘛^_^
char const *str
const char *str
char *const str
[/Quote]

多谢,学了不少

1.const修饰指针

const修饰指针又可分为三种情况:
const修饰指针本身
const修饰指针所指的变量(或对象)
const修饰指针本身和指针所指的变量(或对象)
(1).const修饰指针本身
这种情形下,指针本身为常量,不可改变,任何修改指针本身的行为都是非法的.例如:

const int a = 1;
const int b = 2;
int i = 3;
int j = 4;
int* const pi = &i; //ok, pi的类型为int* const , &i的类型为int* const
int* const pi = &a; //error, pi的类型为int* const, &a的类型为const int* const
pi = &j; //error, 指针是常量,不可变
*pi = a; //ok, *pi并没有限定是常量 ,可变

由此看出,pi是常量,常量在初始化和赋值时,类型必须严格一致。也就是
const修饰指针本身时,=号两边的变量类型必须严格一致,否则不能匹配。
(2).const修饰指针指向的变量(或对象)
此种情形下,通过间接引用指针不可改变变量的值,假设指针为p,则*p不可变,下面以例子说明:

const int *pi = &a;
//or int const *pi = &a;
//两者毫无二致,不过BS喜欢前者,这也没什么技术上的优劣之分,也就是说const int与int const可以互换. 建议大家熟
//悉这两种形式,为简洁便,以后统统用前者.
//ok, const并不修饰指针本身,pi对赋值类型
//没要求 ,但pi是int*型指针,所以所赋的必须是个地址值。
const int *pi = &i; //ok ,pi可赋值常量的地址,又可赋变量的地址
const int *pi1 = &a;
const int *pi = pi1; //ok
*pi = j; //error,*pi 不可变,不能更改指针的间接引用形式
pi = &j; //ok,pi可变
pi = &b; //ok,pi可变
pi++; //ok
--pi; //ok

由此可见,pi是变量,可以赋值常量和变量的值,正如一个整型变量可赋整型数和整型变量一样.const修饰的不是指针本身,而是其间接引用,=号两边的类型不必严格匹配,如:const int* pi = &a;中,pi的类型为int*,而&a的类型为const int* const,只要其中含有int* 就可以。又如:const int *pi = &j;中,pi的类型为int*,而&j的类型为int* const,它向pi赋值并无大碍。
(3)const修饰指针本身和指针所指的变量(或对象)
设有指针p,此种情形下,p和*p都不可变.举例如下:

const int* const pi = &a;
//or int const* const pi = &a;
//将const pi看作一体,就与(2)所述相同,只是要求pi必须为const,正如上所说,=号两边的类型不必严格匹配,但必须含有int*, &a的类型为const int* const,含有int*, 所以可以赋值。
const int* const pi = &i; //ok, &i类型为int* const,含有int*, 可赋值。
const int *pi1 = &j;
const int *const pi = pi1; //ok, pi1类型为int*
pi = &b; //error, pi不可变
pi = &j; //error, pi不可变
*pi = b; //error, *pi不可变
*pi = j; //error, *pi不可变
pi++; //error ,pi不可变
++i; //ok, =号右边的变量(或对象)与所修饰的变量无关
a--; //error, a为const

这种情况,跟以上两种情形有联系。对const int* const pi = &a;我们可以这样看:const int*( const pi )= &a;(仅仅是表达需要),将const pi看作一体,就与上述分类(2)符合。只要含有int*便可.
taoer19870917 2009-10-12
  • 打赏
  • 举报
回复
const定义的变量是不可以修改的
pur_e 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 starcat 的回复:]
引用 4 楼 pur_e 的回复:
楼上注意了,const char *name_s表示的是指针name_s的值也就是指向的位置不能变,但所指向位置的值是可以改变的

就是说
char s;
name_s=&s;
是不可以的
但给*name_s赋值是可以的
你试试能不能改变字符串的值嘛^_^
char const *str
const char *str
char *const str
[/Quote]

测试了一下,直接赋值不可以,即*name_s=不允许

scanf可以正常读入,即

#include <stdio.h>
void main()
{
char a='A';
const char *name_s=&a;
//*name_s='B';//报错
scanf("%c",name_s); //正常,并且name_s被改变
printf("%c",*name_s);

}

starcat 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pur_e 的回复:]
楼上注意了,const char *name_s表示的是指针name_s的值也就是指向的位置不能变,但所指向位置的值是可以改变的

就是说
char s;
name_s=&s;
是不可以的
但给*name_s赋值是可以的
[/Quote]你试试能不能改变字符串的值嘛^_^
char const *str
const char *str
char *const str
thy38 2009-10-12
  • 打赏
  • 举报
回复
const char *你没有申请内存,所以不能scanf。
而如果是const char a[],又只能在申明时赋值。
pur_e 2009-10-12
  • 打赏
  • 举报
回复
楼上注意了,const char *name_s表示的是指针name_s的值也就是指向的位置不能变,但所指向位置的值是可以改变的

就是说
char s;
name_s=&s;
是不可以的
但给*name_s赋值是可以的
starcat 2009-10-12
  • 打赏
  • 举报
回复
……逻辑错误

还有你得分清楚C和C++在这方面规定的区别,见《Thinking in C++》“literal(常量)”那一章
whg01 2009-10-12
  • 打赏
  • 举报
回复
const char *name_s 这样定义,是定义了一个指向不可更改的字符串的指针。
改成char *name_s;
指针赋值也可:
char * name_s = (char *)malloc(100);
pur_e 2009-10-12
  • 打赏
  • 举报
回复

#include <stdio.h>
void main()
{
const char *name_s=new char[50];
scanf("%s",name_s);
printf("%s",name_s);
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧