zxf@zxf-virtual-machine:test$ cat test.c
#include <stdio.h>
#include <stdlib.h>
typedef int ARRAY[5];
int main(void)
{
int a[5] = {1,2,3,4,5};
ARRAY* pa = NULL;
int *qa = a;
pa = &a;
printf("qa= %p \n",qa);
printf("a = %p \n",a);
printf("pa = %p \n",pa);
printf("qa +1 = %p \n",qa+1);
printf("a +1 = %p \n",a+1);
printf("pa +1 = %p \n",pa+1);
printf("(*)pa[3] = %d\n",(*pa)[3]);
return 0;
}
zxf@zxf-virtual-machine:test$
运行结果如下:
zxf@zxf-virtual-machine:test$ vim test.c
zxf@zxf-virtual-machine:test$ gcc -o test test.c
zxf@zxf-virtual-machine:test$ ./test
qa= 0xbf96b454
a = 0xbf96b454
pa = 0xbf96b454
qa +1 = 0xbf96b458
a +1 = 0xbf96b458
pa +1 = 0xbf96b468
(*)pa[3] = 4
解释:
区别两个指针是否一样,关关键在于
-
指针所指向的地址类型;
-
指针第偏移一个单位的内存长度;
上面的实例中:可以看出 pa +1所偏移的是数组int a[5]的大小为20个字节,一个int型4个字节5个刚好是20个字节,所以pa从0xbf96b454偏移到0xbf96b468(要注意的是这里是十六进制);qa和a都是指向数组a的首地址,pa和qa、a指针是完全不同的,上面说指针区别在于指针所指针向的地址类型,这里类型都是一样的,区别在于指针每偏移一个单位的内存长度,在用的时候要特别注意。