第八章 指针

合集下载

C++程序设计 第八章 指针和引用

C++程序设计  第八章 指针和引用
C++

在程序运行时变量和函数都存放在内存中,通过变量名来访问数据、通过函数名来调用函数都是直接访问方式。还有另一种间接访问方式就是用指针。指针的本质是内存地址。指针往往用于说明函数的形参,使实参能通过指针传递,以提高函数调用的效率。利用指针能动态地使用内存,以提高内存使用效率。指针也能用来表示数据关联,以构成复杂的数据结构。指针是C程序中最常见的类型。引用是C++扩展的新概念,主要用于函数形参和返回类型。本章将详细介绍指针和引用的概念及应用。
首先,这6个变量的地址是按递减次序排列,这是因为局部变量都存储在堆栈中,堆栈是先入后出的。先入栈的数据存放在较大地址位置,后入栈的数据存放在较小地址位置。如果这些变量改为全局变量,它们的排列次序就会颠倒过来。
其次,尽管变量s只占2字节,变量c只占1字节,但却分别占用4字节空间。这是因为按字对齐(32位数据)能提高CPU访问内存的效率,而且一次压栈和出栈操作也是以32位数据为单位,代价是浪费一些内存。如果这些变量改为全局变量,它们将按实际大小存储。
怎样能知道一个变量在运行时刻的内存地址?把取地址运算符&放在变量前面就得到它的首地址。例如b是一个变量,那么&b就表示它的地址。下面例子能看到一组局部变量的首地址。
例8-1显示一组局部变量的首地址。
#include<iostream.h>
void main(){
bool b = true;
char c = 'c';
其中,<类型名>是这个指针变量所指向的对象的类型,简称指针类型,它可以是任何一种类型。*表示这个变量是一个指针变量。这个变量的类型就是“<类型名>*”。<变量名>是一个标识符。指针变量可以进行初始化,等号之后给出一个变量的地址,要求这个变量的类型与指针类型相符。

C语言 第八章

C语言 第八章

p
printf(“%d,%d\n”,a,b); printf(“%d,%d\n”,*p1,*p2);}
三、指针变量作为函数参数 作用:将一个变量的地址传送到另一个函数中。 作用:将一个变量的地址传送到另一个函数中。 例1:编写实现两个数的交换的函数 : swap(int *p1, int *p2) *p2) void swap(int *p1, int swap(int x,int y) {{ int temp; 定义为*temp? ? int temp; 定义为 { int temp; temp=*p1; temp=x; temp=*p1; *p1=*p2; x=y; *p1=*p2; y=temp; } *p2=temp; } *p2=temp; } main() main() main() { int a,b,*p1,*p2; { int a,b; { int a,b p1=&a;p2=&b; scanf("%d,%d",&a,&b); scanf(“%d%d”,&a,&b); scanf(“%d%d”,p1,p2); swap(a,b); swap(&a,&b); swap(p1,p2); printf("\n%d,%d\n",a,b); printf("%d, %d\n",a,b); printf("%d, %d\n",a,b); }} }
个字节的问题) 个字节的问题)
二、指针变量的引用 “&”(地址运算符 取变量的存储地址。如:&a求变量 的地址。 地址运算符) 取变量的存储地址。 地址运算符 求变量a的地址 求变量 的地址。 “*” (引用运算符 取指针所指向变量的内容。&与*优先级相同, 引用运算符) 取指针所指向变量的内容。 与 优先级相同 引用运算符 优先级相同, 但按自右至左的结合方向。 但按自右至左的结合方向。 例如: 例如:int i=3,*p; p=&i;

《C语言程序设计》第8章指针

《C语言程序设计》第8章指针
}
10.3.3 指针变量和数组作函数参数 数组名作形参时,接收实参数组的起始地址;
作实参时,将数组的起始地址传递给形参数组。
引入指向数组的指针变量后,数组及指向数 组的指针变量作函数参数时,可有4种等价形式 (本质上是一种,即指针数据作函数参数):
(1)形参、实参都用数组名 (2)形参、实参都用指针变量 (3)形参用指针变量、实参用数组名 (4)形参用数组名、实参用指针变量
(4)指针变量的++、--与&、*的结合
对于指针变量的++、--与&、*的结合 使用,关键要注意按照运算符的优先级和 结合性进行。
例如: int a=2, *p; p=&a;
•表达式:(*p)++,按运算符的优先级,等价于 a++。其含义为:取出指针变量p所指向的内存单 元的值(即a的值),a的值加1,送回a的内存单 元,a的值变为3,p的值未发生变化,仍然指向 变量a。
程序说明:printf("%s\n",s);语句 通过指向字符串的指针变量s,整体引
用它所指向的字符串的原理:系统首先输出s 指向的第一个字符,然后使s自动加1,使 之指向下一个字符;重复上述过程,直至遇到 字符串结束标志。
main() { char string[ ]=”I love Beijing.”; printf(“%s\n”,string); }
3.数组元素的引用 数组元素的引用,既可用下标法,也可用
指针法。
10.3.2 通过指针引用数组元素 如果有“int a [10],*p=a;” ,则: (1)p+i和a+i都是数组元素a [i]的地址。
(2)*(p+i)和*(a+i)就是数组元素a [i]。 int a [3]; a [0]——*a a [1]——*(a +1) a [2]——*(a +2)

C二级 第8章 指针

C二级 第8章 指针

1.以下定义语句中正确的是A) int a=b=0; B) char A=65+1,b='b';C) float a=1,*b=&a,*c=&b; D) double a=0.0; b=1.1;参考答案:B【解析】A选项语句中b变量还没有定义不能直接用于给a变量赋值。C选项语句中*b、*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c。D选项语句中a=0.0后面应该为逗号,不能是分号。2.有以下程序#include <stdio.h>void f(int *p,int *q);main(){ int m=1,n=2,*r=&m;f(r, &n);printf("%d,%d",m,n);}void f(int *p,int *q){ p=p+1;*q=*q+1;}程序运行后的输出结果是A) 2,3 B) 1,3 C) 1,4 D) 1,2参考答案:B【解析】在f(int *p,int*q)函数中,执行p=p+1是将p所对应的地址加1,而*q=*q+1是将q所指向的n的地址所对应的值加1,所以m的得知所对应的值没有变,而n的值则为3了。

因此B选项正确。

3.以下叙述中正确的是A) 如果p是指针变量,则&p是不合法的表达式B) 如果p是指针变量,则*p表示变量p的地址值C) 在对指针进行加、减算术运算时,数字1表示1个存储单元的长度D) 如果p是指针变量,则*p+1和*(p+1)的效果是一样的参考答案:C【解析】B选项中,如果p是指针变量,则*p表示变量p所指向的地址的值;A选项中,如果p是指针变量,则&p表示变量p的地址;D选项中,如果p是指针变量,*p+1表示将p所指的值加上1,而*(p+1)表示的是先将指针右移一位再取所指向变量的值。

因此C选项正确。

4.以下叙述中正确的是A) 基类型不同的指针变量可以相互混用B) 函数的类型不能是指针类型C) 函数的形参类型不能是指针类型D) 设有指针变量为double *p,则p+1 将指针p移动8个字节参考答案:D【解析】B选项中,所谓函数类型是指函数返回值的类型。

c语言程序设计电子书

c语言程序设计电子书

c语言程序设计电子书C语言程序设计是一门基础且广泛应用的编程语言课程,它以其高效、灵活和强大的功能而著称。

C语言由丹尼斯·里奇(Dennis Ritchie)在20世纪70年代初期于贝尔实验室开发,至今仍是许多系统软件和应用软件的首选语言。

本电子书将从C语言的基本概念、语法结构、数据类型、控制结构、函数、数组、指针、结构体、文件操作等方面进行详细介绍。

第一章:C语言概述C语言是一种过程式编程语言,它支持结构化编程。

C语言的设计哲学是提供一种通用、高效、易于使用的语言,同时保持对硬件的控制。

C 语言广泛应用于操作系统、嵌入式系统、高性能计算等领域。

第二章:C语言环境和基本语法在开始编写C程序之前,需要配置C语言开发环境,如GCC编译器。

C 程序的基本结构包括预处理指令、函数、变量声明和语句。

程序从`main`函数开始执行。

第三章:数据类型和变量C语言提供了多种数据类型,包括整型、浮点型、字符型等。

变量是程序中存储数据的容器,需要先声明后使用。

C语言是静态类型语言,每种变量在使用前必须指定数据类型。

第四章:运算符和表达式C语言提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符等。

表达式是由变量、常量和运算符组成的组合,用于执行计算。

第五章:控制结构控制结构是程序流程控制的基本构件。

C语言提供了三种基本的控制结构:顺序结构、选择结构(if语句、switch语句)和循环结构(for 循环、while循环、do-while循环)。

第六章:函数函数是C语言中实现代码复用的重要手段。

函数允许将代码组织成独立的块,每个块可以执行特定的任务。

C语言支持函数的定义、声明、调用和递归。

第七章:数组数组是相同数据类型元素的集合。

C语言支持一维数组和多维数组。

数组在内存中是连续存储的,这使得数组操作高效但也需要小心越界问题。

第八章:指针指针是C语言的核心特性之一。

指针变量存储的是另一个变量的内存地址。

高树芳C语言程序设计--第八章

高树芳C语言程序设计--第八章

30
8.5 知识拓展
案例8-11 指针的高级应用 [案例任务] 阅读下列程序 ,分析运行结果,了解指 针的各种应用。
程序代码
31
8.5 知识拓展
相关知识:
1.有关指针的数据类型小结 2.案例说明 3.main函数的参数
32
12
8.2 指针变量
[课堂训练8-1] void swap(int *p1,int *p2) { int *t; t=p1; p1=p2; p2=t; }
1.分析下面的程序,写出运行结果。 #include <stdio.h> void main() { void swap(int *p1,int *p2); int *p1,*p2,a=6,b=8; p1=&a; p2=&b; printf(" 交换前:*p1=%d,*p2=%d\n",*p1,*p2); swap(p1,p2); printf(" 交换后:*p1=%d,*p2=%d\n",*p1,*p2); }
17
8.3 指针与数组
案例8-6 [案例任务]
冒泡排序
使用指针指向一维整型数组,使用冒泡排 序法对数组元素从小到大排序并输出。
程序代码
18
8.3 指针与数组
相关知识: 1.冒泡排序法 2.指针变量的其他运算
19
8.3 指针与数组
案例8-7 [案例任务]
逆置一维数组
使用数组名或指针变量作为函数形参与实 参,完成一维数组元素的逆置。请分析程 序运行结果,并对两个方法进行比较。
6
8.2 指针变量
案例8-2 用指针交换两整数 案例8-3 用指针比较两数大小 案例8-4 用指针参数交换两整数

c语言第8章练习题--指针

c语言第8章练习题--指针

1、int *p 的含义是(B)A.p是一个指针, 用来存放一个整型数B.p是一个指针, 用来存放一个整型数据在内存中的地址C.p是一个整型变量D. 以上都不对2、以下函数用来求出两整数之和,并通过形参将结果传回,请填空。

void func(int x,int y, ___int*____ z){ *z=x+y; }3、有如下程序段(B)int *p,a=10,b=1;p=&a; a=*p + b;执行该程序段后,a的值是A. 12B. 11C. 10D. 编译出错4、若己定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是( C)A) p+1B) a+1C) a++D) ++p5、以下程序运行后的输出结果是(A)void main( ){ int a[ ]={1,2,3,4,5,6,7,8,9,0},*p;for(p=a;p<a+10;p++) printf("%d,",*p);}A)1,2,3,4,5,6,7,8,9,0,B)2,3,4,5,6,7,8,9,10,1,C)0,1,2,3,4,5,6,7,8,9,D)1,1,1,1,1,1,1,1,1,1,6、下面程序的输出是(D)void prtv(int *x)printf("%d\n", ++*x);}main(){ int a=25;prtv(&a);}A) 23 B) 24 C) 25D) 267、有以下函数(B)char fun(char *p){ return p; }该函数的返回值是A) 无确切的值B) 形参p中存放的地址值C) 一个临时存储单元的地址D) 形参p自身的地址值8、下列程序的输出结果是(7)#include<stdio.h>void fun (int *p1, int *p2){ if (*p1>*p2) printf ("%d\n",*p1);else printf ("%d\n",*p2);}void main ( ){ int a=3,b=7;fun (&a, &b);}9、下列程序的运行结果是(B)void fun(int *a, int *b){ int *k;k=a; a=b; b=k;}main(){ int a=3, b=6, *x=&a, *y=&b;fun(x,y);printf("%d %d", a, b);}A) 6 3 B) 3 6 C) 编译出错D) 0 010、以下程序调用findmax函数返回数组中的最大值(B)findmax(int *a,int n){ int *p,*s;for(p=a,s=a; p-a<n; p++)if ( ) s=p;return(*s);}main(){ int x[5]={12,21,13,6,18};printf("%d\n",findmax(x,5));}在下划线处应填入的是(B)A) p>s B) *p>*s C) a[p]>a[s] D) p-a>p-s11、下列程序段的输出结果是(A)void fun(int *x, int *y){ printf("%d %d", *x, *y); *x=3; *y=4;}main(){ int x=1,y=2;fun(&y,&x);printf("%d %d",x, y);}A) 2 1 4 3 B) 2 1 3 4 C) 1 2 1 2 D) 2 1 1 212、以下程序执行后输出的结果是___84________。

函数和指针程序设计实验总结与反思

函数和指针程序设计实验总结与反思

函数和指针程序设计实验总结与反思通过函数和指针程序设计实验还是反映出比较多的问题,我感觉第八章的指针比较难理解,与前面数组部分联系起来了,上理论课时有一些地方不太明白。

通过此次老师重点讲解函数和指针程序设计实验,加深了我对字符指针和指针数组的掌握,理解会好很多,思路也更清晰很多,但还是要多去理解,也有些东西需要去记忆。

比如一个字符串在内存中是连续存储的,它的开始地址为指向字符串的指针值。

当使用指针作为形参时,实参必须是地址,也应是数组名。

一开始写完这个程序的时候运行出来的输出结果数字与数字之间没有间隔,就是一长串的数字,但是顺序是对的,通过对代码的再次检查,在输出后面加上空格,就得到了正确的格式,这种小问题发现比较难,在打代码的时候就要留心。

我从函数和指针程序设计实验中学习到很多。

我们写代码的时候一定要仔细,定义的函数与调用时的要一致,不要犯一些低级的错误。

总之还是要多去理解代码,多从错误中学习。

C语言程序设计第八章 优化学生成绩分析系统指针.ppt

C语言程序设计第八章 优化学生成绩分析系统指针.ppt

C语言程序设计
1 指针与字符串(5)
1.2 使用字符串指针变量与字符数组的区别(续) 例2 分析下面程序的运行结果
main() { char *a="I Love China!";
a=a+7; printf(“%s\n",a); }
运行结果: China!
9
项目八 优化学生成绩分析系统-指针
C语言程序设计
int a,b,c;
例sc6an将f(给"%出d的,%程d"序,&修a,改&b为);使用函数指针变量定义
的c=方m式ax(a,b);
c=(*p)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
max(int x,int y)
{
int z;
if(x>y) z=x;
else z=y;
指针数组,有4个元素,每个元素 都是指向整型变量指针变量
Int (*p)[4];
由4个整型变量组成的数组的指针
21
项目八 优化学生成绩分析系统-指针
#include <stdio.h> ma3in指()针数组 (2)
C语言程序设计
p[0]
11
{ 3.1 指针数组(续)
22
static int
33
a[3][4]={{11,22,33,44},{55,66,77,88},{99,110,1224,4133}};
【项目分析】
为了保存一个班的C语言成绩需要借助于一维数组,通过指针对其数 据进行操作。将本项目分成两部分,首先借助于指针对一维数组进 行访问,然后介绍一种新的排序算法—选择排序。

8.指针

8.指针

例 p指向int型数,则 p+1 p+12 例 p指向int型数组,且p=&a[0]; 则p+1 指向a[1] 例 int a[10]; int *p=&a[2]; p++; *p=1; 1
p+i
a[3]
a[4] a[5] a[6] a[7] a[8] a[9]
p+9
指针的算术运算: 若指针变量p1与p2都指向同一数组,如执行p2-p1, 结果是两个地址之差除以数组元素的长度。 即 p2-p1(p2-p1)/d 假设p2指向实型数组元素a[5],p2的值为2020;p1指 向a[3] ,其值为2012, 则p2-p1的结果是(2020-2012)/4=2. 这个结果是有意义的,表示p2所指的元素与p1所指的 元素之间差2个元素。 p1+p2 无实际意义
a+9
a[9] *(a+9)
p+9
*(p+9)
下标法 a[i] *(p+i) *(a+i)
指针法
例 输出数组中的全部元素。
假设有一个a数组,整型,有10个元素。要输出 各元素的值有三种方法:
(1)下标法。
(2) 通过数组名计算数组元素地址,找出元素的值。
(3) 用指针变量指向数组元素。
(1)下标法。(8-3(1).c) #include <stdio.h> void main() { int a[10]; int i; for(i=0;i<10;i++) scanf(″%d″,&a[i]); printf(″\n″); for(i=0;i<10;i++) printf(″%d″,a[i]); }
2000 3 a 2002 4 b

TP8

TP8

ACCP V4.0
指针使用示例2
内存 void main() { ptr1 num1 int num1 = 50, num2 = 100; 12ff7c 50 int *ptr1, *ptr2; ptr1 = &num1; 12ff7c printf(" num1 的值是: %d", *ptr1); ptr2 num2 printf("\n num1 的地址是: %x \n", ptr1); 12ff78 ptr2 = &num2; 50 100 printf("\n num2 的值是: %d", *ptr2); 12ff78 printf("\n num2 的地址是: %x \n", ptr2); *ptr2 = *ptr1; printf("\n 重新赋值后 num2 的值是: %d", *ptr2); printf("\n 重新赋值后 num2 的地址是: %x\n", ptr2); }
arr_num[0] arr_num[1] arr_num[2] arr_num[3] arr_num[4] arr_num[5] arr_num[6] arr_num[7]
41 60
23 15 60 41 49 13 39
14
ACCP V4.0
指针关系运算
比较两个指针
#include<stdio.h> void main () { int *ptrnum1, *ptrnum2; int value = 1; ptrnum1 = &value; value += 10; ptrnum2 = &value; if (ptrnum1 == ptrnum2) printf("\n 两个指针指向同一个地址\n"); else printf("\n 两个指针指向不同的地址\n"); }

第8章 指针2-xujh

第8章 指针2-xujh
a[0]=’c’;a[1]=’o’;a[2]=’m’;a[3]=’p’;……;a[7]=’r’; 但语句: p=”computer”; 是合法的。
指针数组与命令行参数
• 在操作系统命令状态下可以输入程序或命 令使其运行,称命令行状态。输入的命令 (或运行程序)及该命令(或程序)所需 的参数称为命令行参数
*(a[0]+1) *(*(a+0)+1)
a+1
对于二维数组: (1)a是数组名, 包含三个元素 a[0],a[1],a[2] (2)每个元素a[i] 又是一个一维 数组,包含4个 元素
a+2
2016 a[2]
a[2][2]
a[2][3]
int a[3][4];
a
2000 2000
a[0]
a+12008
指针数组
• •
指针数组是指针变量的集合 定义形式:类型标识符 *数组名[数组长 度说明]
– 如: int *p[10];

注意事项:
– 字符数组中每个元素可存放一个字符,而字符 指针变量存放字符串首地址,千万不要认为字 符串是存放在字符指针变量中的 – 对字符数组而言,与普通数组一样,不能对其 进行整体赋值,只能给各个元素赋值,而字符 指针变量可以直接用字符串常量赋值
P[0] P[1] P[2]
B A S I C \0 C + + \0 P A S C A L \0
字符指针数组举例(1)
• • • • • • • • • • • • • 例:有若干本书,将书名按字典顺序排序 #include<stdio.h> #include<string.h> main() { char *bname[ ]={"Programming in ANSI C","BASIC","Visual C++ 6.0 Programming ","TRUBO C 2.0"}; int i,m; void sort(char *name[],int); m=sizeof(bname)/sizeof(char *); /*字符串个数*/ sort(bname,m); /* 排序,改变指针的连接关系*/ printf("\n"); for (i=0;i<m;i++) /* 输出排序结果*/ printf("%8s",bname[i]); }

c语言程序设计第五版课后答案谭浩强第八章课后答案

c语言程序设计第五版课后答案谭浩强第八章课后答案

c语⾔程序设计第五版课后答案谭浩强第⼋章课后答案c语⾔程序设计第五版课后答案谭浩强习题答案第⼋章善于利⽤指针本章习题均要求使⽤指针⽅法处理。

1. 输⼊3个整数,要求按由⼩到⼤的顺序输出。

解题思路:先获取到三个变量的地址,然后获取三个数据,通过指针进⾏⽐较转换即可答案:#include <stdio.h>void swap(int *p_a, int *p_b){int temp = *p_a;*p_a = *p_b;*p_b = temp;}int main(){int a, b, c, *p_a = &a, *p_b = &b, *p_c = &c; // 获取每个变量空间的地址printf("Please enter three numbers:");scanf_s("%d%d%d", p_a, p_b, p_c);if (*p_a > *p_b) {swap(p_a, p_b);//通过指针进⾏指向空间内的数据交换}if (*p_a > *p_c) {swap(p_a, p_c);}if (*p_b > *p_c) {swap(p_b, p_c);}printf("%d %d %d\n", *p_a, *p_b, *p_c);system("pause");return 0;}2. 输⼊3个字符串,要求按由⼩到⼤的顺序输出。

解题思路:字符串的⽐较可以使⽤strcmp函数,返回值>0表⽰⼤于,返回值⼩于0表⽰⼩于,返回追等于0表⽰相同。

其他的⽐较排序思路与数字的排序交换没有区别,逐个进⾏⽐较先找出最⼤的,然后找出第⼆⼤的。

答案:#include <stdio.h>int main(){char str[3][32];char *p[3];printf("Please enter three strings:");for (int i = 0; i < 3; i++) {p[i] = str[i];scanf_s("%s", p[i], 32);//后边的数字限制缓冲区边界,防⽌缓冲区溢出访问越界}//让p[0]和p[1]/p[2]分别进⾏⽐较,找出最⼤的字符串,i+1之后,则让p[1]和p[2]进⾏⽐较,找出第⼆⼤//i循环总个数-1次,最后⼀个是不需要⽐较的for (int i = 0; i < 2; i++) {for (int j = i + 1; j < 3; j++) {if (strcmp(p[i], p[j]) > 0) {char *tmp = p[i]; p[i] = p[j]; p[j] = tmp;}}}printf("%s %s %s\n", p[0], p[1], p[2]);system("pause");return 0;}3. 输⼊10个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。

C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针

C语言程序设计(第二版)-电子教案-丁亚涛-8587 第8章 指针
}
8.5.3 指针与二维数组
• 二维数组其实可以看成由一维数组构造而成。就相当于 几个队列构成一个方阵,方阵由队列组成,队列由具体 的元素--人组成。
• 一级指针只能管理队列,如果管理方阵,则需要二级指 针。
•int a=1000,*pa,**ppa; • pa=&a; • ppa=&pa;
• *(*(ppa)) ≡ *(pa) ≡ a ≡ 1000
• p是二级指针 • *p相当于*(p+0),级别降低为一级指针,相当于p[0] • **p相当于*(*(p+0)+0),级别降低为数组元素(普通变量),
也相当于p[0][0]
• p[1][2],相当于*(*(p+1)+2) • &p[1][2], 级别提升为一级指针,相当于:
• p[1]+2,*(p+1)+2 • &p[1],级别提升为二级指针,相当于:
f=f4; printf("a/b=%d\n",f(a,b));
8.5 指针与数组
• 8.5.1 指针与字符数组 • char str[100]= "Hello World"; • char *p=str; • 字符w可以有如下多种表示形式: • str[6] • *(str+6) • p[6] • *(p+6)
【例8-2】演示指针和数组的关系。
#include <stdio.h>
接可存取,由于p中存储的是x的信息。访问p可以获取x的信 息,再对银行存款进行操作。
8.1 借钱的故事
8.2 指针的概念
• C语言允许使用变量名、数组名[下标]、函数名等标 识符来访问内存

C语言程序设计第八章 指针的使用

C语言程序设计第八章 指针的使用

第八章指针的使用【学习目标】本章将详细介绍在C语言中如何使用指针。

学习要点包括如下几点:(1)掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。

(2)掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。

(3)熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。

(4)了解指针与字符串的关系,能熟练使用指针处理字符串。

(5)熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。

(6)指向指针的指针的运用。

【学习导航】本章的在整个课程中的位置如图5-1所示。

图8-1 本章学习导航在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。

指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。

有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。

8.1 地址和指针指针是C语言的一种数据类型,类似于整型、字符型等。

既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。

指针变量和其他类型的变量的区别是:指针变量存储的是地址。

所以要学好指针,就一定要明白数据在内存中是如何存储的。

计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。

地址就是内存区中对每个字节的编号。

下面通过两个整型变量来说明。

整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。

把变量所占用的存储单元首字节的地址作为变量的地址。

C语言中利用取地址运算符“&”获取变量的存储地址。

例如,&c将返回c的首地址;&x将返回x的首地址。

2000H2004H2008H2012H...图8-2 变量x和y在内存中的存储图8-2中2000H和2004H就是内存单元的地址。

郑秋生版c++答案习题八

郑秋生版c++答案习题八

第八章指针与引用习题答案一、选择题CBCBCC二、简答题(1)&运算符:取地址运算符,用来得到一个普通变量的地址。

*运算符:间接引用运算符,用来获取指针变量所指向变量的值。

(2)指针:一个变量在内存中所占存储单元的首地址称为该变量的指针,也就是指向该变量的指针。

指针中存储的地址是其所指向的变量的地址,指针中存储的地址里的值就是其所指向变量的值。

(3)引用与指针的区别是,通过某个指针变量指向一个对象后,对它所指向的变量通过*运算符进行间接操作,程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

可以建立数组的指针,但不能建立数组的引用,因为数组是一个由若干个元素所组成的,所以就无法建立一个数组的别名。

(4)const int *p1 表示p1所指向的int变量为常量,int *const p1 表示p1为常量三、改错题(1)int a;b; 改成int a, b;pointer_1=a; 改成pointer_1=&a;cout<<*a<<" "<<*b<<endl; 改成cout<<a<<" "<<b<<endl;cout<<pointer_2*a<<endl; 改成cout<<(*pointer_2)*a<<endl;(2)有int *p,a=9;p=&a;cout<<”the value of p is ”<<*p;四、阅读程序写结果(1)ABCDEFG(2)x=1.5 y=2.5z=4(3)20 50 50 41(4)m-n=15五、编程题(1)实现字符串逆序输出。

#include <iostream.h>#include <string.h>const char *fun( const char *p1 ){while (*p1++);p1--;return p1;}int main(void){char s1[100];const char *q,*p1;cout<<"输入一个字符串:";cin.getline( s1,100);cout<<"逆向输出串:";q=s1;p1=fun(s1);do{cout<<*p1;p1--;}while(q<=p1);return 0;}(2)输入任意一个字符串,将其中的大写字母转换成小写字母。

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

第八章指针【本章要求】1、指针的声明、定义方法以及通过指针变量引用存储单元中的内容2、指针作为函数参数,地址传递情况下,函数实参的变化3、用指针指向函数,并通过指针调用该函数4、一维数组和字符串中元素地址的计算方法,以及通过指针引用这些元素5、二维数组中元素的计算方法,以及通过指针数组引用其中元素的方法6、通过命令行方式调用main函数7、内存的动态分配和释放8.1 指针的基本概念如果在程序中定义了一个变量,在编译时就给这个变量分配内存单元。

系统根据程序中定义的变量类型,分配一定长度的空间。

内存区的每一个字节有—个编号,这就是“地址”,它相当于旅馆中的房间号。

在程序中一般是通过变量名来对内存单元进行存取操作的。

程序经过编译以后己经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。

按变量地址存取变量值的方式称为“直接访问”方式。

还可以采用另一种称之为“间接访问”的方式,将变量i的地址存放在另一个变量中。

按C 语言的规定,可以在程序中定义整型变量、实型变量、字符变量等,也可以定义这样一种特殊的变量,它是存放地址的。

假设我们定义了一个变量i_pointer,用来存放整型变量的地址,它被分配为3010、3011字节。

可以通过下面语句将i的地址(2000)存放到i_pointer中。

i_pointer = &i;这时,i_pointer的值就是2000,即变量i所占用单元的起始地址。

要存取变量i的值,也可以采用间接方式;先找到存放“i的地址”的变量,从中取出i的地址(2000),然后到2000、2001字节取出i的值(3)。

所谓“指向”就是通过地址来体现的。

i_pointer中的值为2000,它是变量i的地址,这样就在i_pointer和变量i之间建立起一种联系,即通过i_pointer能知道i的地址,从而找到变量i的内存单元。

在C语言中,将地址形象化地称为“指针”。

意思是通过它能找到以它为地址的内存单元(例如根据地址2000就能找到变量i的存储单元,从而读取其中的值)。

一个变量的地址称为该变量的“指针”。

例如,地址2000是变量i的指针。

如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。

指针变量的值(即指针变量中存放的值)是指针(地址)。

8.2 指针变量变量的指针就是变量的地址。

存放变量地址的变量是指针变量,用来指向另一个变量。

为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号表示“指向”。

- 93 -《C语言程序设计》8.2.1 指针变量的定义C语言规定所有变量在使用前必须定义,指定其类型,并按此分配内存单元。

指针变量不同于整型变量和其他类型的变量,它是用来专门存放地址的。

必须将它定义为“指针类型”。

先看一个具体例子:int a, b;int c1, c2;第1行定义了两个整型变量a和b,第2行定义了两个指针变量: c1和c2,它们是指向整型变量的指针变量。

左端的int是在定义指针变量时必须指定的“基类型”。

指针变量的基类型用来指定该指针变量可以指向的变量的类型。

定义指针变量的一般形式为:基类型*指针变量名在定义指针变量时要注意两点:1、指针变量前面的“*”,表示该变量的类型为指针型变量。

注意:指针变量名足c1、c2,而不是*c1、*c2。

2、在定义指针变量时必须指定基类型。

一个指针变量只能指向同—个类型的变量。

8.2.2 指针变量的赋值可用运算符“&”求变量的地址。

可以用赋值语句使一个指针变量指向一个变量,例如:a1=&x;b2=&y;也可以在定义指针变量的同时对其赋值,例如:int x=3,y=4,*c1=&i,*c2=&j;等价于int x,y,*c1,*c2;x=3;y=4;c1=&x;c2=&y;在定义指针变量时应注意:1、在定义指针变量时,指针变量的值是随机的,不能确定它具体的指向,必须为某赋值,才有意义。

2、指针变量的类型必须与其存放的变量类型一致,即只有变量的地址才能放到指向整型变量的指针变量中。

8.2.3指针的两个运算符在C语言中有两个关于指针的运算符:&-------取地址运算符;*--------指针运算符取地址运算符“&”可以加在变量和数组元素的前面,其意义是取出变量或数组元素的地址。

- 94 -第八章指针因为指针变量也是变量,所以取地址运算符也可以加在指针变量的前面,其含义是取出指针变量的地址。

【例8.1】输入a和b两个整数,按先大后小的顺序输出a和b。

main ( ){int *c1,*c2,*c,x,y;scanf(“%d,%d”,&x,&y);cl = &x;c2 = &y;if(x<y){c = cl;cl = c2;c2 = c;}printf(“\nx = %d,y = %d\n\n”,x,y);printf(“max = %d,min = %d\n”,*cl,*c2);}运行情况如下:5,9x = 5,y = 9max = 9,min = 5当输入x=5,b=9时,由于x<b,将c1和c2交换。

但x和y并未交换,它们仍保持原值,但c1和c2的值改变了。

cl的值原为&x,后来变成&y,c2原值为&y,后来变成&x。

这样在输出*cl和*c2时,实际上是输出变量y和x的值,所以先输出9,然后输出5。

指针运算符“*”可以加在指针或指针变量的前面,其意义是指针或指针变量所指向的内存单元。

8.2.4 指针变量的引用指针变量中只能存放地址(指针).不要将一个整型量(或任何其他非地址类型的数据)赋给一个指针变量。

a_1= 100;(a_1为指针变量,100为整数)有两个有关的运算符:1、&:取地址运算符。

2、*:指针运算符(或称“间接访问”运算符)。

&x为变量x的地址,*c为指针变量c所指向的存储单元。

例如:通过指针变量访问整型变量。

main ( ){int x,y;int *a_1,*a_2;x = 100;y = 10;a_1 = &x;a_2 = &y;printf(“%d,%d\n”,x,y);printf(“%d,%d\n”,*a_1,*a_2);}运行结果为:100,10100,10【说明】- 95 -《C语言程序设计》1、在开头处虽然定义了两个指针变量a_l和a_2,但它们并未指向任何一个整型变量。

只是提供两个指针变量,规定它们可以指向整型变量。

2、最后一行的*a_1和*a_2就是变量x和y。

3、程序中有两处出现*a_1和*a_2,它们有不同的含义。

程序第3行的*a_l和*a_2表示定义两个指针变量a_1、a_2。

它们前面的“*”只是表示该变量是指针变量。

程序最后—行printf函数中的*a_1和*a_2则代表变量。

4、第5、6行“a_1=&x;”和“a_2=&y;”是将x和y的地址分别赋给a_1和a_2。

注意不应写成:“*a_1= &x;”和“a_2 = &y;”。

8.2.5 将指针变量作为参数时的传递函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。

它的作用是将一个变量的地址传送到另一个函数中。

【例8.2】输入a和b两个整数,按先大后小的顺序输出a和b。

swap(int *cl,int *c2){ int temp;temp = *c1;*cl = *c2;*c2 = t;}main ( ){int x,y;int *a_1,*a_2;scanf(“%d,%d”,&x,&y);a_1 = &x;a_2 =&y;if(x<y)swap (a_1,a_2);printf(“\n%d,%d\n”,x,y);)运行结果:5,99,5对程序的说明:swap是用户定义的函数,它的作用是交换两个变量(x和y)的值。

swap函数的两个形参c1、c2是指针变量。

程序运行时,先执行main函数,输入x和y的值(今输入5和9)。

然后将x和y的地址分别赋给指针变量a_1和a_2,使a_1指向x,a_2指向y。

接着执行if语句,由于x < y,因此执行swap函数。

在函数调用时,将实参变量的值传送给形参变量。

采取的依然是“值传递”方式。

因此虚实结合后形参c1的值为&x,c2请注意交换*cl和*c2的值是如何实现的。

如果写成以下这样就有问题了:swap(int *c1,int *c2){int *temp;*temp = *c1;*c1 =*c2;*c2=*temp;}- 96 -第八章指针*c1就是x,是整型变量。

而*temp是指针变量temp所指向的变量。

但temp中并无确定的地址值,它的值是不可预见的。

*temp所指向的单元也是不可预见的。

因此,对*temp赋值可能会破坏系统的正常工作状况。

可以看到,在执行swap函数后,变量x和y的值改变了。

swap(int a,int b){int temp;temp = a;a = b;b = temp;}在函数调用时,x的值传送给a,y的值传送给b。

执行完swap函数后,a和b的值是互换了,但main函数中的x和y并未互换。

也就是说由于“单向传送”的“值传递”方式,形参值的改变无法传给实参。

如果想通过函数调用得到n个要改变的值,可以:(1)在主调函数中设n个变量,用n个指针变量指向它们;(2)然后将指针变量作实参,将这n个变量的地址传给所调用的函数的形参;(3)通过形参指针变量,改变该n个变量的值;(4)主调函数中就可以使用这些改变了值的变量。

请注意,不能企图通过改变指针形参的值而使指针实参的值改变。

swap(int *cl,int *c2){int *c;c = cl;c1= c2;c2= c;}main( ){int x,y;int *a_1,*a_2;scanf(“%d,%d”,&x,&y);a_1 = &x;a_2 = &y;if(x<y)swap(a_1,a_2);printf(“\n %d,%d\n”,*a_l,*a_2);}此程序的意图是:交换a_1和a_2的值,使a_1指向值大的变量。

但是这是办不到的,程序实际输出为“5,9”。

C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。

指针变量作函数参数也要遵循这—规则。

调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。

【例8.3】输入a、b、c3个整数,按大小顺序输出。

swap(int *pc1,int *pc2){ int temp;temp =* pcl;*pt1 =*pc2;*pc2 = temp;- 97 -《C语言程序设计》- 98 -}exchange(int *al,int *a2,int *a3){ if(*al<*a2)swap(al,a2);if(*al<*a3)swap(al,a3);if(*a2<*a3)swap(a2,a3);}main ( ){int x,y,z,*p1,*p2,*p3;scanf(“%d,%d,%d”,&x,&y,&z);pl = &a;p2=&y;p3 = &z;exchange(p1,p2,p3);printf(“\n%d,%d,%d\n”,x,y,z);}运行结果:9,0,1010,9,08.3 数组与指针一个变量有地址,—个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。

相关文档
最新文档