Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1642062
  • 博文数量: 268
  • 博客积分: 8708
  • 博客等级: 中将
  • 技术积分: 3764
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-06 15:58
文章分类

全部博文(268)

文章存档

2014年(1)

2013年(15)

2012年(23)

2011年(60)

2010年(51)

2009年(12)

2008年(59)

2007年(47)

分类: C/C++

2010-11-17 15:19:27

指针,数组,数组指针,指针数组的区别

数组或是在静态存储区被创建(全局数组),或是在栈上被创建。
数组名对应着一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。
32位系统下寻址能力(地址空间)是4G-byte(0~2^32-1)二进制表示长度为32bit(也就是4G)。
可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。

区别之一:

char a[] = "hello"; //字符串初始化数组时后面有个\0
a[0] = 'X';
cout << a << endl;
char *p = "world"; // 注意p指向常量字符串
p[0] = 'X'; // compiler不能发现该错误,不过在运行的时候会发生runtime error
cout << p << endl;

区别之二:

用运算符sizeof可以计算出数组的容量(字节数)。比如对应上面的代码,sizeof(a)的值是12
(包括最后面的'\0')。指针p指向a,但是sizeof(p)的值却是4。这是因为sizeof(p)得到的是一个指针
变量的字节数,相当于sizeof(char*),而不是p所指的内存容量siziof(char[6])。
C++/C不能知道指针所指的内存容量。

值得注意的是,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针。那么不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *)。
指针数组
是一个数组,数组元素是指针。
char* pArray[];

数组指针

是一个指针,这个指针指向一个数组
char (*p)[];

数组/指针作为类的成员
class A
{
   char arry[512];
   char *pArry;

   A& operator=(const A& rhA)
   {
     if(this == &rhA)return *this;
     delete pAarry;               
     int len = strlen(rhA.pArry);  //strlen不包含\0
     pArry = new char[len +1];     //pArry要重新分配大小,strcpy会拷贝\0
     strcpy(pArry, rhA.pArry);

     memcpy(arry, rhA.arry, 215)//arry的大小已经分配好,所以只要拷贝内容
     return *this;
    
   }

};

char *psrc = "hello";
char bff[5];
strcpy(bff, psrc);//会将bff[4]后面的内存内容冲掉

char *pbff = new char[2];
strcpy(pbff, psrc);//同样会将pbff[1]后面的内容冲掉

所以这种用法是危险的,应该分配足够大的空间给strcpy, =>new char[len +1]



阅读(1246) | 评论(1) | 转发(0) |
0

上一篇:算法

下一篇:Windows消息队列

给主人留下些什么吧!~~

chinaunix网友2010-11-18 17:40:44

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com