zoukankan      html  css  js  c++  java
  • 指针与数组的对比(——选自:C++内存管理技术内幕)

    数组:

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

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

    指针:

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

    来指向动态开辟的内存。

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

    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 字节
    }

     

          

  • 相关阅读:
    P2176 [USACO14FEB]路障Roadblock
    【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)
    图论其一:图的存储
    【计算几何】二维凸包——Graham's Scan法
    P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows
    P2639 [USACO09OCT]Bessie的体重问题 【背包问题】
    如何评价代码质量的高低
    乔新亮-衡量企业 IT 团队价值的唯一指标是什么
    我总结了平台的5道坎
    hadoop namenode的工作机制
  • 原文地址:https://www.cnblogs.com/yanliang12138/p/4689599.html
Copyright © 2011-2022 走看看