专题7 数组和指针的应用

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

例1. 写出结果: main() { int *p1, a[10]={1,2,3,4,5,6,7,8,9,10} ; p1=a; printf(“%d ”,*p1); printf(“%d ”,*p1++); printf(“%d ”, *(p1+3)); printf(“%d ”,*++p1); printf(“%d ”,(*p1)++); printf(“%d ”,*p1--); printf(“%d ”,*p1); } 例2.若有定义语句:double x[5]={1.0,2.0,3.0,4.0,5.0},*p=x;则错误引用x数 组元素的是[08年9月] A)*p B)x[5] C)*(p+1) D)*x
[C] D) aa+1
(3)通过指针变量来表示数组中各元素的地址
可以定义一个指针变量来存放数组的指针或数组元素的指针,且指针变 量的基类型就是定义数组时的类型 int *p,a[10]; for(p=a,k=0; k<10;k++) p++; 将数据写入数组元素中几种方式: (1)for(p=a,k=0; k<10;k++) { scanf(“%d”,p); p++; } 进一步简化: (2)for(p=a,k=0; k<10;k++) scanf(“%d”,p++); 再进一步简化: (3)for(p=a,p-a<10; p++) scanf(“%d”,p); 以上三种写法是等价的,要掌握,能看懂。
2、 通过指针变量来引用一维数组元素 当指针变量指向数组中的某个数组元素时,可以通过“*”来访问其所 指向变量的数据。
for(p=a,k=0;k<10;k++) printf(“%d”,*(p+k)); 如果*(p+k)改写成*p+k,又会怎样?其含义相同吗? 以上语句等价与: for(k=0;k<10;k++) printf(“%4d”,a[k]); 同时也可以通过逐步移动指针来引用数组中的每个元素,逐个输出a数 组元素中的值 for(p=a,k=0;k<10;k++) { printf(“%4d”,*p); p++; }
3.以下程序的输出结果是_____[08年9月] #include<stdio.h> main() { int j,a[]={1,3,5,7,9,11,13,15},*p=a+5; for(j=3;j;j--) { switch(j) { case 1: case 2:printf("%d",*p++); break; case 3:printf("%d",*(--p)); } } }
程序运行后的输出结果是 A)16 B)10 C)8 D)6
第3个知识点 指针的算术运算符
(1)指针有四个算术运算符 “+ - ++ --”
(2)移动指针:p++,p--,++p,--p,指针向前或前或移动一个数组元素。
(4)计算地址:p+n 或p-n, n是一个整数,p+n代表地址计算:p1+c*n;表示p 下面的第n个元素的地址,c表示类型符所占的字节,若c为字符型则c=1,若为 整型则c=2。 (5)++和*、&处于同一级别,结合性自右向左 (*pointer_1)++相当与a++;要区分开*pointer_1++,其等价与* (pointer_1++) (6)取内容:*(p++) *(++p) *(p--) (*p)++ ++(*p) (*p)-*(--p) (注:++, -- 会移动指针) --(*p)
(c)int a[10]={1,2,3,4,5,6,7,8,9,10}; for(i=0;i<10;i++) printf(“%d”,*&a[i]); //该程序段实现将数组元素的值以整型数据形式输出
(2)通过数组名表示各个数组元素的地址
虽然数组名中的内容不能改变,但是可以通过加一个整数来表达数组 中不同数组元素的地址
总结:在一维数组中: 1、p+i和a+i就是a[i]的地址,他们指向a数组的第i个元素 2、*(p+i)和 *(a+i)是p+i和a+i所指向的数组元素 3、指向数组的指针变量可以带下标。即p[i]==*(p+i) 例.有以下程序[B] main(){ int x[8]={8,7,6,5,0,0},*s; s=x+3; printf("%d\n",s[2]); } 执行后输出结果是 A)随机值 B)0 C)5
7.设有如下程序段 [08年4月] char s[20]= "Bejing",*p; p=s; 则执行p=s;语句后,以下叙述正确的是 A)可以用*p表示s[0] B)s数组中元素的个数和p所指字符串长度相等 C)s和p都是指针变量 D)数组s中的内容和指针变量p中的内容相等
8.有以下程序[09年3月] #include<stdio.h> main() { char *s={"ABC"}; do{ printf("%d",*s%10); s++; }while(*s); } 注意:字母A的ASCII码值为65.程序运行后的输出结果是 A)5670 B)656667 C)567 D)ABC
a a[0] a[1] a[2] 1 9 3 5 7 5 11 13 15
a[1]
7 9 11 13 15
17 19 21 23
ห้องสมุดไป่ตู้
a[2]
17
19 21 23
2、二维数组中的数组元素的地址
因为在二维数组中,a[i]代表某个一维数组的数组名,因此其代表的是一个不 可变的地址常量,其值是每一行中的第一个元素的地址。等价与&a[i][0].因此对于 该一维数组中其他元素的地址,可以用a[i]加相关的整数来获的 对于右边的数组,要获的其中某个元素的地址,通常可以通过&a[i][j] 来表示,但是也可以用a[i]来表示。 如:对于a[1]代表的各数组元素可表示为如下: a[1][0]的地址表示为:a[1]+0 a[1][1]的地址表示为:a[1]+1 a[1][2]的地址表示为:a[1]+2 a[1][3]的地址表示为:a[1]+3
9.若有以下定义[09年3月] int x[10],*pt=x; 则对x数组元素的正确引用是 A)*&x[10] B)*(x+3) C)*(pt+10)
D)pt+3
3、用带下标的指针变量引用一维数组 int p,s[10],i; p=s; for(k=0;k<10;k++) printf(“%d”,p[i]);////p[i]等价与*(p+i)
(1) int a[10]; for (k=0;k<10;k++) scanf(“%d”,a+k); //给每个元素赋值 (2) int a[10]; for (k=0;k<10;k++) printf(“%d”,*(a+k)); //将每个元素输出
题目:若有定义:int aa[ 8]; 则以下表达式中不能代表数组元aa[1]的地址的是 A) &aa[0]+1 B) &aa[1] C) &aa[0]++
因为一个数组包含若干个元素,且每个元素在内存中占有相同字节 数的存储单元。即实际上也是变量,所以数组元素也有地址。
1.2 表示一维数组各个元素地址的几种方式 (1) 通过数组元素名表示各个数组元素的地址(最熟悉的方式) 表示方式:&a[i] //a[i]其实就是数组中第i个元素的变量名;
(a)int a[10]; for(i=0;i<10;i++) printf(“%d”,&a[i]); //scanf(“%d”,&a[i]); //该程序段实现将数组元素的每个地址以整型数据形式输出 (b)int a[10]={1,2,3,4,5,6,7,8,9,10}; for(i=0;i<10;i++) printf(“%d”,a[i]); //该程序段实现将数组元素的值以整型数据形式输出
例1.有如下说明 int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则数值为9的表达式是 A)*p+9 B) *(p+8) C C)*p+=9 D) p+8
例2、有以下程序 main(){ int a[10]={1,2,3,4,5,6,7,8,9,10}, *p=&a[3], *q=p+2; printf("%d\n", *p + *q); } B
专题七
数组和指针的应用
1. 一维数组和指针
第一个知识点 1.1 基本概念: (1)数组的指针:数组的起始地址 C语言规定数组名代表数组的首地址,即数组中第一个元素的地址。 通常将数组名看作是一个指针常量,即,不能去改变数组名的值。 如:int a[10], *p, x; a=&x (×); 或者是 a++(a=a+1)(×); scanf(“%d”,a);(×) // 以上操作都是非法的,因为数组名是一个地址常量 (2)数组元素的指针:是指每个数组元素的地址(&a[i]) 一维数组中数组元素的的地址及其表示方式
1 3
5 7 9 11 13 15
17
19 21 23
这里的a[i]+1为一个数组元素所占的字节数(数组元素的基本类型),即 理解成移动一个存储单元(一个数组元素),+2表示移动两个存储单元。 依次类推。 如:int a[3][4],*p;
p=a[i]; //该赋值是合法的,4>i>=0
练习 1.设有如下程序的输出结果是: main() { int x[5]={2,4,6,8,10}, *p1, **p2; p1=x; p2=&p1; printf(“%d”,*(p1++)); printf(“%d”,**p2); } A)4 4 B)2 4 C)2 2 D) 4 6 2 、下列程序的输出结果是[C] A) 非法 B)a[4]的地址 C)5 D)3 main() { char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5; printf(“%d”,*--p); }
D)6
练习 1、有以下程序[C] main() { int a[]={2,4,6,8,10}, y=0, x, *p; p=&a[1]; for(x=1;x<3;x++) y+=p[x]; printf(“%d\n”,y); } 程序运行后的输出结果是 A)10 B)11 C)14 D)15
2. 二维数组和数组元素的地址 1、二维数组的地址
第二知识点 (1)
通过指针来操作数组中的元素的几种表示方式
通过数组的首地址引用数组元素
int a[10]; 思考: (1) *(a+0) 表示什么意思 ? *(a+1)?? „.*(a+i)?? 实例: for(i=0;i<10; i++) printf(“%4d”,*(a+i)); 其相当于: for(i=0;i<10; i++) printf(“%4d”,a[i]); //通过引用下标实现 (2)*a+1表示什么意思 ??„*a+i??
若有定义:
int *p,a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 说明:a是一个数组名,它包含三个元素:a[0]、a[1]、a[2]。而每个元素又是一 个一维数组,它包含4个元素。可用a[0][0]、a[0][1]、a[0][2]等来引用a[0]中的 a 每个元素,其他依次类推 1 a[0] 3
4.有以下程序[07年4月] main() {char ch[]="uvwxyz",*pc; pc=ch; printf("%c\n",*(pc+5)); } 程序运行后的输出结果是(A) A)z B)0 C)元素ch[5]的地址
D)字符y的地址
5.设有定义:char p[]={'1', '2', '3'},*q=p; ,以下不能计算出一个 char型数据所占字节数的表达式是[07年9月] A) sizeof(p) B)sizeof(char) C)sizeof(* q) D)sizeof(p[0]) 6.有以下程序 [08年4月] #include <stdio.h> main() { int a[ ]={1,2,3,4},y,*p=&a[3]; --p; y=*p; printf("y=%d\n",y); } 程序的运行结果是 A)y=0 B)y=1 C)y=2 D)y=3
相关文档
最新文档