zoukankan      html  css  js  c++  java
  • 数组和指针的区别

    数组对应着一块内存区域,而指针是指向一块内存区域。数组其地址和容量在生命期里不会改变,只有内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。

    声明一个数组时,编译器会根据数组中元素的个数为其分配空间,数组名存放在符号表中,该值为数组的起始地址,为常量,不能被修改。

    而指针指向一个地址,而且其本身也需要空间来存储。如下图所示:

    注:a=0xD2D61000  在符号表中,为一常量,并不占用内存空间。&a应该是没有意义,在vc6下,&a=a=0xD2D61000

          b=0xD2D61000  在内存中,为一变量,占用4个字节,&b=0xD2D60080

          注意:"hello"不是常量字符串,是可被修改的。

    上图,说明了数组和指针的本质区别

    +++++++++++++++++++++++++++

    以下具体给出几个典型的差别:

    1. 修改内容上的差别

    char a[] = "hello";
    a[0] = 'X';
    char *p = "world"; // 注意p 指向常量字符串
    p[0] = 'X'; // 编译器不能发现该错误,运行时错误
    

    2. sizeof计算大小

    char a[] = "hello";
    char *p = a;
    cout<< sizeof(a) << endl; // 6 字节  字符串默认后面会添加一个\0
    cout<< sizeof(p) << endl; // 4 字节
    
    int b[]  = {1,2,3};
    int *q = b;
    cout<< sizeof(b) << endl; // 12 字节
    cout<< sizeof(q) << endl; // 4 字节

    3. 数组作为函数参数时,会蜕化成指针

    void Func(char a[])
    {
        cout<< sizeof(a) << endl; // 蜕化成指针,为4 字节
    }
    
  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/kekec/p/2183150.html
Copyright © 2011-2022 走看看