在C语言中,指针与数组经常放在一起使用,很多情况下数组和指针可以互相转换。
//伪代码 int arr[10] = {0,1,2,3,4,5,6,7,8,9};int * p = arr;arr[i] == * (p+i);//i是大于0小于数组长度-1的任何正整数*(arr+1) == arr[i];
数组和指针的不同:
(1)大小不同。
(2)指针可以++,数组名不可以
(3)访问方式不同
数组名在代码中的使用
(1)在定义数组的同一个函数中,sizeof(数组名)表示整个数组的大小
(2)在定义数组的同一个函数中,&数组名+1,表示加上整个数组的大小
(3)其他情况:数组名表示首元素的地址
#include<stdio.h>int main()
{int arr[5] = {1,2,3,4,5};int *p1 = (int *)(&arr+1);printf("%d\n",p1[-2]); int *p2 = (int *)((int *)&arr+1); printf("%x\n",*p2); int *p3 = (int *)((int)&arr+1);printf("%x\n",*p3);return 0;
}
在本例中,(&arr+1)指向的地址是数组末尾的地址,假设p1的地址是1000,数组大小为20个字节,所以指向的地址为1020。前面加上(int *)是访问地址(1020)的内存空间,打印的p1[-2] ,是将p1指向的地址减去两个int类型的位置,也就是1012(1020-4*2)的位置,再对这个地址进行解引用,打印的是4。
*p2首先是将首地址强转成(int*)的指针类型,然后指针加一,对应的地址是1004(1000+4),这里的4指的是指针的大小,而不是int类型的大小。最后强转成(int*)类型。
*p3是首地址1000强转成int类型,加上一为1001(1000+1),再强转成(int*)类型。指针所占空间为4个字节,所以打印的地址为1001-1005之间的内存空间。按猜想应该打印出来的数字为2,但是在PC机上,使用的是大端储存数据,也就是高地址存储大数据,小地址存储小数据。所以这四个小内存块的顺序是反过来的,打印的值是2000000.。