一、指针
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
", *(a + 1));//2
printf( "%d
",*(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]