早教吧作业答案频道 -->其他-->
纠结的数组名之问题。我的关于数组名的总结如下: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]的地址。在访问数组的时候,就把“编译器使用的‘数组名’的地址赋给需要访问数组的占用内存的指针”。作用类同于一个指针。但其实它“不是指针”。
以上我这样理解是否对呢?
我的关于数组名的总结如下:
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],让人感觉是数组而已。
在程序里你不可能申请空间给一个不存在于存储中的“指针”。
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],让人感觉是数组而已。
在程序里你不可能申请空间给一个不存在于存储中的“指针”。
看了纠结的数组名之问题。我的关于数...的网友还看了以下:
如图为肺的内部结构示意图,请据图分析回答:(1)写出下列各部分结构的名称;[2],[3],[4], 2020-04-07 …
数据结构中有静态结构和动态结构吗?在数据结构中,从逻辑上可以把数据结构分成C.A.动态结构和静态结 2020-05-13 …
并行数据库的体系结构包括共享内存结构、共享磁盘结构和A.无共享磁盘结构B.无共享资源结构C.数据 2020-05-24 …
数据结构包括的三方面内容是:数据的存储结构、数据的运算和A.数据B.数据物理结构C.数据逻辑结构D. 2020-05-24 …
数据库应用系统内部结构一般分为静态结构与报考结构。下列关于UML中系统内部结构的说法,错误的是( ) 2020-05-24 …
关于商场的DBAS,设有如下数据内容:Ⅰ.数据库结构说明Ⅱ.顾客名单Ⅲ.数据清洗规则Ⅳ.订单细节数据 2020-05-24 …
如图是肾脏内部结构示意图,请据图回答以下问题:(1)指出甲图字母所代表的结构的名称:A、B、(2) 2020-07-01 …
观察分析下列数据:0,负根号3,根号6,–3,2倍根号3,负根号15,3倍根号2,...,根据数据排 2020-11-17 …
根据桃花的结构示意图回答下列问题.(1)能保护花的内部结构的是[]和[].(2)能产生花粉的结构是[ 2020-12-02 …
数据结构.一、单项选择题.1、在数据结构中,从逻辑上可以把数据结构分成(C)A:动态结构和静态结构B 2020-12-07 …