C语言字符指针(字符串)为什么不可以直接像数组那样赋值? 上面的代码是 OK 的,那为什么不可以写成如下的形式: 或者有什么其他的方法直接赋值? 因为语句 char* p = str; 的实质是将字符数组(左值) str[4] 的第一个素的地址取出来,然后存在字符指针类型的变量p里。 也就是说,能存在p中的值只能是字符指针类型的值。而{‘a’,’b’,’c’}无法转换成一个字符指针类型的值,所以报错。 注意初始化和赋值是不同的。 {‘a’, ‘b’, ‘c’} 这东西不是表达式,没有类型,只能用来初始化数组或结构体。 而数组可以隐式转换成指向其首素的指针右值,该值能初始化或复制给指针对象。 另外 C 字符串指的是以零值字符结尾的连续字符对象序列,并不是字符指针,只是可以通过字符指针处理字符串。 C 语言可以写 char *p = (char[]){‘a’, ‘b’, ‘c’}; 。也可以用在赋值里。 右边的东西是复合字面量,是左值。生存期为当前块(函数内部)或整个程序执行期(函数外部)。这段声明的作用是创建一个无名数组,再由它隐式转换出来的指针值初始化指针对象 p ,和题目上的写法相比少声明了一个标识符。 char str[4] 是一个数组,可以存4个char。 char *p 是一个指针,可以存一个char指针。 {‘a’,’b’,’c’} 是个字面量,字面量只在编译阶段用来给变量初始化。不能取地址,所以不能把指针指向一个字面量。 所以数组str被初始化了,而p取不了字面量的地址。 str这么写本质是数组,只是C会在用到str时自动取它的地址。 因为在char *p = {…};中 p 并未分配合法的可用空间,指向未知的是内存区域。而对未初始化指针赋值这种操作属于非法写内存,会出现sf。 正确的做法是先分配空间 char *p = (char*)malloc(sizeof(char) * 4); 后赋值。 而第一种方式中,对于char*p = st; 等价于 char *p; p = str; 更明显一点: char *p; p = &str[0]; 到这里就很明了了,一般来说,对于数组str[N],直接对str引用表示&str[0],即取str[N]的第一个(首)素地址。因为数组在声明时系统就为之分配了内存空间(某种意义上,数组其实是指针的语法糖),因此p = &str[0]相当于建立了数组str一个新的引用(注意是建立引用,不是复制,操作*(p+n)和操作str[n]效果相同),且不是不可用的未知区域,所以合法。 ptr取的那也是数组的首地址,这也不是赋值呀。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/23491.html