c语言核心整理之指针与数组的区别

本文主要是自己整理的对指针与数组从多个方面进行区别的内容,方便自己对数组与指针进行区别。


数组与指针
1,指针:保存数据的地址,任何存入指针变量p的数据都会被当作地址来处理。p本身的地址由编译器另外存储,存储的位置,并不知道。
数组:保存数据,数组名a代表的是数组首元素的首地址而不是数组的首地址。&a才是整个数组的首地址。a本身的地址由编译器另外存储,存储的位置,并不知道。
2,指针:间接访问数据,首先取得指针变量p的内容,把它作为地址,然后从这个地址提取数据或向这个地址写入数据。指针可以以指针的形式访问*(p+i);也可以以下标的形式访问p[i]。但其本质上都是先取p的内容然后加上i*sizeof(类型)个byte作为数据的真正地址。
数组:直接访问数据,数组名a是整个数组的名字,数组内每个元素并没有名字,只能通过”具名+匿名”的方式来访问其某个元素,不能把数组当一个整体来进行读写操作。数组可以以指针的形式访问*(a+i);也可以以下标的形式访问a[i]。但其本质都是a所代表的数组首元素的首地址加上i*sizeof(类型)个byte作为数据的真正地址。
3,指针:通常用于动态数据结构
数组:通常用于存储固定数目且数据类型相同的元素。
4,指针:相关的函数为malloc和free
数组:隐式分配和删除
5,指针:通常指向匿名数据(当然也可指向具名数据)
数组:自身即为数组名
Tips:
1)数组具有确定数量的元素,而指针只是一个标量值。编译器用数组名来记住这些属性。只有当数组名在表达式中使用时,编译器才会为他产生一个指针常量。
2)声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值是一个常量,指向这段空间的起始位置;
声明一个指针变量时,编译器只为指针本身保留内存空间,它并不为任何任何整型值分配内存空间,而且,指针变量并未被初始化为指向任何现有的内存空间,如果它是一个自动变量,它甚至根本不会被初始化。

你可能感兴趣的:(c语言核心)