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

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

继续补充中。














                    

指针到底能不能修改其指向的常量字符串?

1.指针到底能不能修改其指向的常量字符串?今天做一个字符串右移函数时,直接使用指针来修改字符串常量的值出现了奇怪运行时错误。 代码如下:#include"stdio.h" #include"stri...
  • gao1440156051
  • gao1440156051
  • 2016年04月07日 22:45
  • 2258

C语言中字符串常量到底存在哪了?

常量存储总结 局部变量、静态局部变量、全局变量、全局静态变量、字符串常量以及动态申请的内存区 1、局部变量存储在栈中 2、全局变量、静态变量(全局和局部静态变量)存储在静态存储区 3、new申...
  • chunlovenan
  • chunlovenan
  • 2014年03月20日 22:03
  • 3236

详解指针常量和常量指针(C、C++工程师面试题)

常量指针:指向常量的指针。 指针本身可以改变,可以再次指向另外的对象。 不能通过指针修改其所指向的对象的值。 指针常量:指针类型的常量。 指针本身的值不能改变,即不能再指向另外的对象。 可以修改指针...
  • rl529014
  • rl529014
  • 2016年06月08日 18:35
  • 1020

C/C++中的常量指针与指针常量

常量指针 常量指针是指向常量的指针,指针指向的内存地址的内容是不可修改的。 常量指针定义“const int *p=&a;”告诉编译器,*p是常量,不能将*p作为左值进行操作。但这里的指针p还是一个变...
  • u014744118
  • u014744118
  • 2016年03月30日 23:22
  • 565

C语言中的const用法以及常量指针与指针常量(有口诀!)

编了这样的口诀,记住,应该不难: const(*号)左边放,我是指针变量指向常量; const(*号)右边放,我是指针常量指向变量; const(*号)两边放,我是指针常量指向常量; 指针变量...
  • xiaocheng198810
  • xiaocheng198810
  • 2014年11月27日 10:19
  • 3108

字符串指针与字符数组的区别(一)--字符串常量的值不能改

经常犯错的知识点,以前也没有理解,这里再好好的记录下。要经常温固而知新。  用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题: 1.     字符...
  • shengabc
  • shengabc
  • 2015年07月06日 10:22
  • 1450

常量指针与指向常量的指针

const int *p和int * const p的区别 对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &char_A;//指向常量的...
  • ycdhonker
  • ycdhonker
  • 2016年06月30日 08:58
  • 1740

常量指针、指针常量、C++类型转换

一、const应用 1.const关键字,他后面内容的不可修改,一般来说,其修饰的变量不可再进行赋值操作; 2.常量指针 int a = 3; int b = 4; const int* pt = &...
  • zz460833359
  • zz460833359
  • 2015年09月10日 22:05
  • 774

C++中 常量引用、指向常量的指针、常量指针的区别

先初步了解引用、指针的一些注意事项。 引用并非对象 引用必须初始化 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起 类型要严格匹配 int &a = 10; ...
  • Rueing839
  • Rueing839
  • 2015年09月13日 17:11
  • 1498

C++ 指针常量、常量指针和常指针常量

1、指针常量 如果在定义指针变量时候,指针变量前用const修饰,被定义的指针变量就变成了一个指针类型的常变量,指针类型的常变量简称为指针常量。 格式如下 数据类型  *   const  指针变...
  • yujin753
  • yujin753
  • 2014年11月26日 22:12
  • 1332
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c指针学习——之字符串常量
举报原因:
原因补充:

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