早教吧作业答案频道 -->其他-->
纠结的数组名之问题。我的关于数组名的总结如下: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],让人感觉是数组而已。
在程序里你不可能申请空间给一个不存在于存储中的“指针”。
看了纠结的数组名之问题。我的关于数...的网友还看了以下:
十三个编字组成口字的四分之三打一成语 2020-04-08 …
1、福兴织布厂某车间原来有甲乙两个工作组,现在需要调整为甲乙丙三个工作组,将原甲组的1/4与原乙组 2020-04-09 …
一个编织组,原来30人10天生产1500顶草帽.现在增加到120人,按照原来的功效,要生产9000 2020-06-22 …
今天乎交贝乞木禾矢个加上同一个编旁组成字 2020-07-02 …
用比例解一个编制组,原来30人10天生产1500只花蓝.现在增加到80人,按原来的工效,生产600 2020-07-26 …
一条求概率的题目有一袋子内装编号为一至五号的五个球,从袋内有放回地任取三个球,则三个球编号组成奇数 2020-07-30 …
一个编制组,原来30人10天生产6000只花篮.现在增加到80人,生产24000只花篮需要多少天?( 2020-12-08 …
①一个编织组,原来30人10天生产花篮1500只.现在增加到80人,按原来的工作效率,生产6000只 2020-12-08 …
1.一种青铜,内含铜88份,锡10份,锌2份.要炼制青铜600吨,需要铜、锡、锌各多少吨?2.100 2020-12-08 …
一个编织组,原来30人10天生产1500只花篮.现在增加到80人,按原来的工效,生产6000只花篮需 2021-01-18 …