字符数组和字符串的小细节

1. 背景知识

1、C语言中任何数组是const类型的,意思是被它修饰的值不可更改。
2、字符串就是一个地址。

2. 指向字符串的指针

2.1 代码A

const char *a = "unix";
char *b = "hello";

pritnf("%s \n", a);
a = b;
printf("%s \n", b);

/**---------input----------**/
// unix
// hello

关于代码A中Line 1疑问

  • const 作用于下面那一个?
    • 指针a
    • 指针a指向对象的值

对比代码A中input,我们可以确定,const 修饰的声明中,a的地址是可以被改变的。

2.2 代码B

当我们把代码A中的Line 5修改为
*a = *b;

编译器给出错误提示:[Error] assignment of read-only location '*a'
中文意思是赋值给只读位置*a*a就是a指向对象的值,所以 *a = *b错误

2.3 结论

const char *a = "hello" 语句中const修饰的是a指针指向内存的值

3. 字符数组

3.1 代码C

char a[20] = "hello world";
char *b = "hello";
printf("%p = %s\n", a,a); 
    
a[0] = 'a';
printf("%p = %s\n", a,a);
/**---------input----------**/
// hello world
// aello world 

关于代码C中疑问

  • 数组的元素和地址是否可以更改
    • Line 1 : 字符数组可以对其元素进行更改

把代码C中Line 4 改成
a = ba = "hi"
都会出现错误提示: [Error] assignment to expression with array type
中文通俗意思:不可以赋值给具有数组类型的表达式。这里的表达式是指整个数组的首地址。

也就是说在C语言内部 数组的首地址是不可更改的,相当于被const修饰

3.2 总结

数组的元素可以更改,而数组的首地址为只读

4. 拓展

在第二节中,讨论了const对指针对象的作用,那么有没有办法让指针本身只读?

char *const a;
a =  "hello";   
printf("%p = %s\n", a,a); 

上述代码会提示 [Error] assignment of read-of 'a'
中文意思为 错误:为只读的'a'赋值

所以,类型描述 *const 变量名 即可让指针变量为只读。


我愿以为博客园对makedown支持不是很好。没想到连目录都支持了。基本功能算是不错了。美中不足的代码块行数显示不了

猜你喜欢

转载自www.cnblogs.com/Fsiswo/p/11133211.html