#include "stdafx.h"
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
char a[12] = {'A','B','C','D','E','F','G','H',''};
char * p = a;
printf("The content of a %sn", a);
printf("The content of &a %sn", &a);
printf("The content of p %sn", p);
printf("**************************************************n");
printf("The value of a %xn", a);
printf("The value of &a %xn", &a);
printf("The value of p %xn", p);
printf("**************************************************n");
printf("%cn", *(a));
printf("%cn", a[1]);
printf("**************************************************n");
printf("%dn", sizeof(a));
printf("%dn", sizeof(&a));
printf("%dn", sizeof(p));
printf("%dn", 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("%sn", i);
printf("%sn", 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'后即是'',所以输出结束;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
发表评论 取消回复