码迷,mamicode.com
首页 > 编程语言 > 详细

指针与数组的对比(——选自:C++内存管理技术内幕)

时间:2015-07-30 16:40:16      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

数组:

      数组要么是在静态存储区上创建(如全局数组),要么是在栈上创建的。数组名代表着

段连续的内存,其地址和容量在生命周期内是不会改变的,而只能改变其数组内容。

指针:

      指针是一种指针类型的变量,变量为一个内存的首地址,可以改变的,所以一般可以用指针

来指向动态开辟的内存。

 

下面以字符串为例来比较数组和指针

1. 修改内容

    char a[] = “ hello” ;
    a[0] = ‘ X’ ;
    cout << a << endl;//输出的是Xello
    char *p = “ world” ; // 注意 p 指向常量字符串
    p[0] = ‘ X’ ; // 编译器不能发现该错误//常量字符串的内容是不能被修改的。
    cout << p << endl;

2.内容复制与比较

      不能对数组名进行直接复制与比较。若想把数组 a 的内容复制给数组 b,不能用语句 b = a ,否则将
产生编译错误。应该用标准库函数 strcpy 进行复制。同理,比较 b 和 a 的内容是否相同,不能用 if(b==a)
来判断,应该用标准库函数 strcmp 进行比较。
      a是一个数组名,p是一个指针语句 p = a 并不能把 a 的内容复制给指针 p,而是把 a 的地址赋给了 p。

要想复制 a 的内容,可以先用库函数 malloc 为 p 申请一块容量为 strlen(a)+1 个字符的内存,再用 strcpy

进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函数 strcmp 来比较。

3.计算内存容量

      用运算符 sizeof 可以计算出数组的容量(字节数)。如下示例中, sizeof(a)的值是 12(注意别忘了’’)。
指针 p 指向 a,但是 sizeof(p)的值却是 4。这是因为 sizeof(p)得到的是一个指针变量的字节数,相当于
sizeof(char*),而不是 p 所指的内存容量。 C++/C 语言没有办法知道指针所指的内存容量,除非在申请内
存时记住它。
       char a[] = "hello world";
       char *p = a;
       cout<< sizeof(a) << endl; // 12 字节
       cout<< sizeof(p) << endl; // 4 字节,表示的是一个字符指针占有的字节数
       注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。如下示例中,不论数组 a 的容
量是多少, sizeof(a)始终等于 sizeof(char *)。
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}

 

 

      

指针与数组的对比(——选自:C++内存管理技术内幕)

标签:

原文地址:http://www.cnblogs.com/yanliang12138/p/4689599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!