c语言中字符串常量与指针的关系.

请教一下诸位高手,有如下c语句char *ptr="hello";
如何理解以上语句?指针变量的赋值不是应该赋予地址值吗?将一个字符串常量赋予一个指针,如何理解这一条语句的意思?在下不太理解,求指导
字符串数组的作用不就是为字符串分配内存吗?字符串数组变量与字符串常量有何区别?上面的问题中的那条语句,看起来比较奇怪,难道这是c语言的特殊规定,还是有其他含义?

首先请明确一点:指针也是变量, 只不过编译器解析该变量时将它的内容看作地址去访问内存.
其次请明确应,程序分为不同的段,包括代码段、数据段等。
类似“hello”这类的变量实际是常量字符串,位於程序的代码段,char *ptr="hello表示定义字符指针ptr、并将字符串“hello”的首地址赋值给ptr,如此便可通过ptr引用“hello”,当然是只读引用了。(注意和char ptr[] = "hello"区分,後者定义了一个字符数组ptr)追问

所谓只读引用,是不能修改吗?如果这样说的话,是不是字符串常量可以理解成一种特殊的字符串数组?它只能被读取而不能被修改?

追答

是的,只读引用不能修改,比如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语言中的内存模型。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-05-07
在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
数组也可以用字符串常量进行初始化:
Char a[]=”abcdefg”;
如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。
如下:
(1)修改指针字符串中的数据
[cpp] view plaincopyprint?
#include <string.h>
#include <stdio.h>

int main(){
char *buf="ABCDEFG";
printf("buf=%c\n",buf[2]);
buf[2]='M';
printf("end!\n");
}
#include <string.h>
#include <stdio.h>

int main(){
char *buf="ABCDEFG";
printf("buf=%c\n",buf[2]);
buf[2]='M';
printf("end!\n");
}编译通过了,但是会看到程序运行时出错了:

(2)修改数组字符串中的数据
[cpp] view plaincopyprint?
#include <string.h>
#include <stdio.h>

int main(){
char buf[]="ABCDEFG";
printf("buf=%c\n",buf[2]);
buf[2]='M';
printf("buf=%s\n",buf);
printf("end!\n");
}本回答被网友采纳
第2个回答  2012-02-05
*ptr是一个指针,即指向字符的地址,每一个地址下是一个字节,即8位,一个字符是一个字节。字符串要求最后一个字符是'\0',不然有可能发生内存泄露,而字符数组没有这个要求,但要求存放统一的类型。进行操作的时候ptr就代表了这个字符串,而字符常量需要用*p来表示,当然p中存放的是指向这个字符的地址。
符号引用是系统自制的规定 就像汇编里跳转的符号,它只是一个地址,地址下的有规定限度的内容就是这一块符号之后的运行。
第3个回答  2012-02-03
char *ptr = "hello", 就是声明一个指针,指向字符串数组hello。数组名就是指针也就是地址。
http://hi.baidu.com/luosiyong/blog/item/92bbdcfe00a7b32a5c600888.html
第4个回答  2012-02-04
char *ptr="hello";
这句话实质上把字符串"hello"的首地址赋值给ptr
即指针变量ptr存的是字符串"hello"的首地址
他可以写成
#include<stdio.h>
void main()
{
char a[]="hello";
char *pr=a;
puts(pr);
}
//希望能够帮助到你