我本仁慈,奈何苍天不许
分类: LINUX
2014-01-15 19:30:52
#include
typedef char * pstr;
int main (int argc, char *argv[])
{
char a[] = "hello";
const char *p1 = a;
const pstr p2 = a;
p1++;
p2++;
printf("%s\n",p1);
printf("%s\n",p2);
return 0;
}
上面的代码编译器会报错,错误在“p2++;”这一行,错误为:“在函数‘main’中:
错误: 令只读变量‘p2’自增”,这也说明了typedef与define的区别,不是简单的替换,const pstr p2并不是const char *p2,const pstr p2和const int a没有什么本质的区别,因为pstr是我们自己定义的类型,const pstr p2这句话的意思是p2指向的对象是char型,但是p2本身是只读变量。
const char *p1 = string; 你可以这样理解:(const char) *p1 = string, p1是一个指针,指向const char的东西,这个东西就是string(string是一个字符数组的首地址,它的地址声明后肯定是const的,除非该数组销毁),但是p1是一个指针变量,它是可以递增的,即你看到的p1++,它可以完成从数组的来遍历数组的目的。
而const pStr p2 = string;是这样的:由于p2不是指针,const直接修饰到了p2,即现在的p2是常量了,它的类型是pStr(我们自己定义的类型),相当于const int p2, const long p2等等,const都是直接修饰p2的,只不过int,long是系统类型,而pStr是我们定义的类型。为什么会出现这种效果了,就是因为typedef,它把char *定义成一个复合的类型,要从整体上来理解语义,而不是字符替换后来理解语义。