zoukankan      html  css  js  c++  java
  • C/C++数组名与指针的区别详解

    1.数组名不是指针
    我们看下面的示例:

    #include <iostream> 
    int main() 
    { 
        char str[10]; 
        char *pStr = str; 
        cout << sizeof(str) << endl; 
        cout << sizeof(pStr) << endl; 
        return 0; 
    }

    输出结果:
    10
    4
    由输出结果可知,数组名并不是指针。

    2.数组名神似指针
    上例我们证明了数组名不是指针,但第5行,char *pStr = str;
    程序将数组名直接赋给指针,这显得数组名又的确是个指针!
    我们还可以发现数组名显得像指针的例子:

    #include <string.h> 
    #include <iostream> 
    int main(int argc, char* argv[]) 
    { 
        char str1[10] = "I Love U"; 
        char str2[10]; 
        strcpy(str2,str1); 
        std::cout << "string array 1: " << str1 << std::endl; 
        std::cout << "string array 2: " << str2 << std::endl; 
        return 0; 
    } 

    标准C库函数strcpy的函数原形中能接纳的两个参数都为char型指针,
    而我们在调用中传给它的却是两个数组名!
    函数输出:
    string array 1: I Love U
    string array 2: I Love U

    数组名再一次显得像指针!
    既然数组名不是指针,而为什么到处都把数组名当指针用?
    于是乎,许多程序员得出这样的结论:数组名(主)是(谓)不是指针的指针(宾)

    3.揭密数组名
    现在到揭露数组名本质的时候了,先给出三个结论:
    数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
    数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;
    指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!

    1)数组名指代一种数据结构:数组

    现在可以解释为什么第1个程序第6行的输出为10的问题,
    根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的char型数组,
    所以sizeof(str)的结果为这个数据结构占据的内存大小:10字节。
    再看:

    int intArray[10]; 
    cout << sizeof(intArray) ; 

    输出结果
    40

    2)数组名可作为指针常量
    根据结论2,数组名可以转换为指向其指代实体的指针,
    所以程序1中的第5行数组名直接赋值给指针,程序2第7行直接将数组名作为指针形参都可成立。

    下面的程序成立吗?

    int intArray[10]; 
    intArray++;

    读者可以编译之,发现编译出错。
    原因在于,虽然数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。

    而指针,不管是指向结构体、数组还是基本数据类型的指针,都不包含原始数据结构的内涵,
    在WIN32平台下,sizeof操作的结果都是4。

    3)数据名可能失去其数据结构内涵

    到这里似乎数组名魔幻问题已经宣告圆满解决,但是平静的湖面上却再次掀起波浪。
    请看下面一段程序:

    #include <iostream> 
    void arrayTest(char str[]) 
    { 
        std::cout << sizeof(str) << std::endl; 
    } 
    int main() 
    { 
        char str1[10] = "I Love U"; 
        arrayTest(str1); 
        return 0; 
    } 

    输出结果

    4

    不可能吧?
    一个可怕的数字,前面已经提到其为指针的长度!
    结论1指出,数据名内涵为数组这种数据结构,在arrayTest函数体内,str是数组名,那为什么sizeof的结果却是指针的长度?
    这是因为:
    数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;
    很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

    所以,数据名作为函数形参时,其全面沦落为一个普通指针!
    它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。

    以上就是结论4。

    转自:http://developer.51cto.com/art/201107/277404.htm

  • 相关阅读:
    pipelinewise 学习二 创建一个简单的pipeline
    pipelinewise 学习一 docker方式安装
    Supercharging your ETL with Airflow and Singer
    ubuntu中使用 alien安装rpm包
    PipelineWise illustrates the power of Singer
    pipelinewise 基于singer 指南的的数据pipeline 工具
    关于singer elt 的几篇很不错的文章
    npkill 一个方便的npm 包清理工具
    kuma docker-compose 环境试用
    kuma 学习四 策略
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/5577705.html
Copyright © 2011-2022 走看看