自己学习的时候,编写了一个小的指针练习:
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");
*****************************************************************************************************************************
继续补充中。