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

请教一下诸位高手,有如下c语句char*ptr="hello";如何理解以上语句?指针变量的赋值不是应该赋予地址值吗?将一个字符串常量赋予一个指针,如何理解这一条语句的意... 请教一下诸位高手,有如下c语句char *ptr="hello";
如何理解以上语句?指针变量的赋值不是应该赋予地址值吗?将一个字符串常量赋予一个指针,如何理解这一条语句的意思?在下不太理解,求指导
字符串数组的作用不就是为字符串分配内存吗?字符串数组变量与字符串常量有何区别?上面的问题中的那条语句,看起来比较奇怪,难道这是c语言的特殊规定,还是有其他含义?
展开
 我来答
linkman_cn
推荐于2016-03-25 · TA获得超过540个赞
知道小有建树答主
回答量:117
采纳率:0%
帮助的人:99万
展开全部
首先请明确一点:指针也是变量, 只不过编译器解析该变量时将它的内容看作地址去访问内存.
其次请明确应,程序分为不同的段,包括代码段、数据段等。
类似“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'。
许诗文00
推荐于2018-05-07 · TA获得超过4291个赞
知道小有建树答主
回答量:425
采纳率:100%
帮助的人:26.8万
展开全部
在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");
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2012-02-05
知道答主
回答量:30
采纳率:0%
帮助的人:9万
展开全部
*ptr是一个指针,即指向字符的地址,每一个地址下是一个字节,即8位,一个字符是一个字节。字符串要求最后一个字符是'\0',不然有可能发生内存泄露,而字符数组没有这个要求,但要求存放统一的类型。进行操作的时候ptr就代表了这个字符串,而字符常量需要用*p来表示,当然p中存放的是指向这个字符的地址。
符号引用是系统自制的规定 就像汇编里跳转的符号,它只是一个地址,地址下的有规定限度的内容就是这一块符号之后的运行。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
luosiyong
2012-02-03 · TA获得超过3256个赞
知道大有可为答主
回答量:1090
采纳率:0%
帮助的人:1632万
展开全部
char *ptr = "hello", 就是声明一个指针,指向字符串数组hello。数组名就是指针也就是地址。
http://hi.baidu.com/luosiyong/blog/item/92bbdcfe00a7b32a5c600888.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
201007031324
2012-02-04 · TA获得超过1239个赞
知道小有建树答主
回答量:505
采纳率:0%
帮助的人:234万
展开全部
char *ptr="hello";
这句话实质上把字符串"hello"的首地址赋值给ptr
即指针变量ptr存的是字符串"hello"的首地址
他可以写成
#include<stdio.h>
void main()
{
char a[]="hello";
char *pr=a;
puts(pr);
}
//希望能够帮助到你
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式