Chinaunix首页 | 论坛 | 博客
  • 博客访问: 587833
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1554
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 22:57
个人简介

我本仁慈,奈何苍天不许

文章分类

全部博文(165)

文章存档

2018年(1)

2016年(33)

2015年(5)

2014年(34)

2013年(92)

分类: 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’自增”,这也说明了typedefdefine的区别,不是简单的替换,const pstr p2并不是const  char *p2const pstr p2const 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的,只不过intlong是系统类型,而pStr是我们定义的类型。为什么会出现这种效果了,就是因为typedef,它把char *定义成一个复合的类型,要从整体上来理解语义,而不是字符替换后来理解语义。

阅读(750) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~