字符串为什么可以赋值给指针?

来源:百度知道 编辑:UC知道 时间:2024/05/31 12:47:51
请问
char a[]="abc";和 char *p="abc";
到底哪里不同,我看教程,他对char a[]="abc" 讲解是,先在内存开辟一连续存储单元(a),然后把字符串存放到这些存储单元去,这个我能理解。
就是不明白char *p="abc";是什么含义。指针存放的应该是地址值吧??这里有什么玄机???谁给我讲讲,谢谢啊
最好通俗点说明,我是新手,呵呵
char *p,中的指针p,在内存中有没有给他开辟空间?为什么我printf("%d",p);是错误的?

简单说“abc”是字符串常量,C中没有字符串变量,所以在存放字符串常量时一般采用字符数组来存储。

实际上数组是一个连续的存储空间,这里记录着两个重要的量:首地址和空间大小。首地址用数组名a来记录,尔空间大小用a的下标与数组元素的大小的乘积来表示。

但对于字符串往往不关心到底占用多大的存储空间,只知道是字符串就可以了。做处理的时候“abcde”和“abcdefgh……z”的过程是一样的,反正最后都是字符串结束标志'\0',所以字符按串的长度显得不是特别重要。这也是为什么char a[]="abc";中并不指定a数组的长度。

因此往往只要记录字符串的首地址就可以了。而指针正是记录地址的不二人选。

所以,对于老手在做字符串的题目的时候,不关心其长度,只要记录下首地址就OK了。定义形势就是char *p="abc";

本质上char a[]="abc";和 char *p="abc"; 是一样的。

char *p="abc";

也是在内存开辟一连续存储单元,将abc放在里面,
而p就指向了这块存储单元的首地址

而且这块存储单元的大小就是4个字节,包含结束符 \0
如果程序后边将p 指向别处那麽 这块4字节的存储单元就会被丢失,
在程序中无法再被访问到

char *p="abc";
在内存先开辟一块连续空间存放"abc",然后将存放"abc"的内存地址的首地址赋值给指针p。

char *p="abc"
先在内存开辟一连续存储单元,然后把字符串存放到这些存储单元去,再把存储单元的首地址给P
不就少了个存储单元的变量名吗,想得太复杂了

指针指向字符串地址

p保存的是指向a空间地址。