数组和指针深层理解

之前写了一篇关于数组与指针的博客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;
}

所以指针不是数组,数组不是指针

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值