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僅用作右值;
 
-------------------------------------------------
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM