zoukankan      html  css  js  c++  java
  • const char *和 char *const以及 char const * 的区别

    #include <stdio.h>
    #include <stdlib.h>
    
    void parse_arg(const int argc, const char **argv, const char **src, char const **dest, int *num)
    {
        if(argc != 4){
            fprintf(stderr, "%s <number> <src_filename> <dest_filename>\n", argv[0]);
            exit(1);
        }
        
        *num = atoi(argv[1]);
        *src = argv[2];
        *dest = argv[3];
    }
    
    int main(const int argc, const char **argv)
    {
        const char *src;
        char const *dest;
        int num;
        parse_arg(argc, argv, &src, &dest, &num);
    
        printf("%d, %s, %s\n", num, src, dest);
        return 0;
    
    }
    

      

    最好把命令行参数的解析放在main函数之外,有利于程序逻辑的清晰;

    对命令行参数的数据要做到只读,这是很必要的;

    -----------------------------------------------

    const <type> 和<type> const 完全等价(这一点用objdump -dS 反汇编后, 用diff命令比较.s文件可知)

    这样一来本文讨论的问题就很清晰了,问题归结为 <type> const  *p 和  <type>* const p 区别;
    只需要看const 后是什么类型;
    前者const 修饰的是*p,他是p所指向的内容为read-only;
    而 后者 const 修饰的是p, 即指针变量p本身为 read-only;
     
    从内存的角度来看(本人已测试验证):
    <type> *const p   变量p存放在read-only数据段
      p为常量指针,p只用于读操作, 告诉编译器,p仅用做右值;
    const <type> *p   变量p存放在栈区;
       *p不一定为常量区,但*p只用于读操作,告诉编译器*p仅用作右值;
     
    -------------------------------------------------
     
     
  • 相关阅读:
    简单取色器
    第一部分实现功能:使用一个TabControl和一个Memo和TDictionary类实现文本临时存储
    功能设计笔记概要
    NFC与RFID简介
    【JAVA设计模式-第四课】观察者模式-屌丝求职记+新闻订阅
    「学习笔记」左偏树
    「SP122」STEVE
    「学习笔记」 FHQ Treap
    「整理」同余
    「目录」数论
  • 原文地址:https://www.cnblogs.com/mathzzz/p/2687783.html
Copyright © 2011-2022 走看看