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