一、 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转载请标明出处.