关于C中指针的两种形式的探索与求证:

C自学之路2——关于C中指针的两种形式的探索与求证:

最近在练习C题的时候,发现以前没搞明白的一个漏洞,那就是:
int *a[3] 和 int (*a)[3] 的区别和联系到底在哪儿?指针数组?数组指针?
于是做了以下的实操探讨:

一、程序探索:

#include <stdio.h>
int main(void)
{
	int a = 3, b = 4, c = 5, d[4], * e[4], (*f)[4] = &d;
	d[1] = a;
	d[2] = b;
	d[3] = c;
	d[0] = 1;

	//----------输出语句及分割线----------
	for (int i = 0; i < 4; i++)
		printf("d[%d] = %d. \n", i, d[i]);
	puts("");
	//----------输出语句及分割线----------

	e[1] = &a;
	e[2] = &b;
	e[3] = &c;
	e[0] = &d[0];

	//----------输出语句及分割线----------
	for (int i = 0; i < 4; i++)
		printf("e[%d] = %p. \n", i, e[i]);
	puts("");
	//----------输出语句及分割线----------

	for (int i = 0; i < 4; i++)
		d[i] = i;

	for (int i = 0; i < 4; i++)
	{
		f = &d;
		b = (*f)[i];
		printf("b = %d \n", b);
	}
	puts("");
	//----------输出语句及分割线----------

	return 0;
}

其结果输出为:
最终结果图

实际上前几次跳过了1次失败,因为当时单看型式只能大概知道 int (*a )[3] 是个指针;而通过实际的编程练习,彻底明白了这两者的差别,因此,总结如下:

  1. 对 int * a[3] 的分析:
    (1) 从优先级来看, [ ] 的优先级是比 * 运算符高的;因此 a 首先与 [ ] 生成数组;进而再与*运算符生成一个数组;
    (2)既然首先是一个数组,那么肯定就是有空间的了,而这部分空间被定义为指针类型,因此这就是一个能存放3个指针的数组;

  2. 对 int ( * a) [ 3 ] 的分析:
    (1)从优先级来看,()的优先级是大于 [ ] 运算符的,因此 a 首先与*生成一个指针,紧接着后边的 [ ] 表明该指针指向的是一个有3个 int 类型参数的数组;
    (2)在运算结果之前,我首先用 for 把数组d中的值全部重新赋了一遍,以便于观察结果;
    (3)最后发现之前出错的最重要的一点!!!我没搞清楚怎么在表达式中表达它的值!就如同声明中一样,(*a ) [ 3 ]首先是一个指针,其次才是一个数组,因此在 for之前,也应该先用*解引用才行;最后得到了最终的结果。

这里提一嘴我犯的傻:我在程序BUG的代码里,是这样 printf 的:

for (i = 0; i < 4; i++)
	printf("f[%d] = %d", i, f[i]);
	/* 心态都裂开好不好 */

写的什么玩意儿真的是…

我甚至一度还在想:

① f [ i ] 应该是个指针吧,于是把 = 后边的 %d 改成了 %p ;

② 程序报错 int 不对等 int*,难不成我还要解引用?于是又把 f [ i ] 改成了 *f [ i ];

③还是不对,于是我又进行了一次“伟大”的尝试:解引用不对,那我就取址!把 f [ i ] 又改成了 & f [ i ] ;

④还是不对,我又再想,难不成是不该带参数?数组名就是一个指向首元素的指针呀!我于是又将 & f [ i ] 改成了 f ,单走一个 f 好不好嗯?

……
我甚至还尝试过 & f ; * f ……当我尝试完所有我觉得可能的组合后,才发现估计错没在这儿,又回头去看了一遍声明: int (*a) [ 3 ] ;然后发觉好像之前的思路都错了;又进行了一番思考和改动,于是有了今天这篇文章。
心态裂开.jpg
终于,我又复活了!!!!于是我整理了下今天的骚操作,弄了个图方便大家理解:
图上打错了,是数组指针和指针数组,不过我懒得改图了,大家将就看吧~

数组指针和指针数组
如果有大佬发现了错误的地方还请及时指正呀~~~学习路上,有你有我,不畏艰劳,不惧辛苦;加油!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值