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

2025-02-27 11:30:14
推荐回答(5个)
回答1:

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

回答2:

在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
数组也可以用字符串常量进行初始化:
Char a[]=”abcdefg”;
如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。
如下:
(1)修改指针字符串中的数据
[cpp] view plaincopyprint?
#include
#include

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

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

(2)修改数组字符串中的数据
[cpp] view plaincopyprint?
#include
#include

int main(){
char buf[]="ABCDEFG";
printf("buf=%c\n",buf[2]);
buf[2]='M';
printf("buf=%s\n",buf);
printf("end!\n");
}

回答3:

*ptr是一个指针,即指向字符的地址,每一个地址下是一个字节,即8位,一个字符是一个字节。字符串要求最后一个字符是'\0',不然有可能发生内存泄露,而字符数组没有这个要求,但要求存放统一的类型。进行操作的时候ptr就代表了这个字符串,而字符常量需要用*p来表示,当然p中存放的是指向这个字符的地址。
符号引用是系统自制的规定 就像汇编里跳转的符号,它只是一个地址,地址下的有规定限度的内容就是这一块符号之后的运行。

回答4:

char *ptr = "hello", 就是声明一个指针,指向字符串数组hello。数组名就是指针也就是地址。
http://hi.baidu.com/luosiyong/blog/item/92bbdcfe00a7b32a5c600888.html

回答5:

char *ptr="hello";
这句话实质上把字符串"hello"的首地址赋值给ptr
即指针变量ptr存的是字符串"hello"的首地址
他可以写成
#include
void main()
{
char a[]="hello";
char *pr=a;
puts(pr);
}
//希望能够帮助到你