博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈C中的指针和数组(七)
阅读量:5887 次
发布时间:2019-06-19

本文共 1424 字,大约阅读时间需要 4 分钟。

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

(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;
(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量
(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!

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

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

(2)很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
所以,数据名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有4个字节的平民。

如下定义就得到一个数组的引用

        类型名 (&变量明)[N];

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

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

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

上面程序执行结果:

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

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

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

程序执行结果:

 

转载于:https://www.cnblogs.com/stemon/p/4150578.html

你可能感兴趣的文章
ceph-deploy源码分析(一)——源码结构与cli <转>
查看>>
Swift 对象内存模型探究(一)
查看>>
Spring集成JPA后,报“Not an managed type: class x.x.x"
查看>>
sublime配置全攻略【转】
查看>>
我的友情链接
查看>>
Linux Shell从入门到删除根目录跑路指南
查看>>
深入了解MyBatis参数
查看>>
FreeBSD中安装源的方法
查看>>
浮动层代码
查看>>
1.安装zabbix server
查看>>
mongodb相关(单实例、复制集、分片集)
查看>>
快速排序的总结
查看>>
Linux系统详细启动流程
查看>>
论坛教程-去除版块导航
查看>>
linux下mysql的初始密码
查看>>
vim常用命令
查看>>
使用eclipse Maven插件创建一个web project
查看>>
我的友情链接
查看>>
成熟的标志
查看>>
慢慢的才知道
查看>>