早教吧 育儿知识 作业答案 考试题库 百科 知识分享

纠结的数组名之问题。我的关于数组名的总结如下:1.“整个数组就是内存空间里连续的一段数据,如何找到这个数据段呢?通过编译器在分配这个数据段时生成的一个指向该数据段的标签

题目详情
纠结的数组名之问题。
我的关于数组名的总结如下:
1.“整个数组就是内存空间里连续的一段数据,如何找到这个数据段呢?通过编译器在分配这个数据段时生成的一个指向该数据段的标签(指针常量)来访问它。”
2.在int a[2][3]中 数组名a和a[0],a[1],a[2]“都”“不是”指针,在“存储单元中‘不存在’”。但在编译器的使用时“存在”但“不占用存储空间”,就是说,“‘编译器’是‘编译器’。‘存储单元’是‘存储单元’,作用的对象不同。对于“编译器来说a和a[0],a[1],a[2]存在。但对于‘存储单元’来说,‘不存在’”。数组名a和a[0],a[1],a[2]只是供给“编译器使用而产生的标签”。它“不占用”存储单元,只是在“编译器”中,叫a就是叫a[0]。叫a[1]就是叫a[1][0]。叫a[2]就是叫[2][0]。
a和a[0],a[1],a[2]的作用如同“指针”,所以可以把它“看作‘指针常量’”。但“看作”并不代表“是”。它们仅供“编译器”使用,而不占用存储单元。
就犹如{a[0]}a[0][0],a[0][1],a[0][2],a[0][3],{a[1]}a[1][0],a[1][1],a[1][2],a[1][3],a{2}a[2][0],a[2][1],a[2][2],a[2][3]中{}中的{a[0]}{a[1]}{a[2]}在存储单元中“不存在”,但作为标签使用,其内部分别含有a[0][0],a[1][0],a[2][0]的地址,在编译器访问数组的时候,它们会把它们内的地址赋予在占用存储单元且有自己地址的指针变量,但它们自己在内存中是不存在的。
就犹如,若有3个文件夹,分别叫“大”“内存”“标签”。“大”就如同整个程序,包括编译器使用的标签,里面装着“内存”和“标签”两个文件夹。若“内存”中 .装有a[0][0],a[0][1],a[0][2],a[0][3],a[1][0],a[1][1],a[1][2],a[1][3],a[2][0],a[2][1],a[2][2],a[2][3] 的文件,则“标签”中装有{a[0]}{a[1]}{a[2]}的文件。在使用“内存”中的文件的文件的时候,需要使用“标签”中的文件。但“不能说成”“标签”中的文件就是‘存在于’“内存”中的文件。只是,“使用‘内存’中的文件的时候,就要使用‘标签’中的文件,二者缺一不可,但面向的使用对象和存放位置不同。”
3.“编译器在编译的时候只对数组生成一个标签,在编译过程中使用标
签+偏移量来访问数组。对于访问数组的指针就把标签内的地址赋值给该指针。”
就是说,标签不属于程序本身,“所以数组名不占用存储空间”是编译器用的。“数组名”是“编译器在编译的时候”使用的标签,是“供给‘编译器’”使用,而不占用存储空间。“但”其内部有a[0]的地址。在访问数组的时候,就把“编译器使用的‘数组名’的地址赋给需要访问数组的占用内存的指针”。作用类同于一个指针。但其实它“不是指针”。
以上我这样理解是否对呢?
▼优质解答
答案和解析
差不多吧,有些概念越是深入去研究越会发现有些东西难以明确表述,毕竟是使用者,不是研究者。
void main()
{
int a[3]={0,1,2};
printf("%d\n",&a);
printf("%d\n",&a[0]); //两个结果一样,说明什么?说明数组名字没有自己的存储位置,只有一个“保管着”的地址值,这个值就是&a[0].
}
没有自己的存储位置,那么肯定不是一个常规意义上的指针,所以说它在编译器工作的时候被转换成一个标签,仅仅在编译过程中保留了&a[0]的值,编译结束了就没用了。编译结束前从程序的制作者角度看的话,它就是一个指针常量,只不过对这个指针常量进行的取其自身地址的操作得到的是它所指向的地址(原因就是它实际没有在存储中出现,就像你比方的文件夹。它本身不是用户文件的一部分,但构成了用户文件)。
你说的动态数组问题不想过于深入讨论。
比如:
int main(void)
{
int n1,i;
//int arrd[];  //这样的声明是不合法的,如果不指定数组长度的话,则必须通过初始化来确定。
int *array;//这里声明了一个指针,实际存在于存储中,后面作为动态数组名字访问数组用。和静态数组不同,但其实它不是一个真正的数组名字,它只是一个指针名字,如果我没表述错误的话,它不应该叫做“数组名”
puts("输入一维长度:");
scanf("%d",&n1);
array=(int*)malloc(n1*sizeof(int));//动态生成“数组”   
for(i=0;i {
array[i]=i+1;//数组方式访问“动态数组”
printf("%d\t",array[i]);
}
printf("\n%p , %p",&array,&array[0]); //数组名和数组第一元素地址不同
free(array);//释放   
return 0;
}
上面的动态“数组”和我们之前说的“静态”数组没有矛盾吧,动态数组其本质并不是前面讨论的数组,虽然非常非常像,都是通过一个“指针”去找存储空间的一段数据段。但“动态数组”的指针是有存储的,只不过使用了下标运算[x],让人感觉是数组而已。
在程序里你不可能申请空间给一个不存在于存储中的“指针”。
看了纠结的数组名之问题。我的关于数...的网友还看了以下:

关于Access数据库字段的问题1.以下有关字段名的说法正确的是()A.在数据库的二维表中,字段名  2020-05-17 …

关于圆周率π,数学发展史上出现过许多很有创意的求法,如著名的普丰实验和查理斯实验,受其启发,我们也  2020-06-14 …

求关于岳阳的英文介绍比如著名的旅游景点的英文介绍,最好是当地的导游词,如关于洞庭湖和岳阳楼的只要回  2020-06-18 …

《哈姆莱特》一剧的语言十分精彩,如著名的“生存还是毁灭”一段,历来脍炙人口。在墓地里哈姆莱特和掘墓  2020-06-25 …

关于圆周率π,数学发展史上出现过许多很有创意的求法,如著名的蒲丰实验和查理斯实验.受其启发,我们也  2020-07-08 …

关于圆周率π,数学发展史上出现过许多很有创意的求法,如著名的浦丰实验和查理斯实验.受其启发,我们也  2020-07-31 …

请问语文五年级上册(苏教版)23课的预习笔记(如段落的意思,全文的意思,分段的意思)林冲棒打洪教头有  2020-11-01 …

《哈姆莱特》一剧的语言十分精彩,如著名的“生存还是毁灭”一段,历来脍炙人口。在墓地里哈姆莱特和掘墓人  2020-11-10 …

《哈姆莱特》一剧的语言十分精彩,如著名的“生存还是毁灭”一段,历来脍炙人口。在墓地里哈姆莱特和掘墓人  2020-11-21 …

1.描写边疆的诗.(题目\内容\作者)2.我们浏览了许多世界名胜.有坦桑尼亚国家公元.3.读书的名言  2021-01-30 …