C语言程序设计第45讲 指向一维数组的指针变量
C语言程序设计基础教程 7.5、使用指针访问一维数组中的元素

学号
89
90
77
…
科 目
0 1
73 45
90 80
33 87
定义一个数组,需要系统提供连续的内存空间来存储数组中的各个元素,如果把数组的 地址赋值给指针变量,就可以通过指针变量来引用数组中的元素。
使用指针访问一维数组中的元素
C语言
使用指针引用一维数组元素 本次任务
利用指针输出数组中的元素
循环体内部的输出语句等价于
“printf("%5d",a[i]);”。 指向同一个数组的两个指针可以做减法或者比 较运算 C语言的指针变量对数组是不做越界检查的。 在循环输出数组元素之前,也要记得初始化指 针p 利用指针而非数组元素下标输出数组元素效率 更高
使用指针访问一维数组中的元素
C语言
指向数组的指针
一个数组存储在一块连续内存单元中;数组名就是这块连续内存单元的首地址;如 果将数组的首地址赋值给一个指针变量,那么该指针变量就指向了这个一维数组
第 (i + 1) 个数组元素的地址可表示为 &a[i] 或 (p+i)。
一个指针变量可以指向一个数组元素
并不是一个指针变量,而是一个指针常量。也就是说,
不可以试图更改数组名a的值。所以,如果我们写语句 “p++;”是合法的,表示指针p指向了数组的下一个元素。
但写“a++;”则不合法。
使用指针访问一维数组中的元素
C语言
任务实现
#include "stdio.h" void main() //主函数 { int a[10]={1,3,5,7,9,11,13,15,17,19}; int *p; int i; p=a; //定义指针变量p指向数组a printf("数组a中的元素为:\n"); for(i=0;i<10;i++)//利用指针p依次输出数组a的元素 { printf("%5d",*p); p++; } }
一维数组和指针变量

地址的内存单元就对应程序
pointer
中的变量,这类特殊的变量 在C中称指针变量。可见, pointer是指针变量,2000是
图5-1-1
pointer指针变量的值
5.1指针的概念和定义
5.1.2 指针的定义及初始化: 指针:就是地址,一个变量的 地址 变量 指针就是该变量的地址。 ... 编号 名字 指针变量:专门存放地址的一 2000 ××× 类特殊的变量。
内存用户数据区
5.2 指针运算
关于指针的两个运算符
1. 取地址运算符:& 2. 指向运算符:
*
&x:
( x 可以是任何类型的变量 ) 含义:取变量x的地址。 ( p 只能是指针变量 )
*p:
例:
应当注意的是,在变 量说明语句中的“*” 号意味着“指向…… 的指针”,而在表达 式语句中的“*”号是 表示“间接”存取变 量的值。
j
中存放的值,找到最终要访问的变量。
3010
2000 ...
i _ pointer
例: scanf(“%d”, i_pointer);
在现有的微机系统中指针变量一般占4个字节。
指针变量在使用前必须指向某个具体的内存单元,没
有具体指向的指针变量叫悬空指针,使用是非法的。 定义指针并将其初始化为0是一个值得提倡的好习惯。
执行以上变量赋值语句后, i_pointer 就指向 了变量 i 代表的内存单元。5.1指针的概念和定义Fra bibliotek5.1.3
指针的赋值就是让指针变量指向某个 具体的内存单元。一般有2种方式给 指针的赋值(续): 指针变量赋值:
p1 &p1 p2=p1; p2 &p2 &i &i &i i 123
C语言程序设计第45讲 指向一维数组的指针变量

假设pt指向了一维数组a,那么C语言规定指针对数组的
表示方法有如下几种。 ⑵*(pt+n)和*(a+n)表示pt+n或a+n指 向的数组元素值,即等效于a[n]。
*(pt+0) *(pt+1) *(pt+2)
数组a
a[0] a[1] a[2]
……
*(a+0) *(a+1) *(a+2)
• 在编译时,对数组元素a[i]就是处
C Programming Language
小结
(1)指针对数组的表示方法。
①下标法:即a[i]的形式。
②地址法:*(a+i)。其中a是数组名。
③指针法:即*(pt+i)或pt[i]。其中pt是指向数组a的 指针变量。 (2)指向数组的指针作为函数参数传递的用法。
#include <stdio.h> main() { int i,a[10],*pt=a,max; printf("please input array a:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); max=sub_max(pt,10); printf("max=%d\n",max); }
C Programming Language
上述程序也可采用指针变量作sub_max函数的形式参数。 main() { int i,a[10],*pt=a,max; printf("please input array a:\n"); for(i=0;i<10;i++) int sub_max(int *b,int n) scanf("%d",&a[i]); { max=sub_max(pt,10); int temp,i; printf("max=%d\n",max); temp=b[0]; /*b[i]等价于*(b+i)*/ } for(i=1;i<n;i++) if(temp<b[i]) temp=b[i]; return temp;
一维数组与指针

指 针1、 概述1.1 地址和指针的概念如果在C 语言中定义一个变量,系统会自动的给它存储空间。
比如:int a,b,c;系统会自动的给a,b,c 分别分配2个字节的空间,内存中的表示如下图:这样以来,就建立了变量和地址的对应关系。
如果产生赋值行为,比如:a=1,b=3;,存储图如下:如果产生具体的操作,比如:c=a+b ,具体的过程如下: 第一步:从2001-2002字节空间取出1; 第二步:从2003-2004字节空间中取出3;第三步:将1和3相加后的结果4存入变量C 所指向的地址空间(2005-2006),图例如下:ab cab c以上的程序,在C 语言中称为“直接访问”。
既然有“直接访问”,肯定会存在“间接访问”,举例如下:张三出差,住宾馆,房间号码为1001,从携带钥匙的方式上来看,有两种方式: 1、 钥匙自己带(直接方式);2、 钥匙放在总台上,要开门,先到总台拿钥匙,而后开门(间接方式) 以上是生活中的例子,那么,在C 程序中,如何表示这种“间接方式”呢? 第一步:定义一个普通的变量并赋值(int a=3;)第二步:定义一种变量,用来存储变量a 的地址(a_pointer );第三步:建立该变量和普通变量之间的联系,将变量a 的地址存储到a_pointer 中。
第四步:通过该变量(a_pointer )来访问a;程序如下:b c一种示意图:以上的图形象的表示了一种“指向关系”。
“*”,表示指向。
在C 语言中,一个变量的地址被称为该变量的“指针”,存储该变量地址的“东东”,称为指针变量。
故,指针是一个地址,而指针变量是存放该地址的变量,它用来指向“指针”所表示的地址。
1.2 指针变量的定义和使用定义格式:数据类型(基本型) *指针变量比如:int *pointer_1;指针变量是pointer_1,而不是*pointer_1; 有了以上的定义,pointer_1是我们定义的指针变量,*pointer_1是具体的内容。
国家开放大学电大《C语言程序设计》期末考试及答案参考

[试题分类]:C语言程序设计1.下列关于C语言中main函数位置的叙述中,正确的是A. 必须在程序的最后B. 必须在程序的开始处C. 可以在程序中的任意位置D. 必须在系统调用的库函数后面答案:C题型:单选题知识点:第2章 C语言概述难度:12.下列选项中,不能作为C语言标识符是A. _xB. intC. a_1D. ab1exe答案:B题型:单选题知识点:第2章 C语言概述难度:13.若有定义“int i; float f; double d;”,则表达式“10+d+i*f”的数据类型为A. intB. floatC. doubleD. 不确定答案:C题型:单选题知识点:第3章数据类型与运算规则难度:14.判断char型变量c是否为小写字母的正确表达式为A. 'a'<=c<='z'B. (c>=a)&&(c<=z)C. ('a'>=c)('z'<=c)D. (c>='a')&&(c<='z')答案:D题型:单选题知识点:第3章数据类型与运算规则难度:15.若有定义“int x=11;”,则表达式“(x++*1/3) ”的值是A. 12B. 11C. 4D. 3答案:D题型:单选题知识点:第3章数据类型与运算规则难度:26.若有定义“int a=1,b=2,c=3,d=4;”,则表达式“a<b?a:c<d?c:d”的值是A. 1B. 2C. 3D. 4答案:A题型:单选题知识点:第3章数据类型与运算规则难度:27.若有定义“int a=1, b=0, c=0, x=35;”,则执行下列程序段后,变量x的值是if(!a) x--; else if(b);if(c) x=3; else x=4;A. 3B. 4C. 34D. 35答案:B题型:单选题知识点:第5章选择结构的程序设计难度:28.{若有定义“int x=1,y=1,m=1,n=1;”,则执行下列语句后,变量x和y的值分别是 switch (m) \{case 0: x=x*2;case 1:switch (n) \{case 1: x=x*2;case 2: y=y*2; break;case 3: x++;\}case 2: x++; y++;case 3: x*=2; y*=2; break;default: x++;y++;\}}A. x=2,y=1B. x=2,y=2C. x=6,y=6D. x=7,y=7答案:C题型:单选题知识点:第5章选择结构的程序设计难度:29.若有定义“int i,j;”,执行语句“for (i=0,j=1; i<=j+1; i+=2,j--) printf ("%d",i);”时的循环次数是A. 3B. 2C. 1D. 0答案:C题型:单选题知识点:第6章循环结构的程序设计难度:210.若有定义“int n=4;”,则执行语句“while(n--) printf("%d",n--);”后的输出结果是A. 20B. 31C. 210D. 321答案:B题型:单选题知识点:第6章循环结构的程序设计难度:211.{若有定义“int x=3;”,则执行下列语句后的输出结果是do \{printf("%d ",x+=1);\} while(--x);}A. 4B. 4 4C. 4 4 4D. 死循环答案:D题型:单选题知识点:第6章循环结构的程序设计难度:212.若有定义“char a[]="xyz",b[]={'x','y','z'};”,则下列叙述中正确的是A. 数组a的长度大于数组b的长度B. 数组a的长度小于数组b的长度C. 数组a和数组b的长度相同D. 数组a和数组b等价答案:A题型:单选题知识点:第7章数组难度:113.{若有定义“int aa[4][4]=\{\{1,2,3,4\},\{5,6,7,8\},\{3,9,10,2\},\{4,2,9,6\}\}, i,s=0;”,则执行下列语句后,变量s的值是for(i=0;i<4;i++) s+=aa[i][0];}A. 20B. 19C. 13D. 11答案:C题型:单选题知识点:第7章数组难度:214.调用函数时,若实参是一个数组名,则向函数传送的是A. 数组的长度B. 数组的首地址C. 数组每一个元素的地址D. 数组每个元素中的值答案:B题型:单选题知识点:第8章函数难度:115.下列各函数首部中,正确的是A. void play(var :Integer,var b:Integer)B. void play(int a,b)C. Sub play(a as integer,b as integer)D. void play(int a,int b)答案:D题型:单选题知识点:第8章函数难度:116.若有定义“int n=2,*p=&n,*q=p; ”,则下列选项中,非法的赋值语句是A. p=n;B. p=q;C. n=*q;D. *p=*q;答案:A题型:单选题知识点:第9章指针难度:217.若有定义“int *p[3]; ”,则下列叙述中正确的是A. 定义了一个类型为int的指针变量p,该变量具有三个指针B. 定义了一个名为*p的整型数组,该数组含有三个int类型元素C. 定义了一个指向一维数组的指针变量p,该一维数组应具有三个int类型元素D. 定义了一个指针数组p,该数组含有三个元素,各元素都是基类型为int的指针答案:D题型:单选题知识点:第9章指针难度:218.下列对枚举类型名的定义中正确的是A. enum a={one,two,three};B. enum a {one=9,two=-1,three};C. enum a={"one", "two", "three"};D. enum a{"one", "two", "three"};答案:B题型:单选题知识点:第10章结构、联合与枚举类型难度:219.{若有如下定义:struct student\{int num; int age;\} stu[3]=\{\{1001,20\} , \{1002,19\} , \{1003,21\}\} , *p=stu;则下列表达式中,值为1002的是}A. p++->numB. (p++)->ageC. (*++p).numD. (*p).num答案:C题型:单选题知识点:第10章结构、联合与枚举类型难度:220.下列选项中,可以作为函数fopen中第一个参数的是A. "c:\\user\\text.txt"B. c:\user\text.txtC. "c:\user\text.txt"D. c:user\text.txt答案:A题型:单选题知识点:第11章文件难度:121.若y是int型变量,则判断y为偶数的关系表达式为__________。
指针数组C程序设计课件

指针数组中的元素可以使用指向指针的指针来引用。例如
int *(*p);
*运算符表示p是一个指针变量,*(*p)表示指向指针的指针, *运算符的结合性是从右到左,因此“intr *(*p);”可写成int **p;
利用指针变量访问另一个变量就是“间接访问”。如果在 一个指针变量中存放一个目标变量的地址,这就是“单级 间址”。指向指针的指针用的是“二级间址”方法。还有 “三级间址”和四级间址,但二级间址应用最为普遍。
指针数组
数组中的元素均为指针变量的数组称为指针数组,一维指 针数组的定义形式为 类型名*数组名[数组长度]; 例如 int *p[4];
指针数组中的数组名也是一个指针变量,该指针变量为指 向指针的指针。 例如
int *p[4];
int a=1;
*p[0]=&a; p是一个指针数组,它的每一个元素是一个指针型数据(其 值为地址),指针数组pቤተ መጻሕፍቲ ባይዱ第一个值是变量a的地址。
【C语言】-指向一维数组元素的指针

【C语⾔】-指向⼀维数组元素的指针本⽂⽬录说明:这个C语⾔专题,是学习iOS开发的前奏。
也为了让有⾯向对象语⾔开发经验的程序员,能够快速上⼿C语⾔。
如果你还没有编程经验,或者对C语⾔、iOS开发不感兴趣,请忽略前⾯我们已经学习了指针,如果指针存储了某个变量的地址,我们就可以说指针指向这个变量。
数组及其数组元素都占有存储空间,都有⾃⼰的地址,因此指针变量可以指向整个数组,也可以指向数组元素。
⼀、⽤指针指向⼀维数组的元素1// 定义⼀个int类型的数组2int a[2];34// 定义⼀个int类型的指针5int *p;67// 让指针指向数组的第0个元素8 p = &a[0];910// 修改所指向元素的值11 *p = 10;1213// 打印第⼀个元素的值14 printf("a[0] = %d", a[0]);输出结果:,说明已经通过指针间接修改了数组元素的值,跟指向⼀个普通int类型变量是⼀样的。
由于数组名代表着数组的⾸地址,即a == &a[0],因此第8⾏代码等价于:// 让指针指向数组的第0个元素p = a;内存分析图如下,⼀个指针变量占⽤2个字节,⼀个int类型的数组元素占⽤2个字节⼆、⽤指针遍历数组元素1.最普通的遍历⽅式是⽤数组下标来遍历元素1// 定义⼀个int类型的数组2int a[4] = {1, 2, 3, 4};34int i;5for (i = 0; i < 4; i++) {6 printf("a[%d] = %d \n", i, a[i]);7 }输出结果:2.接下来我们⽤指针来遍历数组元素先定义⼀个指针,指向数组的第⼀个元素// 定义⼀个int类型的数组int a[4] = {1, 2, 3, 4};// 定义⼀个int类型的指针,并指向数组的第0个元素int *p = a;p的值是a[0]的地址,因此,现在我们利⽤指针p只能访问数组的第0个元素a[0],⽤*p就可取出a[0]的值1。
年国家开放大学电大《C语言程序设计》期末考试及答案参考

年国家开放大学电大《C语言程序设计》期末考试及答案参考[试题分类]:C语言程序设计1.下列关于 C语言中 main 函数位置的叙述中,正确的是 A.必须在程序的最后 B.必须在程序的开始处 C.可以在程序中的任意位置 D.必须在系统调用的库函数后面答案:C 题型:单选题知识点:第 2章C 语言概述难度:12.下列选项中,不能作为 C语言标识符是 A.__ B.int C.a_1 D.ab1e_e 答案:B 题型:单选题知识点:第 2章C 语言概述难度:13.若有定义“int i; float f; double d;”,则表达式“10+d+i_f”的数据类型为 A.int B.float C.double D.不确定答案:C 题型:单选题知识点:第 3章数据类型与运算规则难度:14.判断 char型变量 c 是否为小写字母的正确表达式为 A."a"<=c<="z" B.(c>=a)&;&;(c<=z) C.("a">=c)("z"<=c) D.(c>="a")&;&;(c<="z") 答案:D 题型:单选题知识点:第3章数据类型与运算规则难度:15.若有定义“int _=11;”,则表达式“(_++_1/3) ”的值是 A.12 B.11 C.4 D.3 答案:D 题型:单选题知识点:第 3章数据类型与运算规则难度:26.若有定义“int a=1,b=2,c=3,d=4;”,则表达式“a<b?a:c<d?c:d”的值是 A.1 B.2 C.3 D.4 答案:A 题型:单选题知识点:第 3章数据类型与运算规则难度:27.若有定义“int a=1, b=0, c=0, _=35;”,则执行下列程序段后,变量 _的值是if(!a) _--;else if(b);if(c) _=3;else _=4; A.3 B.4 C.34 D.35 答案:B 题型:单选题知识点:第 5章选择结构的程序设计难度:28.{ 若有定义“int _=1,y=1,m=1,n=1;”,则执行下列语句后,变量 _和 y的值分别是switch (m) \{case 0: _=__2;case 1:switch (n) \{case 1: _=__2;case 2: y=y_2; break;case 3: _++;\}case 2: _++; y++;case 3: __=2; y_=2; break;default: _++;y++;\} } A._=2,y=1 B._=2,y=2 C._=6,y=6 D._=7,y=7 答案:C题型:单选题知识点:第 5章选择结构的程序设计难度:29.若有定义“int i,j;”,执行语句“for (i=0,j=1; i<=j+1; i+=2,j--) printf (“%d”,i);”时的循环次数是 A.3 B.2 C.1 D.0 答案:C 题型:单选题知识点:第 6章循环结构的程序设计难度:210.若有定义“int n=4;”,则执行语句“while(n--)printf(“%d”,n--);”后的输出结果是 A.20 B.31 C.210 D.321 答案:B 题型:单选题知识点:第 6章循环结构的程序设计难度:211.{ 若有定义“int _=3;”,则执行下列语句后的输出结果是do \{printf(“%d ”,_+=1);\} while(--_); }A.4 B.4 4 4 D.死循环答案:D 题型:单选题知识点:第 6章循环结构的程序设计难度:212.若有定义“char a[]=“_yz”,b[]={"_","y","z"};”,则下列叙述中正确的是 A.数组 a 的长度大于数组 b 的长度 B.数组 a 的长度小于数组 b 的长度 C.数组 a 和数组 b 的长度相同 D.数组 a 和数组 b 等价答案:A 题型:单选题知识点:第7章数组难度:113.{ 若有定义“intaa[4][4]=\{\{1,2,3,4\},\{5,6,7,8\},\{3,9,10,2\},\{4,2,9,6 \}\}, i,s=0;”,则执行下列语句后,变量 s 的值是for(i=0;i<4;i++)s+=aa[i][0];} A.20 B.19 C.11 答案:C 题型:单选题知识点:第 7章数组难度:214.调用函数时,若实参是一个数组名,则向函数传送的是 A.数组的长度 B.数组的首地址 C.数组每一个元素的地址 D.数组每个元素中的值答案:B 题型:单选题知识点:第 8章函数难度:115.下列各函数首部中,正确的是 A.void play(var :Integer,var b:Integer) B.void play(int a,b) C.Sub play(a as integer,b as integer) D.void play(int a,int b) 答案:D 题型:单选题知识点:第 8章函数难度:116.若有定义“int n=2,_p=&;n,_q=p; ”,则下列选项中,非法的赋值语句是 A.p=n; B.p=q; C.n=_q; D._p=_q; 答案:A 题型:单选题知识点:第 9章指针难度:217.若有定义“int _p[3]; ”,则下列叙述中正确的是 A.定义了一个类型为 int 的指针变量 p,该变量具有三个指针B.定义了一个名为_p的整型数组,该数组含有三个 int 类型元素 C.定义了一个指向一维数组的指针变量 p,该一维数组应具有三个 int 类型元素 D.定义了一个指针数组 p,该数组含有三个元素,各元素都是基类型为 int 的指针答案:D 题型:单选题知识点:第 9章指针难度:218.下列对枚举类型名的定义中正确的是 A.enum a={one,two,three}; B.enum a {one=9,two=-1,three}; C.enum a={“one”, “two”, “three”}; D.enum a{“one”, “two”, “three”}; 答案:B 题型:单选题知识点:第 10章结构、联合与枚举类型难度:219.{ 若有如下定义:struct student\{int num;int age;\}stu[3]=\{\{1001,20\} , \{1002,19\} , \{1003,21\}\} , _p=stu; 则下列表达式中,值为 1002的是 } A.p++->num B.(p++)->age C.(_++p).numD.(_p).num 答案:C 题型:单选题知识点:第 10章结构、联合与枚举类型难度:220.下列选项中,可以作为函数 fopen中第一个参数的是 A.“c:\\user\\te_t.t_t” B.c:\user\te_t.t_t C.“c:\user\te_t.t_t”D.c:user\te_t.t_t 答案:A 题型:单选题知识点:第 11章文件难度:121.若 y是 int型变量,则判断 y 为偶数的关系表达式为__________。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C Programming Language
上述程序也可采用指针变量作sub_max函数的形式参数。 main() { int i,a[10],*pt=a,max; printf("please input array a:\n"); for(i=0;i<10;i++) int sub_max(int *b,int n) scanf("%d",&a[i]); { max=sub_max(pt,10); int temp,i; printf("max=%d\n",max); temp=b[0]; /*b[i]等价于*(b+i)*/ } for(i=1;i<n;i++) if(temp<b[i]) temp=b[i]; return temp;
#include <stdio.h> main() { int i,a[10],*pt=a,max; printf("please input array a:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); max=sub_max(pt,10); printf("max=%d\n",max); }
pa=&a[0];
/*或者 pa=a;*/
• 一个指针变量可以指向一个数组元素 int *ptr,data[10]; ptr=data+3; /*或者ptr=&data[3]*/
C Programming Language
假设pt指向了一维数组a,那么C语言规定指针对数组的
表示方法有如下几种。
⑴pt+n与a+n表示数组元素a[n]的地址,
即&a[n]。 • 若指针变量pt已指向数组中的一个元素, 则pt+1指向同一数组中的下一元素。 • pt+1所代表的地址值是pt+1×d,d是每 个数组元素所占的字节数。
pt+n
数组a
pt
pt+1
a[0] a[1] a[2]
……
a a+1 a+2
pt+2
a[n]
a+n
C Programming Language
理成*(a+i)。
• []在C语言中是“变址运算符”,
即将a[i]按a+i计算出地址,然后 找出该地址单元的值。
*(pt+n)a[n] Nhomakorabea*(a+n)
C Programming Language
假设pt指向了一维数组a,那么C语言规定指针对数组的
表示方法有如下几种。 ⑶指向数组的指针变量也可用数组的下标形式表示为pt[n], 其效果相当于*(pt+n)。
C Programming Language
数组指针作函数参数
• 数组名就是数组的首地址,实参向形参传送数组名实际上
就是传送数组的地址,形参得到该地址后也指向同一数组。
• 指针变量的值也是地址,也可以作为函数的参数进行传递。
C Programming Language
【例2】求一维数组中的最大值,要求求最大值的功能通过 函数实现。
学习目标
(1)掌握指向一维数组的指针的用法。
(2)掌握指向数组的指针作为函数参数传递的用法。
指针与数组
指针与数组的关系十分密切,数组名本身就是一个常量指
针。当定义数组时,其首地址就已确定不再改变。
例如,对于数组arr[10],数组名arr等效于地址&arr[0]。因此,
可以将数组名arr看做一个指针,它永远指向arr[0]。
程序运行结果: 0 1
2
3
4
5
6
7
8
9
C Programming Language
指针变量与自增自减运算符同时出现时的用法
⑴ *p++等价于*(p++)。若p当前指向a数组中的第i个元素, 则*(++p)相当于a[++i],*(p--)相当于a[i--];;*(--p)
相当于a[--i]。
⑵ *(p++) 与 *(++p) 作用不同。若 p 的初值为 a ,则 *(p++) 等 价a[0],*(++p)等价a[1]。 ⑶ (*p)++表示p所指向的元素值加1。
int sub_max(int b[],int n) { int temp,i; temp=b[0]; for(i=1;i<n;i++) if(temp<b[i]) temp=b[i]; return temp; }
程序运行结果: please input array a: 2517684390 max=9
⑵指针变量可以指到数组以后的内存单元,系统并不认为非 法,因此使用指针变量指向数组元素时,要特别注意指针 变量所指向的位置。
C Programming Language
【例1】为数组a赋值后输出数组a的所有元素值。
#include <stdio.h> main() { int *p,i,a[10]; p=a; for(i=0;i<10;i++) *p++=i; /* 等价于*p=i;p++; */ for(i=0;i<10;i++) printf("%6d",*p++); }
程序运行结果: -22 285 1 -24 2282 -20 0 14917 21596 23619
C Programming Language
改正后的程序 main() { int *p,i,a[10]; p=a; for(i=0;i<10;i++) *p++=i; p=a; /*在输出前使p重新指向数组a的首地址*/ for(i=0;i<10;i++) printf("%6d",*p++); }
通过使用指针变量来指向数组中的不同元素,可使程序效 率更高,执行速度更快。
C Programming Language
指向一维数组的指针变量
• 一个数组存储在一块连续内存单元中;数组名就是这块连
续内存单元的首地址; • 第 (i+1) 个数组元素的地址可表示为 &data[i] 或 (data+i) 。 • 可以通过以下方式为指向数组的指针赋值: int *pa,a[10];
假设pt指向了一维数组a,那么C语言规定指针对数组的
表示方法有如下几种。 ⑵*(pt+n)和*(a+n)表示pt+n或a+n指 向的数组元素值,即等效于a[n]。
*(pt+0) *(pt+1) *(pt+2)
数组a
a[0] a[1] a[2]
……
*(a+0) *(a+1) *(a+2)
• 在编译时,对数组元素a[i]就是处
引用一个数组元素的方法:
①下标法:即a[i]的形式。
②地址法:*(a+i)。其中a是数组名。
③指针法:即*(pt+i)或pt[i]。其中pt是指向数组a的指 针变量。
C Programming Language
注意事项
⑴指针变量可以实现本身的值的改变,这一点与数组名不同。
如p++是合法的;而a++是错误的。