导读
信息学能够有助于孩子未来工作发展,提升孩子的综合能力。
这一期课,我们承上启下,简单复习信息学所有C++的知识体系,讲解一部分初赛和复赛的知识;然后就从顺序表和链表,开始一步一步走进数据结构的世界!
指针是很多学习C语言、C++同学的噩梦,但是这篇文章,会让你轻松学懂指针,让指针学起来也很简单。让你能运筹帷幄,决胜信息学竞赛。
1 试试手
在讲今天的内容之前,先让大家做几个简单的小练习,学习几个小功能,再来接触今天的知识点!
1 输出地址符+变量
我们写如下代码:
#include<iostream>
using namespace std;
int main(){
int a = 5;
cout<<&a<<endl;
return 0;
}
得到的输出如下:
这里我们用到了&和变量的结合,&在这里是取地址符,能够获得变量a的地址,输出的这一串以0x开头的字符串,就是变量a所在的地址。
到目前为止,我们学过的有关于符号:&的功能有:
两个&,&&表示逻辑与;
用在函数参数名前,表示函数参数的引用调用;
表示取地址符,获取变量的地址。
我们定义多个变量,然后分别输出他们的地址:
#include<iostream>
using namespace std;
int main(){
int a = 5;
int b = 6;
int c = 7;
cout<<&a<<endl;
cout<<&b<<endl;
cout<<&c<<endl;
return 0;
}
执行结果如下:
我们发现,不同变量所在的地址是不同的。
2 学习一个小功能
我们写如下代码:
#include<iostream>
using namespace std;
int main(){
int a = 5;
int *pa = &a;
cout<<pa<<endl;
cout<<*pa<<endl;
return 0;
}
执行结果如下:
2 初识指针
上面其实我们基础到的就是指针的概念。
1 什么是指针
首先,我们先来了解一下指针的定义:
指针是用来存放某个变量的地址的值的变量,这个变量与一般变量不同,它所存放的值是某个变量在内存中的地址的值。
总结来说,指针是一个比较特殊的变量,其他的变量一般都是存某一个值,指针变量存放的是其他变量的地址。指针会指向该变量,通过指针可以获取该变量的值。
2 指针的定义与赋值
了解了指针,我们就来讲一下如何定义指针?
定义指针变量和普通变量的区别,就是在普通变量前面加一个*,表示我们定义的变量是指针变量。
举几个例子:
#include<iostream>
using namespace std;
int main(){
int *pa, *pb;
float *pc;
char *pd;
return 0;
}
所以我们可以总结一下指针的定义格式:
指针类型 *指针名;
指针的命名也是有技巧的。指针一般都和变量是对应的,指针名一般都是在指向变量的变量名前加一个字母p。即使没有对应,也可以养成指针名以p开头的习惯;有些时候,一些局部的指针变量可以使用字母p,q,r来表示,一些有特定含义的指针变量会直接使用其含义进行命名。
给指针变量赋值要赋值的内容是地址,一般来说,我们都使用其他变量的地址对指针进行变量赋值。
举几个例子:
#include<iostream>
using namespace std;
int main(){
int a, b;
int *pa = &a, *pb = &b;
float c;
float *pc = &c;
return 0;
}
一定要注意:指针类型和其指向的变量类型要一致。
除了使用普通变量的地址给指针赋值以外,还可以使用其他指针给指针赋值,使用其他指针赋值时,就直接赋值即可,不需要加其他的符号。
#include<iostream>
using namespace std;
int main(){
int a, b;
int *pa = &a;
int *pb = pa; //pa是地址,直接给pb赋值就可以
return 0;
}
上面这两种赋值方法是最常用的两种赋值方法,也是我们信息学竞赛能够接触到的两种方法。
指针也可以赋值为空,C++中专门定义了NULL关键字来表示空指针:
#include<iostream>
using namespace std;
int main(){
int *pa = NULL;
return 0;
}
空指针在后面我们会详细讲到。
3 指针的算术运算
指针有很多运算,对于我们信息学来说,最重要的只有算术运算,所以接下来我们来看一下指针的算术运算。
1 指针的算术运算
指针支持简单的加法运算和减法运算,支持++运算和--运算。
1、指针可以和一个整数进行加法和减法运算;
举个例子:
#include<iostream>
using namespace std;
int main(){
int a = 5;
int *pa = &a;
cout<<pa<<endl;
pa += 1;
cout<<pa<<endl;
return 0;
}
执行结果如下:
指针加上一个n(正整数),就是指针指向其后面第n个位置;
指针减去一个n(正整数),就是指针指向其前面第n个位置;
因为我们的示例中,使用的是int类型,int类型是32b(位),也就是4B(字节),所以+1就是位置这个字符串+4。具体的,我们下一期课还会详细说明。
2、指针可以执行++运算和--运算
指针做++运算和指针做+1运算是一样的,指针做--运算和指针做-1运算是一样的。
3、指针和指针之间可以做减法运算
两个指针做减法运算后的绝对值表达的是两个指针指向的变量所在位置的距离。
#include<iostream>
using namespace std;
int main(){
int a = 5,b = 6;
int *pa = &a;
int *pb = &b;
cout<<pa-pb<<endl;
cout<<pb-pa<<endl;
return 0;
}
执行结果如下:
4 指针与数组、函数、结构体
指针可以与第二期课中的数组、函数、结构体相结合!
1 指针与数组、函数
1、指针与数组
我们可以将指针和数组相结合,例如:
#include<iostream>
using namespace std;
int main(){
int a[5] = {10,20,30,40,50};
cout<<*a<<endl;
cout<<*a+1<<endl;
cout<<*(a+1)<<endl;
return 0;
}
输出结果如下:
10
11
20
当我们定义了一个数组a以后,我们就可以使用*a来获取数组中索引为0的值,*(a+k)获取数组里索引为k的值。
对于字符数组来说,我们可以直接使用指针的方式定义字符数组:
#include<iostream>
using namespace std;
int main(){
char *c = "abcdefg";
cout<<c[5]<<endl;
cout<<*c<<endl;
return 0;
}
输出结果为:
f
a
2、指针与函数
指针常用作函数参数,与数组作为函数参数的意义相同。
2 指针与结构体
在后面,最重要的关于指针的,就是指针和结构体的结合。
1、定义结构体指针变量
结构体可以定义一般结构体变量,例如:
#include<iostream>
using namespace std;
struct Book{
int page;
string name;
float money;
};
int main(){
Book b; //定义结构体变量
return 0;
}
定义结构体指针变量和使用其他数据类型定义指针变量是一致的,例如:
#include<iostream>
using namespace std;
struct Book{
int page;
string name;
float money;
};
int main(){
Book b; //定义结构体变量
Book *pb; //定义结构体指针变量
return 0;
}
不同的是,使用结构体指针变量访问结构体中的各个属性时,要使用的不是.(点运算符)而是->(箭头运算符)。例如:
Book *pb; //定义结构体指针变量
pb->page = 50;
pb->name = "左老师带你学信息学";
pb->money = 79.9;
2、结构体指针类型属性
结构体中的属性除了可以是我们之前的简单变量,也可以是指针类型的变量。例如:
#include<iostream>
using namespace std;
struct Book{
int page;
string name;
float money;
int *next;
};
后面我们还会针对这两部分内容深入应用,所以大家要先掌握这些基础呀!
5 作业
本节课的作业,就是复习上面的所有知识,然后完成下面的习题!
1 完成功能
题目
定义一个人(People)的结构体,包括如下属性:
姓名
性别
年龄
身高
体重
爱好
然后定义一个结构体指针变量pp,对该变量进行如下操作(每个操作写成一个函数):
1、赋值输入变量的所有属性
2、修改变量的某一个属性,例如输入1,则修改姓名,输入2则修改性别……
AI与区块链技术