#include "stdafx.h"
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
char a[12] = {'A','B','C','D','E','F','G','H','\0'};
char * p = a;
printf("The content of a    %s\n", a);
printf("The content of &a    %s\n", &a);
printf("The content of p    %s\n", p);
printf("**************************************************\n");
printf("The value of a     %x\n", a);
printf("The value of &a     %x\n", &a);
printf("The value of p     %x\n", p);
printf("**************************************************\n");
printf("%c\n", *(a));
printf("%c\n", a[1]);
printf("**************************************************\n");
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(*p));
printf("**************************************************\n");
char (*q)[12] = &a;
char (*i) = a;           //类型一致,OK。左边为“char *”,右边也为“char *”
//char (*q) = &a;       //error C2440: “初始化”: 无法从“char (*)[12]”转换为“char *”
//char (*q)[12] = a;   //error C2440: “初始化”: 无法从“char [12]”转换为“char (*)[12]
i = a + 1;
q = &a +1;
printf("%s\n", i);
printf("%s\n", q);
getch();
return 0;
}


上图,有图有真相!


图1(最终输出结果)

 

 

 

 

 

 

 

 


图2(a与&a的区别)


图3 ((i=a+1)、(q=&a+1)之前)



图4:((i=a+1)、(q=&a+1)之后))

 

总结
1.a、&a、p都指向数组首元素的首地址,这点可以从输出他们的值是一样的看出。

2.指针和数组的2种访问形式:以指针的形式访问和以下标的形式访问数组(以指针的形式访问和以下标的形式访问指针)。

3.数值名a有2层含义:a.作为数组名,代表数组,类型为char [12](图1);b.作为数组首元素的首地址(a+1,跨度为数组元素的类型的长度),类型为char *。(从图1和图2的对比可以看出)

4.&a的类型为char [12]*,代表整个数组(&a+1,跨度为整个数组的长度)。(从图1和图2的对比可以看出)

5.i和q的输出结果的说明:i在字符'H'后即是'\0',所以输出结束;q数组越界,所以乱码。

6.对"图1"的说明:sizeof(*p),p的声明是"char * p",p所指向的内容是一个字符(即p[0]),所以sizeof(*p)当然是1了。&a的类型为char[12]*,是一指针,长度当然为4。

 

原文地址:http://hi.baidu.com/ati_crossfire/blog/item/96451bdc89d316395882dd68.html