C++蓝桥等考导学/十六级:结构体&指针/之五:(17)认识指针(十六级完)

一、观看视频

01】传说中的指针【02】指针变量【03】指针与数组

04】指针与函数

二、研读学生讲义

【学生讲义】01】传说中的指针【学生讲义】02】指针变量【学生讲义】03】指针与数组

【学生讲义】【04】指针与函数

三、练习题(不清楚回头查看有关视频或讲义)

01】有关指针的描述,错误的是:①运用指针编程是C++语言最主要的风格之一。指针是各种数据结构的基础,能方便地处理数组和字符串。能像汇编语言一样直接访问内存地址,从而编出高效精炼的程序。因为指针可以直接操作任意内存地址,所以稍加不慎,就可能造成内存的泄漏、程序的不稳定甚至系统的崩溃。指针是学习C++语言最重要的一环,能否正确理解和使用指针是衡量是否掌握C++语言的一个标志。指针是学习C++语言最为困难的一部分,除了需要正确理解概念,还必须要多编程、多调试,才能真正学会。指针不是C++语言的数据类型,但它被广泛使用。02】程序在运行的时候,系统根据变量的类型,在计算机内存中给变量分配一定长度的空间。字符型1个字节,整型占4个字节,双精度浮点数占8个字节,……。内存中的每个字节都有唯一的编号,即地址。分别指出下图中的①(左)和②(右)是什么:
03】下面哪一项是变量的直接访问和间接访问?


04】有关变量的指针,下面描述错误的是:
①变量的指针就是变量的地址。
②当变量首次被赋值后,其指针(地址)就是一个确定的常量。③无论将来变量的取值是什么,这个地址都不会改变。④可以用&i表示变量i的地址。
05】有关指针变量的定义,下面描述错误的是:
①可以定义一个变量专门用来存放另一变量的地址,这种变量我们称之为指针变量。
②指针变量在定义时(原文的“编译”是笔误),同样也被分配一定字节的储存单元。
③已经定义的指针变量,但未赋初值时,该储存单元的值是0。
④指针变量定义的一般形式为:
06】指针变量的初始化有三种:初始化为某个变量的地址;申请一个新的空间,空间内容不确定;初始化为空指针。分别指出下面的初始化类型:
07】通过指针间接访问变量的描述,错误的是:
①如果p是一个指针变量,可以通过*p或&p的方式,间接访问p指向的数据内容。
②一个指针变量只能指向同长度类型的变量,例如,字符类型和布尔类型都是一个字节,因此字符类型的指针也可以作为布尔类型指针使用。
③下面的代码输出两行相同的文字:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#include<iostream>using namespace std;int main(){  int a = 10;  int b = 100;  int *p1 = &a;  int *p2 = &b;  cout << a << ' ' << b << endl;  cout << *p1 << ' ' << *p2 << endl;  return 0;}

08】可以通过指针间接赋值变量,指出下面代码中第一个*号、&号和第二个*号的语义:

· 

· 

· 

int i;int *p = &i;*p = 1;

09】下面的代码输出什么,运行代码验证你的结果:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#include<iostream>using namespace std;int main(){  int a, b;  int *p1 = &a;  int *p2 = &b;  *p1 = 10;  *p2 = 100;  cout << a << ' ' << b << endl;  cout << *p1 << ' ' << *p2 << endl;  return 0;}

10】下面程序的执行结果是什么?运行验证并说明理由。

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#include<iostream>using namespace std;int main(){  int a = 10, b = 100;  int *p1, *p2;  *p1 = 10;  *p2 = 100;  cout << a << ' ' << b << endl;  cout << *p1 << ' ' << *p2 << endl;  return 0;}

11】指针操作总结,填空:
12】有关数组地址与数组元素地址(数组名和指针)的描述,错误的是:①数组与变量一样,在内存中占据单元。
②数组是由一块连续的内存单元组成的。
③数组名是这块连续内存单元的首地址。④数组元素的首地址就是指它所占有的几个内存单元的首地址。
⑤数组名也是数组第一个元素的首地址。
⑥指针变量可以指向数组,不可以指向数组元素。
13】判断对错,如果错了要改正:指针变量的内容是内存地址,也可以进行加、减运算。这两个运算一般是配合数组操作的。对于指针p,“p++”是p的值加1,除了字符数组和布尔数组,它不能“跳过”一个元素所占的空间,达到下一个元素的开始位置。例如,如果p指向的是int型的数据,有四个字节,那么“p++”指向的是内部字节,需要把它改为p+sizeof(int)才能刚好“跳过”一个整数的空间,达到下一个整数。同理,要把“p--”改为p-sizeof(int)才能刚好先前“跳过”一个整数的空间,达到前一个整数。p+3*sizeof(int)就是指向后面第3个整数的地址。
14】判断对错,如果错了要改正:设有数值a,指向a的指针变量p。因为p+1指向数组的下一个元素,而不是下一个字节,所以:①p+1、a+1、&a[1]均表示1号元素a[1]的地址;②p+i、a+i、&a[i]均表示i号元素a[i]的地址;③p是(地址)变量,而a、&a[i]是(地址)常量,即p=p+i是合法的,但a=a+i是不合法的。这样就可以用两种方法访问数组元素:①下标法——即用p[i]和a[i]形式访问数组元素a[i];②指针法——即用*(p+i)和*(a+i)形式访问数组元素a[i]。
15】有关指针变量作为函数参数的描述,错误的是:
①函数的参数可以是指针类型,它的作用是将一个变量的地址从一个函数传送到另一个函数中。
②指针变量作为函数参数与变量本身作为函数参数不同,变量作函数参数传递的是具体值,而指针作函数参数传递的是内存的地址。
③把数组作为参数传入函数中,实际上是复制了一个同样的数组,再把这个复制的数组传入函数中,因此为了把数组本身的地址传给函数,对应数组要使用指针的形参。
④对于非数组类型变量,用指针作为形参,变量地址作为实参,就可以把变量的地址传进函数中。
16】说出下面代码的运行结果,然后运行验证:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

#include<iostream>using namespace std;void swap(int *q1, int *q2){  int t = *q1;  *q1 = *q2;  *q2 = t;}int main(){  int a = 10, b = 100;  int *p1 = &a;  int *p2 = &b;  swap(p1, p2);  cout << a << ' ' << b << endl;  cout << *p1 << ' ' << *p2 << endl;  swap(&a, &b);  cout << a << ' ' << b << endl;  return 0;}

17】有关函数指数的描述,错误的是:
①程序的数据和代码都是存放在内存空间中的,一个指针变量通过执行不同的数据的地址,就可以对存放数据的变量进行操作。
②函数的入口地址也是可以用指针访问的。在C++中,函数名前加“&”就代表函数的地址。
③函数指针的用途主要是:有些函数在编写时对于调用的子函数无法确定,只有在执行时才能根据实际情况决定调用的子函数,例如排序sort函数。