【Day 27】指标的范例讲解

今天,我们就来看一个指标的范例,测试一下对於指标的概念,是不是真的熟悉~

看一下下面的程序码:

#include<stdio.h>
int main(){
	int data[] = {10, 21, 35, 47, 51};
	int *p[] = {data, data+1, data+2, data+3, data+4};
	int **p_p = p;
	printf("*p[1] = %d\n\n", *p[1]);
	printf("**p_p = %d\n\n", **p_p);
	printf("*(*p_p+1) = %d\n\n", *(*p_p+1));
	printf("*(*(p_p+1)+2) = %d\n\n", *(*(p_p+1)+2));
	return 0;
	
} 

不知道大家会不会跟我一样,看到两颗星星 ** 就开始害怕,想说这到底是甚麽东西?
但请仔细思考、并复习一下前三天讲的,就会发现没有那麽难的!

有答案了吗?让我们先看看输出结果!

我们把图画出来,再解释:

为了方便说明,以下粗体字代表的是位址,且我们用上面那张图结合程序来说明:

  • 我们先宣告一个阵列 data[],并在里面放五笔资料。再宣告指标阵列 p[],这个指标阵列里面的资料放的是 data[] 五笔资料的位址。
  • 另外再宣告一个指向指标的指标 p_p ,里面放的是指标 p 的位址(p)。
  • 先输出 *p[1]p[1]里面放的位址是 data+1 ,我们对 data+1 取值,所以输出 21。
  • 输出 **p_p ,也就是在 p 位址放的位址(data)的值,所以输出 10。
  • 再输出 *(*p_p+1) ,因为*p_pp 位址放的位址(data),然後 data+1 取值,所以印出 21。
  • 最後输出 *(*(p_p+1)+2)*(p_p+1)等於 p+1 位址放的位址(data+1),然後我们把他加 2 後再取值,所以输出是 47。

不知道大家的脑袋有没有觉得绕来绕去的感觉~如果以上内容都非常清楚的话,那恭喜你!基本的指标概念应该已经都学起来了!但是,指标的内容蛮容易忘记的,所以记得要常常复习喔~

明天,让我们来讲讲新的东西 - 函式!


<<:  SQL与NoSQL的连结(二)

>>:  Day27 - 在 Next.js 如何正确地使用 dynamic import

Day24 X Web Rendering Architectures

今天开始正式进入系列文的最後一个章节 - Framework, Architecture and ...

Day17 Review周期(Issue Board)

专案运行过程,如何将进行方向维持着,不会像YAMAHA一样乱点技能树呢? 这就需要「时时勤拂拭,莫使...

Day 20 Ruby 封装 vs 继承

封装 先请 wiki 大大出来讲个话: 在物件导向程序设计方法中,封装(英语:Encapsulati...

第 58 天 - 理解 hardlink 跟 softlink

今天进度 : unix - What is the difference between a sym...

Day 02-资源管理大师IAM

AWS Certified Solution Architect Associate之旅的第一站,我...