数组名 数组名是地址吗
各位老铁们好,相信很多人对数组名都不是特别的了解,因此呢,今天就来为大家分享下关于数组名以及数组名是地址吗的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
C语言数组名
1*p=a;//表示将a的值赋给p所指单元。
p=&a;//表示将p指向a单元,即将a单元的地址赋给p。
所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。[1]在高级语言中,指针有效地取代了在低级语言,如汇编语言与机器码,直接使用通用暂存器的地方,但它可能只适用于合法地址之中。指针参考了存储器中某个地址,通过被称为反参考指针的动作,可以取出在那个地址中存储的值。作个比喻,假设将电脑存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针;根据便利粘贴面的页码与行号,翻到那个页面,把那个页面的那一行文字读出来,就相当于是对这个指针进行反参考的动作。
指针数组的数组名表示什么
指针数组的数组名就是该指针数组首元素的地址的别名。
比如,一个人可以叫王小二,也有叫它小二,或者小王,其实都是指同一个人。
指针数组就比如这个例子:int
*p[10]
那么p等价于&p[0]
因为指针里面存储的是地址(十六进制数),所以&p[0]这里面存放着一个int变量的地址。
是不是觉得用地址来存放地址有点想不通,下面举一个简单的例子:
比如
int
*p[10];
可以把&p[0]看成一张记录着地址的纸,那么根据这张纸的地址找到某个仓库,在仓库里面又放着记录着一个int变量地址的纸,又根据这个地址找到了存放int变量的仓库,在这个仓库里面放着int的值,其实就想寻宝一样,根据一关一关的线索找到指定的宝藏。
关于数组名纠结之问题。
1.对于第一点,当前你可以这么理解。人认知的过程是逐渐进步的,如果你学习了编译原理、操作系统两门课,认识会更加深刻:尽管你在应用程序中使用的内存地址是连续的,但这些数据在物理内存(电脑真正的内存)并不一定是连续的,因为应用程序访问内存的地址必须经过操作系统进行虚拟内存地址转换,翻译成真正的物理内存地址。但是站在应用程序开发者的角度来看,不需要关心虚拟内存地址或者物理内存地址,完全可以这么认为,因为你开发应用程序时涉及到的全是虚拟内存地址;
2.一个程序编译完成后,数组名对应于一个确定的(已知的)虚拟内存地址,所以通过常数下标对数组中单元的访问也是在访问虚拟内存地址已知的存储单元。因此编译器会把a,a[1]这样的替换成对相应虚拟地址内存的访问。这也是数组名不占据内存的原因。
你如下定义数组:int a[2][3];
int*p=a;
在这里,首先明确两个概念:指针常量和普通指针。p显然是个普通指针,定义之后初始化为指向二维数组a的第一个单元。在此你可以p++操作,使得p在进行该操作指向a的第二个单元。因此p指针中存放的地址是可以变化的。至于a,a[1]这些都是指针常量。但是a[n]不是指针常量,如果n是整数型变量而不是常量的话。因为编译器既然知道a虚拟内存地址,那么它当然也知道a[1]这个指针常量中的地址。所以,编译器会把代码中的这些指针常量换成虚拟内存地址。但是编译器无需再为指针常量分配内存来保存它。对于p就不同了:因为我们可能对它进行加减操作,使它重新指向其他虚拟内存地址,所以编译器会分配内存给它,来保存它所指向的虚拟内存地址。
一个二维数组,拿前面的例子来说(a[2][3]),a[1]所代表的是第一行(从0开始计数)的首地址。也就是说,它是个指针常量。它保存的地址就是元素a[1][0]的地址。
对于a[1][0]元素的访问,*(a+3)、*(a[1])和a[1][0]效果等同。
不知道有没有回答你的问题?
好了,关于数组名和数组名是地址吗的问题到这里结束啦,希望可以解决您的问题哈!