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

原创 2012年03月28日 10:13:13

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

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");

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

继续补充中。














                    

相关文章推荐

【c和指针学习笔记】深入理解字符串常量

思考下列表达式代表什么意思??? 1:“zyh_helen”+ 1 2: *“zyh_helen” 3:“zyh_helen”[2]。 如果你觉得上述表达式不了解,甚至认为他们看上去像垃圾的话...

每日一c,对指针,数组,字符串常量之间的梳理(一)

时间:2017.5.31    21:24 万丈高楼平地而起,学好IT,得把纯c基础打牢实了。最近,乘着还有空闲时间,从新梳理哈自己的纯C关系树。一边学习一边记录,蛮不错的 指针与数组的相同与...

函数的返回类型为指针类型时的若干思考(字符串常量问题)

By zieckey (http://blog.chinaunix.net/u/16292/index.html) 问题的引入: 看看下面的程序的输出: #inc...

对字符数组,字符指针,字符串常量以及其sizeof的一些总结

对字符数组,字符指针,字符串常量以及其sizeof的一些总结 在网上经常看到一些类似字符串或者sizeof等的公司笔试题,鄙人不才,但也作了一些总结, 这些总结都是在vc2003下测试得到的结...

"显微镜"下细看字符串常量初始化数组和指针

   先看代码: 1: #include "stdafx.h" 2: #include 3:   4: u...

字符数组,字符指针,字符串常量以及其sizeof的一些总结

1. 以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符。 如在代码中写"abc",那么编译器帮你存储的是"abc\0"。 2. "abc"是常量吗?-----------注...

c语言中的字符类型指针赋值字符串常量

char *p = “hello”; 上边的表达式为什么可以,而把p换成数组,然后再赋值就不行了 解释: 字符串常量”hello”出现在一个表达式中时,表达式使用的值就是这些字符所存储的地址,而...

字符数组,字符指针,字符串常量以及其sizeof的一些总结

1.     以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符。 如在代码中写"abc",那么编译器帮你存储的是"abc\0"。 2.     "abc"是常量吗? 答案是有时是...

字符串常量指针与字符数组的区别

转自:http://hi.baidu.com/zengzhaonong/blog/item/b50db67774cb5318b151b93a.html 数组要么在静态存储区被创建(如全局数组),...

字符串常量、字符数组、字符指针的一点小结

通常,字符串常量在程序中有两种可能的身份——1、真正的字符串常量;2、字符数组的初始化列表。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c指针学习——之字符串常量
举报原因:
原因补充:

(最多只允许输入30个字)