现在的位置: 首页 > 综合 > 正文

c指针学习——之字符串常量

2013年02月09日 ⁄ 综合 ⁄ 共 1878字 ⁄ 字号 评论关闭

自己学习的时候,编写了一个小的指针练习:

int main(void)
{
char* s1 = "Hello, World!";
char* s2 = "123456";
printf(s1);
printf(s2);
s1++;
s2++;
*s1 = *s2;
printf(s1);
printf(s2);
return 0;
}

是有错误的,运行时错误:

在这一行:*s1 = *s2; 会运行错误。

网上查资料知道:

(1)
char* s1 = "Hello, World!";
char* s2 = "123456";
"Hello, World!",和"123456"存储在常量数据区,是只读的,

所以*s1 = *s2,(或者是 s1[2]='X')

在编译时,是对变量的赋值,能通过编译;

在运行时,发现是对“常量字符串”值的修改,是不对的。(只有字符串常量,没有字符串变量)//运行时错误
(2)
char str1[] = "Hello, World!";
char str2[] = "123456";
"Hello, World!",和"123456"存储在常量数据区,是只读的。上面的str1数组名和str2数组名所指向的是对常量数据区的一个拷贝。

而且数组名字str1,str2,系统认为数组名字是一个指针常量。
在编译时:str1++,str2++是错误的。//
编译时错误 //
但是str2[1] = "X",是可以通过编译,并且运行的。

(str1,str2,指向各自数组首元素的地址,是个常量。对常量不能进行类似变量的运算


(3)
char str1[] = "Hello, World!";// 或者用char *str1 = "hello, world!";
char str2[] = "123456";// 或者用char *str2 = "123456";
但是可以定义 两个指针变量 char* p1=str1;char* p2=str2; 这时候 p1,p2都是指针变量,且所指向的内容是可读写的,这样 *p1++=*p2++;才正确。

所以总结一下就是:

char *str_1 = "123456"; // "123456"在静态数据区,str_1指向它,是个字符串常量,所以不能通过str_1来修改;名字
str_1 不是常量。

char str_2[] = "567890"; // "567890"在静态数据区,str_2指向它在的一个拷贝(拷贝也在在栈里(局部变量),或是在静态数据区(全局变量)(见下面代码实验)),所以可以通过
str_2 来改变其值。不同的是名字 str_2 是个常量。

[1]当有char *str1 = "123456"时,不能进行 "*str1 = XXXX", 因为"*str1是常量,不能对常量进行赋值操作";会运行时出错;(但是可以"str1 = XXXX"对指针赋值,而不是对指针所指向赋值)

[2]当有char str2[] = "123456"时,不能进行 str2++, 因为"str2是个常量地址(指针常量),不能对常量进行自加操作";会编译出错;

[3]只有char *str = str1;(或者是char str[] = str2); 才能对str进行 " *str = XXXX" 和 "str++"的操作;(因为str是变量,*str也可以变化)

int main(void)
{
	char* s1 = "Hello, World!";
	char s2[] = "Hello, World!";

	printf("Hello, world!的地址为:%p", s1);	putchar('\t');
	printf("s1的地址为:%p", &s1);	putchar('\n');

	printf("Hello, world!的地址为:%p", s2);	putchar('\t');
	printf("s2的地址为:%p", &s2);	putchar('\n');
	
	return 0;
}


运行结果为:

****************************************************************************************************************************

个人想法:这个  c的字符串常量 应该和  java的字符串常量 的区别相联系理解:String a = "123456"; String b = new String ("456789");

*****************************************************************************************************************************

继续补充中。














抱歉!评论已关闭.