第八章 指针

第八章指针【本章要求】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 数组与指针一个变量有地址,—个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。

合集下载

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章练习题--指针

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语言程序设计
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.指针


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