zoukankan      html  css  js  c++  java
  • 浅谈C中的指针和数组(七)

     现在到揭露数组名本质的时候了,先给出三个结论:

    (1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;

    (2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量

    (3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!

     数组名可能失去其数据结构内涵。

    (1)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;

    (2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

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

    如下定义就得到一个数组的引用
            类型名 (&变量明)[N];

    在进行参数的传递时,数组引用可以帮助我们防止数组退化为指针,而这是我们在编程中很难注意到的问题。

    #include <stdio.h>
    #include <stdlib.h>
    
    void func1(int (&b)[10])
    {
        printf("%d
    ", sizeof(b));
    }
    
    void func2(int b[])
    {
        printf("%d
    ", sizeof(b));
    }
    
    int main()
    {
        int str[10];
        func1(str);
        func2(str);
        system("pause");
        return 0;
    }
    提示:
    这里的函数参数中的N是不能省略的,因为它保留了原来数组的所有原生态,所以N不能少,这就是数组引用。

    当然,如果不去理会sizeof()的话,这两个函数的输出不会有任何的不同,他们都能够正确的输出array[]中的10个值,但当我们观察一下sizeof()的值就会发现很大的不同。

    上面程序执行结果:

    从这我们就能看出,当array[]作为参数传递过去后,如果接收的参数是也是一个数组,那么它就会退化为一个指针,也就是我们常说的“数组就是一个指针”。当接收的参数是一个数组引用是,就会发现它还是保持了自己的原生态,即“数组仍然是一个数组”。这时,数组引用就起到了一个保护自己退化为一个指针的作用。

     同样的,二维数组也可以用数组引用来保护数组名退化为指针,维持其原生态:

    #include <stdio.h>
    #include <stdlib.h>
    
    void func(int (&a)[2][3])
    {
    
        printf("%d
    ", sizeof(a));
        printf("%d
    ", sizeof(a[0]));
        printf("%d
    ", a[1][2]);
    }
    int main()
    {
        int a[2][3] = {{1,2,3},{4,5,6}};
        
        printf("%d
    ", sizeof(a));
        printf("%d
    ", sizeof(a[0]));
        printf("%d
    ", sizeof(a)/sizeof(a[0]));
    
        func(a);
    
        system("pause");
    
        return 0;
    }

    程序执行结果:

  • 相关阅读:
    直播流RTMP 知识
    XSSearch 说明文档保存
    网海茫茫,有你最暖
    实践中 XunSearch(讯搜)更新索引方案对比
    实践中 XunSearch(讯搜)的使用教程步骤
    留的住的叫幸福,流逝的叫遗憾
    百度API ; 很多有用的接口及公用 数据
    ecshop 模板开发总结
    jquery库和cityselect插 件的省市 级联
    PHP Excel 下载数据,并分页下载
  • 原文地址:https://www.cnblogs.com/stemon/p/4150578.html
Copyright © 2011-2022 走看看