之前写了一篇关于数组与指针的博客https://mp.csdn.net/postedit/80377352
最近有了新理解:
先看一组代码:
//test.c
//首先定义一个数组
char arr[] = "abcdef";
//main.c
extern char *arr;
int main()
{
printf("%p\n", arr);
system("pause");
return 0;
}
我们发现得到如下的结果:
观察发现:arr的值用%p输出为64636261,刚好为dcba的AII码值,那么怎么理解呢?
我们发现使用一级指针来接受&arr,只是表示一个普通的一级指针,它并没有接收到&arr赋来的跨度,而只接收到了地址而已。所以,指针arr的跨度只有4个字节,即“abcd”。它保存的地址所表示的是arr这个数组的首元素地址相当于在赋值过程中,&arr退化为了arr,失去了数组本来拥有的跨度。此时arr[i],就是在对数组中的每一个数组元素做遍历了。而输出arr相当于arr的指向“abcd”转换成AII码%p输出,且编译器为小端,所以为64636261。如果我们要输出“abcdef”应该怎么做呢?
extern char *arr;
int main()
{
printf("%s\n", (char *)&arr);//将arr换成(char* )&arr
system("pause");
return 0;
}
即&arr☞“abcd”,然后强转成(char*),就表示“abcdef”!
再看一个栗子:
//test.c
char *p = "abcdef";
//main.c
extern char p[];
int main()
{
printf("%p\n", p);
printf("%p\n", &p);
system("pause");
return 0;
}
输出结果为:
我们发现p是“abcdef”的地址,要输出“abcdef”即:
extern char p[];
int main()
{
printf("%s\n", *(char**)p);
printf("%p\n", &p);
system("pause");
return 0;
}
所以指针不是数组,数组不是指针。