指针与数组

一、指针
    1、 指针==地址;指针有两个值:自身值 与 指向的值
    2、指针的四个方面:     1)  指针的类型
                                        2)  指针指向的类型
                                        3)  指针的值或指针所指向的内存区
                                        4)  指针本身占据的内存区
    3、函数指针不能自加/减,本身的数组名指针也不能自加/减
二、数组
  数组是把同一类型数据有序进行排列,进行统一存储,是相同类型数据的集合。
  1、特点:他们拥有同一个名称;
  2、应用:在大数量处理和字符串操作时,广泛使用数组。
 三、 指针和数组的特性:
 
指针
数组 
保存数据的地址,任何存入指针变量 p 的数
据都会被当作地址来处理。 p 本身的地址由
编译器另外存储,存储在哪里,我们并不知道。
保存数据,数组名 a 代表的是数组首元素的
首地址而不是数组的首地址。 &a 才是整个数
组的首地址。 a 本身的地址由编译器另外存储,存储在哪里,我们并不知道。
间接访问数据,首先取得指针变量 p 的内容,
把它作为地址,然后从这个地址提取数据或
向这个地址写入数据。指针可以以指针的形
式访问*(p+i);也可以以下标的形式访问 p[i]。
但其本质都是先取 p 的内容然后加上
i*sizeof(类型)个 byte 作为数据的真正地址。

直接访问数据,数组名 a 是整个数组的名字,
数组内每个元素并没有名字。只能通过“具
名+匿名”的方式来访问其某个元素,不能把
数组当一个整体来进行读写操作。数组可以
以指针的形式访问*(a+i); 也可以以下标的形
式访问 a[i]。但其本质都是 a 所代表的数组首
元素的首地址加上 i*sizeof(类型)个 byte 作为
数据的真正地址
通常用于动态数据结构

通常用于存储固定数目且数据类型相同的元
素。
相关的函数为 malloc 和 free。  隐式分配和删除
通常指向匿名数据(当然也可指向具名数据) 自身即为数组名

         

eg:
void main()
{
          int a[5] = { 1, 2, 3, 4, 5 };
          int *ptr = (int *)(&a + 1);//增加了一个数组的长度,即相当于加到了5后边的位置
         printf( "%d\n", *(a + 1));//2
         printf( "%d\n",*(ptr - 1));//5
}
解析:
  1)对指针进行加 1 操作,得到的是下一个元素的地址,而不是原有地址值直接加 1。所以,
一个类型为 T 的指针的移动,以 sizeof(T) 为移动单位。 因此,对上题来说, a 是一个一
维数组,数组中有 5 个元素; ptr 是一个 int 型的指针。
      2)&a + 1: 取数组 a 的首地址,该地址的值加上 sizeof(a) 的值,即 &a + 5*sizeof(int),也
就是下一个数组的首地址,显然当前指针已经越过了数组的界限。
      3)(int *)(&a+1): 则是把上一步计算出来的地址,强制转换为 int * 类型,赋值给 ptr。
      4)*(a+1):在数值上 a,&a 的值是一样的,但意思不一样, a 是数组首元素的首地址,也就是 a[0]的
首地址, &a 是数组的首地址, a+1 是数组下一元素的首地址,即 a[1]的首地址,&a+1 是下一
个数组的首地址。
  5)*(ptr-1): 因为 ptr 是指向 a[5],并且 ptr 是 int * 类型,所以 *(ptr-1) 是指向 a[4] 
posted @ 2016-04-13 16:41  Sophie_h  阅读(192)  评论(0编辑  收藏  举报