【指针之旅1】指来指去的方向牌——指针相关概念和基础语法

1.内存和地址

    假设有一个宿舍楼,把你放在楼里,楼上有许多房间。如果你的朋友要找你,那只能一个一个房间地找,效率会很低,但现实生活中的情况一般是会给每个房间编号,如201302等,你只需要告诉你的朋友你的房间号,就能快速找到你。

    如果把上面的例子对照到计算机中,又是怎么样呢?

    我们知道计算机上 C P U CPU CPU(中央处理器)在处理数据时是要从内存中读取的,处理后的数据也会放回内存,在电脑中的内存也是被划分为一个个的内存单元 每个内存单元的大小取一个字节

计算机中常见的内存单位:
一个比特位可以存一个二进制下的 0 0 0 1 1 1(相当于宿舍中的一个人)
8 b i t 8bit 8bit(比特位) = 1 b y t e =1byte =1byte(字节)
1024 b y t e = 1 K B 1024byte=1KB 1024byte=1KB
1024 K B = 1 M B 1024KB=1MB 1024KB=1MB
1024 M B = 1 G B 1024MB=1GB 1024MB=1GB
1024 G B = 1 T B 1024GB=1TB 1024GB=1TB
1024 T B = 1 P B 1024TB=1PB 1024TB=1PB

    这是一台电脑中的内存空间(通常使用 16 16 16进制表示,0x是十六进制数的前缀):

地址( 16 16 16进制)内存
0 x F F F F F F F F 0xFFFFFFFF 0xFFFFFFFF 1 1 1个字节(相当于一个宿舍中的 8 8 8个人)
0 x F F F F F F F E 0xFFFFFFFE 0xFFFFFFFE 1 1 1个字节
0 x 00000001 0x00000001 0x00000001 1 1 1个字节
0 x 00000000 0x00000000 0x00000000 1 1 1个字节

    地址就像房间号一样,便于我们快速访问某一块内存。注意:内存单元的编号地址指针这三个概念是等价的,即 内存单元的编号 = 地址 = 指针 内存单元的编号=地址=指针 内存单元的编号=地址=指针。只不过在 C C C C + + C++ C++中,习惯把地址叫做指针

2.指针基础语法

2.1.取址操作符

    想要使用指针变量,我们就先要知道一个数的地址。使用&操作符,就可以方便的获得一个变量的地址。如下:

#include<iostream>
using namespace std;
int main() {
    int a = 10;
    cout << &a; // 输出一个变量的地址
    return 0;
}

    这个程序的输出是不固定的,因为每一个程序分配给不同变量的地址是不一样的。

    有细心的同学肯定发现了,scanf函数也需要使用&操作符。没错,这里的&起到的也是取一个变量的地址的作用。

2.2.指针变量和解引用操作符

    已经知道了一个变量的内存地址,就要将它使用一个变量存起来。这个变量就叫做指针变量。示例如下:

#include<iostream>
using namespace std;
int main(){
    int tmp = 10;
    int* p = &tmp; // p中存储的就是变量tmp的指针
    cout << p <<endl;
    return 0;
}

    指针变量定义的基本格式如下:

指向的变量类型* 指针变量名;

    这个时候,爱思考的同学们可能就会想了:每一个地址不都是一串十六进制的数字吗,不同类型的变量的地址还有大小之分?别急,先往后看。

    想要对指针变量指向的变量进行操作或者访问,就需要用到解引用操作符*(没错,又是*)。示例如下:

#include<iostream>
using namespace std;
int main(){
    int tmp = 10;
    int* p = &tmp; // p中存储的就是变量tmp的指针
    cout << *p << endl; // 相当于cout << tmp << endl;
    *p = 20;
    cout << *p << endl; // 这里输出20
    return 0;
}

2.3.指针±整数和指针类型

    看看这样一段程序:

#include<iostream>
using namespace std;
int main(){
    int n = 0;
    char a = '0';
    int* pi = &n;
	char* pch = &a;
	printf("pch储存的地址是:    %p\n", pch);
	printf("pch+1储存的地址是:  %p\n", pch + 1);
	printf("pi储存的地址是:     %p\n", pi);
	printf("pi+1储存的地址是:   %p\n", pi + 1);
    return 0;
}

    就拿我本地运行得到的结果来说:

在这里插入图片描述
    如果你已经学过了 16 16 16进制整数的加减(没学过还不赶快去学!)可以看出来:
pch+1相比于pch向前走了1个地址单元(因为char类型的一个变量占用1个字节)。而pi+1相比于pi向前走了4个地址单元(因为int类型的一个变量占用4个字节)。

    这便是指针加减整数的意义:p+n表示p向前(或后)移动n个此类型的字节大小。(例如:char c, *p = & c;,那么p+1就是向前移动一个字节(char类型的字节大小))

    同时,这也解释了为什么指针变量要分不同的类型:指针变量的类型决定了指针加减整数时的步长(即一步的长度)。

2.4.sizeof关键字

    sizeof关键字是一个可以求出一个类型变量数组所占空间大小(单位:字节)的函数。示例如下:

#include<iostream>
using namespace std;
int main(){
    int a,b[10] = {0, 1, 2, 3};
	cout<< sizeof(int) <<endl;
	cout<< sizeof(a) <<endl;
	cout<< sizeof(b) <<endl;
    return 0;
}

    输出:

4
4
40

    注意:通过使用sizeof关键字,可以求出一个数组的大小,示例如下:

#include<iostream>
using namespace std;
int main(){
    int a[] = {0, 1, 2, 3, 4 , 5, 6, 7, 8, 9};
	cout<< sizeof(a) / sizeof(a[0]) <<endl;
    return 0;
}

3.为什么要使用指针

    就像皇帝想要除掉一个人,明面上不好动手,只能派一个人代劳一样。在编写程序中,也有可能会遇到想要操作一片空间,但是无法直接通过变量来操作的情况。这是我们就需要使用指针了。最典型的就是动态开辟空间

4.后记

    这篇文章记叙的只是指针相关知识的冰山一角,但是已经足够备战竞赛的同学使用了。如果想要知道更多关于指针的用法和特性,敬请期待后续。

最后,制作不易,希望大家多多点赞收藏,关注下方微信公众号,谢谢大家的关注,您的支持就是我更新的最大动力!
公众号上会及时提供信息学奥赛的相关资讯、各地科技特长生升学动态、还会提供相关比赛的备赛资料、信息学学习攻略等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝胖子教编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值