知识点1:
在打印局部变量和全局变量的地址的时候,会发现每次运行的时候,全局变量的地址是固定的,局部变量的地址是不固定的,这是因为局部变量是动态存储。如下代码
int k =1;
int main()
{
int i=1;
printf("%p\n", &k);
printf("%p\n", &i);
return 0;
}
知识点2:
变量在内存中存放是有地址的,数组在内存中存放也同样具有地址。对于数组来说数组名就是数组在内存中存放的数组首元素地址。
指针变量用于存放变量的地址,可以指向变量,当然也可以存放数组的首地址或数组元素的地址。这就是说指针变量可以指向数组或数组元素。
什么是数组:数组类似于数学中的集合,只不过数组里面装的是同类型的数据元素,而且数据元素之间的物理内存是连续的,而且一般也是有内存限制的,可以有重复的数据元素,是因为内存单元之间是独立的。
知识点3:
从内存的角度讲,数组就是依次分配多个变量,而且这么多个变量在内存中的存储单元是依次相连接的;我们分开定义多个变量(如:int a,b,c,d;)和一次定义一个数组(int a[4];)这两种定义方法相同点是都定义了4个int型变量,而且这4个变量都是独立的单个使用的;不同点是单独定义是a,b,c,d在内存中的地址不一定相连,但是定义成数组后,数组中的4个元素地址肯定是依次相连的。数组中多个变量虽然必须单独访问,但是因为他们地址彼此相连,因此很适合用指针来操作,因此数组和指针天生就纠结在一起,这里以int a[4]为例,它里面有四个元素,也就有四个内存单元。
知识点4:
从编译器角度来讲,数组变量也是变量,和普通变量和指针变量并没有本质不同。变量的本质就是一个地址,这个地址在编译器中决定具体位置数值,具体数值和变量名绑定,变量类型决定这个地址的延续长度