第六章指针和引用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

指针在定义后必须初始化才能使用;否则,结果不确定。
指针初始化的一般格式:
数据类型 *指针变量名 = 初始地址值;
或 数据类型 *指针变量名;
指针变量名 = 数据对象地址;
其中数据对象地址可以是变量、数组、函数、结构等的
地址。如:
ptr
x
int x=7; int *ptr=&x; //指向单个变量
&x
7
char *sp; sp=“string”; //指向字符串
int a[5],*ap; ap=a;
//指向数组
int max(),(*fp)(); fp=max; //指向函数
编程中常用的初始化方法:
int *ptr=NULL;
//初始化为空指针
9
6.1.4 指针的使用
// 例6-2:通过指针访问变量
C++规定:
变量的地址: 可以用取地址运算符‘&’ 来获取 数组的地址: 可以用数组名表示 函数的地址: 可以用函数名表示
6
例6-1:取地址运算符&和指针运算符*
#include <iostream> using namespace std; int main() {
int x = 100; cout <<"变量的值是:" << x << endl; cout <<"变量的所在的地址是:" << &x << endl; cout <<"该地址所存储的变量值为:" <<*(&x) << endl; return 0; }
t = x; x = y; y = t;
12
交换两个变量的值(修改前的程序)
void swap(int x,int y) { int tmp;
tmp = x; x = y; y = tmp; } int main() { int x = 2, y = 3;
cout<<“x=“<<x<<“,y=“<<y<<endl; swap(x, y); cout<<"After exchange x&y:”<<endl; cout<<“x=“<<x<<“,y=“<<y<<endl; return 0; }
实参与形参有3种结合方式:
值调用、传址调用和引用调用
传址调用赋予了函数操作“异地”数据的权利, 对函数的独立性有一定影响
传址调用可实现多值传递 使用传址调用方式时,被调用函数的形参是指
针,与之对应的实参要用地址值。
11
例6-3 交换两个变量的值
算 法:
交换两个变量x和y的值一定要用到第三个 变量t作周转:
其中,ptr是指向a的指针。
由此可见,用指针处理数组及元素是最快捷的方式
16
例6-4 用多种方法输出数组元素
#include <iostream>
using namespace std;
int main()
{
int a[]={1, 2, 3, 4, 5};
// int *ptr;
// ptr = a;
for(int i=0; i<5; i++)
cout<<a[i]<<"\t";
//
cout<<*(a+i)<<"\t";
/* {
cout<<*ptr<<"\t";
ptr++;
}
*/ cout<<endl;
return 0;
}
//一般方法:使用数组名和下标 //使用数组名和指针运算
//使用指针变量的方法
x
#include <iostream> using namespace std;
0x0012FF7C
7
通过变量名直接使用变量x
int main() { int x = 7;
int *ptr;
ptr
x
0x0012FF7C
0x0012FF7C
7
通过指针ptr间接使用变量x
ptr = &x;
cout<<"x="<<x<<'\t'<<"&x="<<&x<<endl;
struct Student {
int id; char name[20]; float score; };
17
直接和间接使用变量
ptr ptr+1 ptr+2 ptr+3 ptr+4
a[0] a[1] a[2] a[3] a[4]
等价
ptr ptr+1 ptr+2 ptr+3 ptr+4
*ptr *(ptr+1) *(ptr+2) *(ptr+3) *(ptr+4)
18
6.2.2 指针与字符串
指针---字符数组(字符串) 例题分析
{ int a = 1,b = 2;
cout << "Before exchange:a= " << a << ",b= " << b << endl;
swap(a, b);
cout << "After exchange:a= " << a << ",b= " << b << endl;
return 0;

char *string; char string1[4]; string=string1;

string1[0] = = *string string1[1] = = *(string+1)
19Leabharlann 例6-5:计算字符串长度#include <iostream>
using namespace std;
return 0;
}
14
6.2 指针与数组
6.2.1 指针与一维数组 6.2.2 指针与字符串
15
6.2.1 指针与一维数组
计算机中处理数组时,实际上是将a[i]转换成
*(a+下标表达式值)的形式。即
a[i]
*(a+i)
因为数组名可以表示该数组的首地址,所以:
a[i]
*(a+i)
*(ptr+i)
int mystrlen(char *string)
{
char *ptr=string;
while(*ptr!= '\0')
ptr ++;
// 指针后移,直到指向字符串结束标志
return ptr-string;
}
int main()
{
char str[] = "How long am I?";
cout<<str<<" 的长度是"<<mystrlen(str)<<endl;
return 0;
}
20
6.3 引用
6.3.1引用的概念 6.3.2 函数的引用调用方式
21
6.3.1引用的概念
引用是一种特殊类型的变量,可以被认为是另 一个变量的别名。
引用运算符“&”用来说明一个引用。 数据类型 &引用名 = 已定义的变量名
例:
int a = 10; int &i = a; i = i + 100;
第六章
指针和引用
教学目标
(1) 了解指针类型及引用类型的概念及二者的关 系与区别;
(2) 了解指针与引用变量的使用与操作方法; (3) 了解用指针访问变量、数组、字符串的方法。
2
基本内容
6.1 指针 6.2 指针与数组 6.3 引用
3
6.1 指针
6.1.1 地址 6.1.2 指针的定义 6.1.3 指针的初始化 6.1.4 指针的使用 6.1.5 函数的传址调用方式
例如,学生信息:学号、姓名、性别、各科成绩,地址等这些项都与某 一学生相联系。如下图所示:
可以看到性别(sex)、年龄(age)、成绩(score)、地址(addr)都属于学号为 20090531和名为“LeiFen”的学生。 如果将num、name、sex、age、score、addr分别定义为互相独立的简单变 量,难以反映它们之间的内在联系。
22
*和&
注意: * 和&出现在声明语句和执行语句中 其含义不同。
例如:
int *ptr; y = *ptr; int &ref; ptr = &x;
//说明符:声明ptr是一个int型指针 //指针运算符:取指针ptr所指向地址内存储的数值 //说明符:声明一个int型的引用ref //地址运算符:取变量x的地址
为数组申请动态内存:
指针 = new 数据类型[数组元素个数];
释放数组占用的动态内存空间:
delete [] 指针; 例:
int *p = new int [size]; delete []p;
27
例 6-8:用动态数组来求斐波那挈数列的前n项
#include <iostream>
using namespace std;
cout<<p[i]<<'\t';
}
delete []p;
//释放数组空间
return 0;
}
28
6.5 自定义数据类型
6.5.1 结构体类型 6.5.2 枚举类型
29
6.5.1 结构体类型
构造类型数据
各元素是属于同一个类型的——数组。 不同类型的数据组合成一个有机的整体,以便于引用。这些组 合在一个整体中的数据是互相联系的。
#include <iostream>
using namespace std;
void swap (int &x, int &y)
{
int tmp = x; x = y;
运行结果:
y = tmp; } int main()
Before exchange:a=1,b=2 After exchange:a=2,b=1
int main()
{ int n;
cout<<"求斐波那挈数列的前n项,请输入n:";
cin>>n;
int *p =new int[n+1];
p[0]=0;
p[1]=1;
cout<<p[0]<<'\t'<<p[1]<<'\t';
for(int i=2; i<=n; i++)
{
p[i]=p[i-2]+p[i-1];
}
int main()
{ int a = 2, b = 3;
cout << "Before exchange:a= " << a << ",b= " << b << endl;
swap(a, b);
swap(*a, *b);
swap(&a, &b);
cout << "After exchange:a= " << a << ",b= " << b << endl;
30
结构体类型的定义
结构体作为一种数据构造类型,在程序中使用时要经历定义——声 明——调用三个过程。
结构体的定义就是对结构体的结构进行描述
结构体是由不同的数据类型的数据组成的。组成结构体的每个数据 称为该结构体的成员项,简称成员。
struct 结构体类型名 {
数据类型 成员变量1; 数据类型 成员变量2; …… 数据类型 成员变量n;
cout<<"*ptr="<<*ptr<<'\t'<<"ptr="<<ptr<<endl;
*ptr= 9;
cout<<"x="<<x<<'\t'<<"&x="<<&x<<endl;
cout<<"*ptr="<<*ptr<<'\t'<<"ptr="<<ptr<<endl;
return 0;
}
10
6.1.5 函数的传址调用方式
4
6.1.1 地址
计算机的内存储器就象一个一维数组,每个 数组元素就是一个存储单元。
地址是存放信息数据的内存单元的编号。 程序中定义的任何变量、数组或函数等,在
编译时都会在内存中分配一个确定的地址单 元。
5
如何表示地址?
凡是存放在内存中的程序和数据都有一个地 址,可以用它们占用的那片存储单元中的第 一个存储单元的地址表示。
*ptr = 2;
23
6.3.2 函数的引用调用方式
实参与形参有3种结合方式:
值调用、传址调用和引用调用
在形参名前加上引用说明符“&”即将其声明为 引用,实参则直接采用一般的变量名。
在函数调用时,形参就成了实参的别名,对引 用的操作就等同于直接对主调函数中原变量的 操作。
24
交换两个整形变量的值(引用调用)
13
交换两个变量的值(修改后)
#include <iostream> using namespace std; void swap (int *xp, int *yp) { int tmp;
运行结果:
Before exchange:a=1,b=2 After exchange:a=2,b=1
tmp = *xp; *xp = *yp; *yp = tmp;
}
25
扩展阅读
6.4 动态存储分配 6.5 自定义数据类型
6.5.1 结构体类型 6.5.2 枚举类型
26
6.4 动态存储分配
运算符new用来申请所需的内存
指针 = new 数据类型(初值);
运算符delete用于释放先前申请到的存储块
delete 指针; 例:
int *p = new int (5); delete p;
7
6.1.2 指针的定义
数据类型 *指针变量名;
例:int * ptr; float *array; char *s1,*s2;
说明:
数据类型是指针所指向变量的类型; *是一个说明符,它不是指针变量名的一部分,而
相关文档
最新文档