【Day 24】指标介绍(上)

甚麽是指标(Pointer)?

指标可以拿来存取电脑的记忆体位址,所以,我们在使用指标变数之前,要先了解何谓记忆体位址。
我们可以把记忆体空间想像成一排大楼的信箱,每一个储存单位都拥有数字编号的位址,我们如果单纯设定变数,其实是把我们要的值放入记忆体空间里面,所以记忆体里面的值可以改变,但是记忆体位址是固定的。(可以想成一栋房子的地址是固定的,但里面住的人可以改变、可以搬家)

看个例子:
如果我们程序码写成 int X = 38;
假设这个变数会被配置於 0x7ffff34fff00 的位址
画成图来表示:

从上面的图很明显的可以知道,我们宣告了一个变数 X,其值为 38,然後我们配置了 4 bytes 的记忆体给他(通常宣告int需要 4 bytes)

如何取得变数记忆体位址?

我们可以使用 C 语言的 & 取址运算子来取得变数记忆体位址。
来看一下程序码:

#include<stdio.h>
int main(){
	int x = 38;
	printf("变数x的值 = %d\n", x);
	printf("变数x的位址 = %p\n", &x);
	return 0;
} 

输出结果如下:

我们透过程序输出可以看到,变数的值与位址的差别!

还记得在第七天 C 的输入输出函式有提到 scanf() 函式,其逗号後面我们要用 & 再加上变数名称吗?
其实是因为 scanf() 函式後面必须传入地址,所以才要加上 & 去取址,但如果是传入阵列的话,就不需要用 & (阵列其实是宣告第一个阵列位址)!
我们来看一个程序例子:

#include<stdio.h>
int main(){
	int arr[3] = {0};
	int i = 0;
	printf("请输入一个变数 >>");
	scanf("%d", arr+2);
	for(i=0; i<3; i++)
		printf("%d ", arr[i]);
	return 0;
}

输出结果:

程序码解释:

  • 先宣告一个长度是 3 的阵列,且里面的元素都初始值都是 0
  • 输入一个数字,这个数字会被放在阵列 index = 2 的地方(如果只写 arr,会被放入 arr 阵列的第一个位址,也就是 arr[0] )。
  • 输出阵列元素

可以看到,我们输入的变数真的被放入 arr[2] 里面了!

今天讲了指标最基本的一些小东西,但其实指标的概念还有好多好多,所以明天要继续介绍~


<<:  每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day24

>>:  【程序】简说重构 转生成恶役菜鸟工程师避免 Bad End 的 30 件事 - 26

【Day16】React Router

一页式网站 SPA SPA 全名 Single Page Applications 只有一个 HTM...

二十九日目:JavaScript XMLHttpRequest 弐ノ章

こんばんわー(U 'ᴗ' U)⑅ SONYKO 打油。 连续一周睡眠 < 5小时了,我是谁我在...

MySQL 一对多基本操作

实体 所谓实体即为描述我们真实世界的物件,如员工、客户、订单皆属於实体。 在实务上的需求我们可以将实...

[Day 14] - 『转职工作的Lessons learned』 - Docker Build Issue

今天的笔记应该算是日常初阶工程师会发生的问题,以及可以怎麽去找根因的一些做法,不外乎就是下好关键字,...

[WMX3] 7.IO - Set/Get OutBytes

在还没开始撰写程序前可以先开启WMX3 Console选取I/O 图上显示的红底0.0第一个字代表位...