下载此文档

字符串与指针.docx


文档分类:IT计算机 | 页数:约7页 举报非法文档有奖
1/7
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/7 下载此文档
文档列表 文档介绍
一、 C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5'; p=&a; //显然是正确的, p="abcd"; //但为什么也可以这样赋值?? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量,请各位指点! 答: 双引号做了 3件事: (在常量区),存放了字符串 '/0' 、 char *p=“hello ”;上边的表达式为什么可以,而把 p换成数组,然后再赋值就不行了解释: 字符串常量"hello" 出现在一个表达式中时,"hello" 表达式使用的值就是这些字符所存储的地址(在常量区),而不是这些字符本身。所以,可以把字符串赋值给指向字符的指针 p,而不能把字符串赋值给一个字符数组。 char a[10] =“hello ”;//这样可以,这种情况是 c语言初始化所支持的如果写成 char a[10] 然后 a=“hello ”这样就错误了。同样是 a数组, char a[10] =“hello ”;这种是数组的初始化,和 a[0] =‘h’ a[1] =‘e’…是一个道理但是换成 char a[10] 然后 a=“hello ”就不行了“hello ”赋值的值是一个地址,而 a虽然也有地址,但是这与指针是不一样的,指针的值是地址,而数组的值虽然也是地址,但是却是一个常量,所以不能给常量赋值。三、标题: 对字符数组,字符指针,字符串常量原帖地址: ./ ,编译器都会为该字符串自动添加一个 0作为结束符,如在代码中写"abc", 那么编译器帮你存储的是"abc\0" 2."abc" 是常量吗?答案是有时是,有时不是。不是常量的情况:"abc" 作为字符数组初始值的时候就不是,如 char str[] ="abc"; 因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc" ,而又因为字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为 char str[3] ={'a','b','c'}; 又根据上面的总结 1,所以 char str[] = "abc"; 的最终结果是 char str[4] ={'a','b','c','\0'}; 做一下扩展,如果 char str[] ="abc"; 是在函数内部写的话,那么这里的"abc\0" 因为不是常量,所以应该被放在栈上。是常量的情况: 把"abc" 赋给一个字符指针变量时,如 char* ptr ="abc"; 因为定义的是一个普通字符指针,并没有定义空间来存放"abc" ,所以编译器得帮我们找地方来放"abc" ,显然,把这里的"abc" 当成常量并把它放到程序的常量区是编译器最合适的选择。所以尽管ptr的类型不是const char* ,并且ptr[0] ='x'; 也能编译通过,但是执行 ptr[0] ='x'; 就会发生运行时异常,因为这个语句试图去修改程序常量区中的东西。记得哪本书中曾经说过 char* ptr ="abc"; 这种写法原来在 c++ 标准中是不允许的, 但是因为这种写法在 c中实在是太多了,为了兼容 c,不允许也得允许。虽然允许, 但是建议的写法应该是 cons

字符串与指针 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数7
  • 收藏数0 收藏
  • 顶次数0
  • 上传人endfrs
  • 文件大小0 KB
  • 时间2016-05-11