请教一下诸位高手,有如下c语句char *ptr="hello";
如何理解以上语句?指针变量的赋值不是应该赋予地址值吗?将一个字符串常量赋予一个指针,如何理解这一条语句的意思?在下不太理解,求指导
字符串数组的作用不就是为字符串分配内存吗?字符串数组变量与字符串常量有何区别?上面的问题中的那条语句,看起来比较奇怪,难道这是c语言的特殊规定,还是有其他含义?
所谓只读引用,是不能修改吗?如果这样说的话,是不是字符串常量可以理解成一种特殊的字符串数组?它只能被读取而不能被修改?
追答是的,只读引用不能修改,比如ptr[0]=‘a’就是非法的,因为hello字符串被放在了程序的代码段,而代码段具有可执行、只读的性质。至于“特殊”,确实有点,它只读而不可修改。“字符串数组”这一说法是错误的,因为此范畴内的两个常见概念是“字符串”和“字符数组”,前者以'\0'结尾,后者则不强调。
作为总结,再次列举:
char *ptr = "hello"; 表示定义字符指针ptr,其值为一个常量字符串"hello"的首地址;
char ptr[]="hello"; 表示定义字符数组ptr,其值依次为 'h'、'e'、'l'、'l'、'o'、'\0'。
通过此种方法定义的指针变量,间接访问指针变量所指的对象,是那个字符串常量,还是它所指的那个字符?还有就是如何访问如此定义的字符串常量,和这样定义的字符型指针变量能否偏移,偏移后又代表什莫?
追答一系列字符顺序排列在内存中,并以\0结尾即成为一个字符串!所以它访问的既是字符又是字符串。你可以理解为该指针指向的是一个字符,所有处理字符串的函数会沿著这个地址往下处理直到遇到\0为止,从这个角度讲又是在处理字符串。指针可以偏移,如果向後移1,则代表字符串"ello",偏移2表示字符船"llo"。。。。。你可以看看C语言中的内存模型。