不怎么重要的前言
上一篇我们总结了scanf的观念,也出了一个小小的作业希望让大家熟悉一下scanf & printf的使用。
接下来我们来谈一下什么是指标、scanf用到的「&」是什么意思!
上次的小作业--数字加总小程式
方法一、
#include <stdio.h>int main(){ int data1, data2; printf("plz input 2 int: "); scanf("%d%d", &data1, &data2); printf("ans: %d\n", data1 + data2); return 0;}
方法二、
#include <stdio.h>int main(){ int data1, data2; printf("plz input 2 int: "); scanf("%d%d", &data1, &data2); int ans = data1 + data2; printf("ans: %d\n", ans); return 0;}
只是稍微列两种写法,不一定只能这样写,只要能写的出结果都是好程式!而这两种方法只差在方法二多用一个变数,去运算、储存结果并输出。
资料存放在哪里?
就像是人会有居住地址一样,资料既然被存放在记忆体,那它也会有一个记忆体地址,来代表它被存放的位置。
相对的每一个变数被宣告的当下,记忆体也会分配给它一个地址来储存资料,只是我们通常使用时只要呼叫变数(诱惑世说使用变数,变数名称像是人的姓名),就可以直接对资料内容做运算、输出了,因为有了变数名称我们就能省去很多不必要的麻烦。
对应关係有点像是这样:
从第九篇的scanf时,我们就有用到「&」来取址,让scanf可以把使用者输入的资料存入地址中,同样的方法我们使用printf来取得变数地址,输出看看变数存放的地址长什么样子:
#include <stdio.h>int main(){ int data = 5; printf("data: %d\n", data); printf("where is data: %p\n", &data); return 0;}
指标是什么?
前面我们有提到当我们宣告一个变数,记忆体会分配给它一个地址,而这个地址我们称它指标(Pointer),而如果我们特别宣告一个变数用来储存指标(变数地址),而那个变数就被称为--「指标变数」。
我们先来简单看一段程式码:
#include <stdio.h>int main(){ int data = 5; printf("data: %d\n", data); printf("where is data: %p\n\n", &data); int* pointer; pointer = &data; printf("pointer: %p\n", pointer); printf("where is pointer: %p\n", &pointer); return 0;}
从上面这段程式码我们可以知道,指标变数的资料内容就是指标(变数地址),而指标变数本身也会拥有自己的变数地址,跟一般变数的差别只在于它是用来储存变数地址的,现阶段先知道有这样的东西、怎么使用就好,未来我们会提到为什么会需要这样的东西。
正式使用指标
指标的相关语法有两种:(1) 「&」取址:可用于把其他变数地址存入指标变数时,或单纯取得变数地址。
#include <stdio.h>int main(){ int data = 5; int* pointer = &data; printf("data: %d\n", data); printf("where is data: %p\n", &data); printf("------\n"); printf("pointer: %p\n", pointer); printf("where is pointer: %p\n", &pointer); return 0;}
(2) 「*」取指标内存放内容:可用于修改其指标所代表变数之资料内容
#include <stdio.h>int main(){ int data = 5; int* pointer = &data; printf("data: %d\n", data); printf("where is data: %p\n", &data); printf("pointer: %p\n", pointer); printf("where is pointer: %p\n", &pointer); printf("------\n"); *pointer = 777; printf("data: %d\n", data); printf("where is data: %p\n", &data); printf("pointer: %p\n", pointer); printf("where is pointer: %p\n", &pointer); return 0;}
(1) 在资料型态后
int* pointer;
(2) 在变数名称前
int *pointer;
而指标变数的资料型态会代表所指向的变数的资料型态,如以下:
float data = 3.14;float* poiner = &data;
指标小结
宣告与取值时
利用指标变数修改其他变数之值时
只要是变数都有自己的变数地址,虽然指标变数的资料内容是指标(变数地址),但其本身也有自己的变数地址。
如果觉得这种叙述方法比较难理解,可以参考以下资料:
指标C语言: 超好懂的指标,初学者请进~指标与地址