#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;
}
上图,有图有真相!
![](https://i-blog.csdnimg.cn/blog_migrate/13722b08f21b6a8391d2116fe9c24d65.jpeg)
图1(最终输出结果)
![](https://i-blog.csdnimg.cn/blog_migrate/c6efaec202fff15995fce0dbb47681ba.jpeg)
图2(a与&a的区别)
![](https://i-blog.csdnimg.cn/blog_migrate/0a197e616499014a3298b9558da8a3d1.jpeg)
图3 ((i=a+1)、(q=&a+1)之前)
![](https://i-blog.csdnimg.cn/blog_migrate/c596354edfff5c24daa7fe71197831fc.jpeg)
图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