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


    1. 背景知识

    1、字符串就是一个地址。

    2. 指向字符串的指针

    2.1 代码A

    const char *a = "unix";
    char *b = "hello";
    
    pritnf("%s 
    ", a);
    a = b;
    printf("%s 
    ", a);
    
    /**---------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
    ", a,a); 
    	
    a[0] = 'a';
    printf("%p = %s
    ", 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
    ", a,a); 
    

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

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


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

    本文由作者原创,如需转载注明出处!
  • 相关阅读:
    转:如何判断软件功能特性的依赖
    原创:运行loadtest时报错the load test results repository was created with a previous version and is not compatible
    转:使用正则表达式进行高效的测试
    6.2.1 HTTP音频播放
    6.2 网络音频
    6.1.3 控制服务中的MediaPlayer
    android开源项目和框架
    6.1.2 加上MediaPlayer的本地服务
    6.1.1 服务
    6.1 后台音频播放
  • 原文地址:https://www.cnblogs.com/Fsiswo/p/11133211.html
Copyright © 2020-2023  润新知