一维数组与指针

一维数组与指针
一维数组与指针

指 针

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),图例如下:

a

b c

a

b 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是具体的内容。 从以上程序来看,*pointer_1和i 是一回事。

到此为止,我们已经知道了指针变量的定义,既然变量定义了,就要使用,如何使用呢?

要想使用,必须理解连个运算符号:

●&:取地址运算符

●*:指针运算(也称为“间接访问”运算符),取其指向的内容。

在指针定义和使用过程中的注意点:

通过以上的学习,我们的感觉:真烦!!!当时,随着学习的深入,我们会逐步体会到指针的好处:

●可以使程序简洁、紧凑、高效

●在函数调用后改变有关变量的值

●高效的处理数组和字符串

●动态分配内存

●直接处理地址

●有效的表示复杂的数据结构

●完成文件的操作

1.3 指针变量作为函数的参数

2、数组与指针

2.1 一维数组与指针

在前面的学习过程中,我们再三提到一个概念:数组名代表数组的首地址,比如: Int a[5]={12,34,56,78,11};

数组的数据在内存中的存储结构如下:

有了这张图以后,我们隆重推出一个重要的概念:a=&a[0]

如果我们定义了一个指针变量,并让其和数组a 建立联系,程序如下:

既然数组和指针建立了联系,该如何使用数组呢?

数组的使用,除了前面学过的使用下表法以外,只要数组和指针建立了联系,就可以通过指针的操作来使用数组。

a=&a[0]

a[0] a[1] a[2] a[3] a[4]

C语言规定:

●如果指针变量p指向数组中的一个元素,则p+1指向数组的下一个元素,p-1指向

数组的上一个元素。

●同理,根据p=a,则a+1指向数组的下一个元素,a-1指向数组的上一个元素。

下面,通过例子来说明:

例子:设有一个一维整形数组,有10个元素,请输出全部的原素。

【方法三】指针法:

在以上程序编写方法中:

1、下标法比较直观(大家喜欢);

2、以上三种方法中,方法三的执行效率最高,在方法三中,方法二执行效率最高。

3、注意p是变量,p++、p+=1都是成立的;a是常量,a++(--) 、a+=1是万万不行

的。

特别提醒各位的是,指针在“指来指去”的过程中,当前值是变化的。对此,有可能造成程序的混乱。

例子:输入5个整数给整形数组,然后输出。

以上的程序看起来没有说明错误,但运行结果却是错的,为什么?

原因:经过第一个循环后,指针变量p中存储的已经不是&a[0]了,而是指向了数组的尾端,即p+5,其值不可预料,C在编译的时候不会提示错误,这对于初学者来说,很难发现,提醒大家注意。

2.2 一维数组作为函数的参数

以上的表,可以形成4种组合:

例子:编一个函数,求一数组中最小的元素。

【组合一】实参和形参均为数组名

实战训练

1、输入三个整数,按从大到小的顺序输出(用指针的方法)

2、通过指针操作,找出三个整数中的最小值并输出。

3、调用自定义的函数getint()读入以正整数,并将其输出(读程序,分析程序)

指针数组及指向一维数组的指针讲解

一、指针数组及指向一维数组的指针(数组指针)讲解 1、数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 2、指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int *说明这是一个整型指针数组,它有n个指针类型的数组元素。这样赋值是错误的:p=a;只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; for(i=0;i<3;i++) p[i]=a[i]; 这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p [1]、p[2]所以要分别赋值。 这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。 还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。 比如要表示数组中i行j列一个元素: *(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j] 优先级:()>[]>* 例1、下列给定程序中,函数fun()的功能是:从N个字符串中找出最长的那个串,并将其地址作为函数值返回。 #include #include #define N 4

实验4 数组答案

实验四数组 实验课程名: 高级语言程序设计4 数组 专业班级:学号:姓名: 实验时间:2016年4月27日实验地点:K4 指导教师: 一、实验目的及要求 1.掌握一维数组与二维数组的定义、赋值与输入输出的方法; 2.掌握字符数组与字符串函数的使用; 3.掌握与数组有关的算法(特别就是排序算法)。 二、实验任务: (一)(1)程序代码:#include #define N 10 void main( ) { int i,a[N]; float av=0; for(i=0;i

(3)结果分析:当i能被3整除时,就换一次行。 (二)实验任务2 (1)程序代码:#include void main( ) { int i,a[5],sum=0; for(i=0;i<=4;i++) scanf("%d",&a[i]); for(i=0;i<=4;i++) sum+=a[i]; printf("sum=%d\n",sum); } (2)程序运行结果: (3)程序分析:使用for循环依次输入5个数,并使5个数相加。 (三)实验任务3 (1)程序代码:#include int main( ) { int i,j,row=0,colum=0,max; int a[3][4] = {{1,2,3,4}, {9,8,7,6}, {-10,10,-5,2}}; max=a[0][0]; for(i=0;i<=2;i++) for (j=0;j<=3;j++) if(a[i][j]>max) {max=a[i][j]; row=i; colum=j; } printf(" Max=%d, Row=%d, Colum=%d\n", max, row, colum); return 0; }

JAVA一维数组二维数组运用的例子

题目:定义一个一维数组存储10个学生名字;定义一个二维数组存储这10个学生的6门课(C程序设计、物理、英语、高数、体育、政治)的成绩; 程序应具有下列功能: (1)按名字查询某位同学成绩 (2)查询某个科目不及格的人数,及学生名单 代码如下: import java.util.*; public class Test{ public static void main(String[]args){ Scanner input=new Scanner(System.in); String[]name={"a","b","c","d","e","f","g","h","i","l"};//存储学生的名字 int[][] grade={{50,60,70,80,90,10},{40,90,80,60,40,70},{60,80,70,60,40,90},{50,60,70,80,90,10}, {60,80,70,60,40,90},{60,70,80,90,70,70},{60,80,70,60,40,90},{60,80,70,60,40,90},{70, 80,90,70,70,70},{60,80,70,60,40,90}};//存储学生各科成绩 System.out.println("输入要查询成绩的学生名字:"); String chioce=input.nextLine(); for(int i=0;i<10;i++) { if(name[i].equals(chioce)) {System.out.println("学生:"+name[i]+"的成绩如下:"); System.out.println("C程序设计:"+grade[i][0]+"物理:"+grade[i][1]+"英 语:"+grade[i][2]+"高数:"+grade[i][3]+"体育:"+grade[i][4]+"政治:"+grade[i][5]+"\n"); break;} } System.out.println("******************************************************");

c数组指针题含答案

数组指针01:逆序输出 从键盘输入n个整数(n<100),存放在一个一维数组中,逆序输出能被3整除的元素,并逆序输出数组下标为3的倍数的元素。 输入格式:第一个整数为个数n,后续为n个整数 输出格式:第一行能被3整除的元素,第二行为下标为3的倍数的元素,各个数值之间用空格分隔。 输入:10 2 7 9 10 5 4 3 6 8 20 输出: 6 3 9 20 3 10 2 #include using namespace std; const int MAX=100; int main() { int a[MAX],n,i; cin>>n;

for(i=0;i>a[i]; for(i=n-1;i>=0;i--) if(a[i]%3==0) cout<=0;i--) if(i%3==0) cout<

输出格式:下标为3的倍数的元素,各个数值之间用空格分隔。输入:10 2 7 9 10 5 4 3 6 8 20 输出:20 3 10 2 #include using namespace std; const int MAX=100; int main() { int a[MAX],b[MAX],n,i; cin>>n; for(i=0;i>a[i]; b[n-1-i]=a[i]; } for(i=0;i

指向二维数组的指针

指向二维数组的指针 一. 二维数组元素的地址 为了说明问题, 我们定义以下二维数组: int a[3][4]={{0,1,2,3}, {4,5,6,7}, {8,9,10,11}}; a为二维数组名, 此数组有3行4列, 共12个元素。但也可这样来理解, 数组a由三个元素组成: a[0], a[1], a[2]。而它中每个元素又是一个一维数组, 且都含有4个元素(相当于4列), 例如, a[0]所代表的一维数组所包含的4 个元素为a[0][0], a[0][1], a[0][2], a[0][3]。如图5.所示: ┏━━━━┓┏━┳━┳━┳━┓ a─→┃a[0] ┃─→┃0 ┃1 ┃2 ┃3 ┃ ┣━━━━┫┣━╋━╋━╋━┫ ┃a[1] ┃─→┃4 ┃5 ┃6 ┃7 ┃ ┣━━━━┫┣━╋━╋━╋━┫ ┃a[2] ┃─→┃8 ┃9 ┃10┃11┃ ┗━━━━┛┗━┻━┻━┻━┛ 图5. 但从二维数组的角度来看, a代表二维数组的首地址, 当然也可看成是二维数组第0行的首地址。a+1就代表第1行的首地址, a+2就代表第2行的首地址。如果此二维数组的首地址为1000, 由于第0行有4个整型元素, 所以a+1为1008, a+2 也就为1016。如图6.所示 a[3][4] a ┏━┳━┳━┳━┓ (1000)─→┃0 ┃1 ┃2 ┃3 ┃ a+1 ┣━╋━╋━╋━┫ (1008)─→┃4 ┃5 ┃6 ┃7 ┃ a+2 ┣━╋━╋━╋━┫ (1016)─→┃8 ┃9 ┃10┃11┃ ┗━┻━┻━┻━┛ 图6. 既然我们把a[0], a[1], a[2]看成是一维数组名, 可以认为它们分别代表它们所对应的数组的首地址, 也就是讲, a[0]代表第0 行中第0 列元素的地址, 即&a[0][0], a[1]是第1行中第0列元素的地址, 即&a[1][0], 根据地址运算规则, a[0]+1即代表第0行第1列元素的地址, 即&a[0][1], 一般而言, a[i]+j即代表第i行第j列元素的地址, 即&a[i][j]。 另外, 在二维数组中, 我们还可用指针的形式来表示各元素的地址。如前所述, a[0]与*(a+0)等价, a[1]与*(a+1)等价, 因此a[i]+j就与*(a+i)+j等价, 它表示数组元素a[i][j]的地址。 因此, 二维数组元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j), 它们都与a[i][j]等价, 或者还可写成(*(a+i))[j]。 另外, 要补充说明一下, 如果你编写一个程序输出打印a和*a, 你可发现它们的值是相同的, 这是为什么呢? 我们可这样来理解: 首先, 为了说明问题, 我们把二维数组人为地看成由三个数组元素a[0], a[1], a[2]组成, 将a[0], a[1], a[2]看成是数组名它们又分别是由4个元素组成的一维数组。因此, a表示数组第0行的地址, 而*a即为a[0], 它是数组名, 当然还是地址, 它就是数组第0 行第0 列元素的地址。

实验六 一维数组程序设计

实验六一维数组程序设计 一、实验学时 2学时 二、实验目的 (一)掌握一维数组的定义、初始化方法; (二)掌握一维数组中数据的输入和输出方法; (三)掌握与一维数组有关的程序和算法; (四)了解用数组处理大量数据时的优越性。 三、预习要求 (一)理解数组的概念、利用数组存放数据有何特点; (二)一维数组的定义、初始化方法; (三)一维数组中数据的输入和输出方法。 四、实验内容 (一)下面的几个程序都能为数组元素赋值,请输入程序并运行。比较一下这些赋值方法的异同。 1.在定义数组的同时对数组初始化。 /* c6-1.c */ /*在定义数组的同时对数组初始化*/ #include "stdio.h" void main( ) { int a[4]={0,1,2,3}; printf("\n%d %d %d %d\n",a[0],a[1],a[2],a[3]); } 2.不使用循环对单个数组元素赋值。 /* c6-2.c */ /*不使用循环对单个数组元素赋值*/ #include "stdio.h" void main( ) { int a[4]; a[0]=2;a[1]=4;a[2]=6;a[3]=8; printf("\n%d %d %d %d\n",a[0],a[1],a[2],a[3]); } 3.用循环结构,从键盘输入为每个数组元素赋值,输出各数组元素。 /* c6-3.c */ /*利用循环通过键盘对数组元素赋值*/ #include "stdio.h" void main( ) { int i,a[4]; for(i=0; i<4; i++) scanf("%d",&a[i]); printf("\n");

数组及其应用(详细教案)

提问:给一组数排序,这组数该如何存 放呢? 8 2 9 4 5 6 3 7 1 6 这就是本节课要解决的问题。 ?一个班学生的学习成绩 ?一行文字 ?一个矩阵 这些数据的特点是: 1.具有相同的数据类型 2.使用过程中需要保留原始数据 C语言为这些数据,提供了一种型:数组。所谓数组就是一组具有相数据的有序集合。 提出学习要求: 1 一维数组的定义和应用

2 二维数组的定义和应用 3 字符数组的应用 第七章数组 7.1一维数组及应用 7.1.1一维数组的定义方式 在C语言中使用数组必须先定义、后使用,定义数组也就确定了数组的首地址、数组元素的类型和个数(数组长度)。 一维数组的定义方式为: 类型说明符数组名[常量表达式]; 例如: 1) int a[5]; 说明整型数组a,a是数组名,有5个元素。但

是其下标从0开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。注意不能使用数组元素a[5]。 float b[10],c[20]; 说明实型数组b,b是数组名,有10个元素,实型数组c,有20个元素。 char ch[20]; 说明字符数组ch,有20个元素。 对于数组类型说明应注意以下几点:2) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。 3) 数组名的书写规则应符合标识符的书写规定。 4) 数组名不能与其它变量名相同。 例如:

main() { int a; /*a为整型变量*/ float a[10]; /* 数组名a与上面的变量名a相同,错误!*/ …… } 是错误的。 5) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。 例如: #define FD 5 /* FD是符号常数*/ main() {

实验七 一维数组的应用

实验七一维数组的应用 实验时间:2010年11月19日 【实验目的】 1、掌握一维数组的定义、赋值和输入、输出的方法; 2、能用循环处理数组,用数组存储数据; 3、掌握与数组应用有关的算法(例如求最大值、最小值算法,冒泡法排序算法、选择法排序算法等)。 【实验内容】 1、一维数组的定义、赋值、输入和输出; 2、用循环处理数组,数组元素的引用; 3、数组的应用:求最大值、最小值问题,冒泡法排序,选择法排序。 【实验步骤】 一、在E或F盘上建立以自己的学号命名的文件夹。 二、上机验证题 1、分析以下程序,写出运行结果。 /* 文件名:ex7_1.c */ #include #define N 10 main ( ) { int k; float a[N],av,s; s=0.0; printf("请输入10个数:\n"); for (k=0; kav) printf("%.0f\t",a[k]); } 2、分析以下程序,写出运行结果 /* 文件名:ex7_2.c */ #include main ( ) {

int a[10],i,max,min,maxpos,minpos; printf("请输入10个整数:\n"); for(i=0;i<10;i++) { scanf("%d",&a[i]); } max=min=a[0]; maxpos=minpos=0; for(i=0;i<10;i++) { if(maxa[i]) { min=a[i]; minpos=i+1; } } printf("max=%d,pos=%d\n",max,maxpos); printf("min=%d,pos=%d\n",min,minpos); } 3、分析以下程序,写出运行结果。 /* 文件名:ex7_3.c */ #include main ( ) { char str[20]; int i,num; gets(str); if(str[0]!=' ') { num=1; } else { num=0;

数组及指针 知识点总结

第9章数组 第1课 知识点一 定义一维数组 格式: 类型名数组名[元素个数] 例1 定义一个包含4个整数的数组a int a[4]; 例2 定义一个包含3个双精度数的数组b double b[3]; 注意: C语言中数组的下界从0开始计数。 例如: a[4]的4个元素分别为a[0]、a[1]、a[2]、a[3] 知识点二 一维数组的初始化 用一对大括号将数组的初值括起来。 例1 int a[3]={1, 2, 3}; 此例中a[0]值为1、a[1]值为2、a[2]值为3

例2 int a[5]={0}; 此例中数组a的全部元素值均为0 例3 int a[3]={1, 2, 3, 4}; 此例中由于初值个数多于数组元素个数,所以非法。例4 int a[ ]={0, 0, 0, 0}; 此例中省略数组元素个数,初值为4个0 等价于int a[4]={0}; 注意: 数组名是一个常量值,不能对它赋值。 例如: int a[3]; a=5; 此语句非法,应改为a[0]=5; 知识点三 一维数组应用 例1 从键盘上输入10个整数,输出最大数和最小数。 #include main() { int a[10],i,max,min; printf("请输入10个整数:\n");

for(i=0;i<=9;i++) scanf("%d",&a[i]); max=a[0]; min=a[0]; for(i=1;i<=9;i++) { if(a[i]>max) max=a[i]; if(a[i]

关于二维数组和指向指针的指针

以前一直有种误解: 二维数组的是数组的数组,所以数组的首地址是指向第一个元素指针,而这个元素又是一个数组,所以把数组首地址理解为指向指针的指针。 如int a[3][2];,以前一直认为a是一个指向int指针的指针,即是一个int**。最近发现这是错的。 如果int **p=a; 编译就会报错。如果强制转换int **p=(int **)a,则使用p[i][j]访问数组元素时出错。 首先,因为a的定义为int a[3][2];则a的类型是int* [3][2]数组类型,或者int* [][2],即指向大小为2的数组的指针,类型与int **不同,所以int **p=a;出错。 其次,考虑p[i][j]访问a的数组元素时出错的问题。当我们使用指向二维数组的指针的下标运算来访问数组元素时,如a[i][j],它等同于*(a+i*2+j);即必须要知道第二维的大小才能访问。考虑我使用p[i][j]的后果:p是int**,所以p[i]为*(p+i),而这个结果被视作一个指针,在这里记做pp=*(p+i),所以p[i][j]等同于pp[j]。最终的结果为*(pp+j),并将这个结果解释为一个int值。 int a[3][2]; int val=0; for(int i=0;i<3;++i) { for(int j=0;j<2;++j) { a[i][j]=val++; } } /*使用a[i][j]的方式显然可以正常访问该二维数组*/ /*下面使用指针直接访问,当然是不是int**了……*/ int *p=&a[0][0];/*注意,此处使用int *p=a;或者int *p=a[0];是不对的,p的类型是int型指针,*a或者a[0]是int (*)[2]类型,编译会报错的,* *尽管&a[0][0]、a、a[0]的数值相同……*/ for(int i=0;i<6;++i) { p[i];/*这样可以遍历所有元素*/ }

vb中一维二维数组应用

一维数组 排序 一、选择排序法: 数据已经放在一维数组中,要求从小到大排序。 数组 20 4 36 …… 45 109 3 下标 1 2 3 …… n-2 n-1 n 排序过程: 1、从第1项到第n项选择最小值,然后将第1项与最小项交换。 2、从第2项到第n项选择最小值,然后将第2项与最小项交换。 3、…… 4、从第n-1项到第n项选择最小值,然后将第n-1项与最小项交换。注意:最小值及下标由临时变量存储。 所以,需要两层循环:外层循环i执行n-1次,内层循环j执行n-i-1次For i=1 to n-1

最小值及下标由临时变量存储 tmpVal=第i项值 tmpId=第i项下标 For j=i+1 to n 若tmpVal >第j项值,则: tmpVal=第j项值 tmpId=第j项下标 next 将第i项与最小项交换 Next 从大到小呢? 二、冒泡排序法: 数据已经放在一维数组中,要求从小到大排序。 数组 20 4 36 …… 45 109 3 下标 1 2 3 …… n-2 n-1 n

两种方法:小数上浮和大数下沉。 小数上浮排序过程:从第n项到第k项,依次相临两项比较,若第m项小于第m-1项,则两项交换。(k从2到n) 第1次执行:结果是第1项至第n项中的最小值放到第1项中 1、若第n项小于第n-1项,将第n项与第n-1项交换。 2、若第n-1项小于第n-2项,将第n-1项与第n-2项交换。 3、…… 4、若第2项小于第1项,将第2项与第1项交换。 第2次执行:结果是第2项至第n项中的最小值放到第2项中 1、若第n项小于第n-1项,将第n项与第n-1项交换。 2、若第n-1项小于第n-2项,将第n-1项与第n-2项交换。 3、…… 4、若第3项小于第2项,将第3项与第2项交换。 …… 第n-1次执行: 1、若第n项小于第n-1项,将第n项与第n-1项交换。 所以,需要两层循环:外层循环i执行n-1次,内层循环j执行n-i次 For i=1 to n-1 For j=n to i+1 step -1 若第j项值<第j-1项值,则:

c语言程序设计 一维数组实验

程序填空: 1、将数组a中所有偶数删除,把奇数按原顺序依次存放到a[0]、a[1]、a[2]、……、中。例如:若a数组中的数据最初排列为:9、1、4、 2、 3、6、5、8、7,删除偶数后a数组中的数据为:9、1、3、5、7。 #include main() { int a[9]={9,1,4,2,3,6,5,8,7},i,k=0; for(i=0;i<9;i++) if(__【1】__) a[k++]=a[i]; for(i=k;i<9;i++) a[i]=0; for(i=0;__【2】__;i++) printf("%4d",a[i]); printf("\n"); } 2、将所有大于1小于整数m的非素数存入数组a中。例如,若输入17,则应输出:4 6 8 9 10 12 14 15 16。 #include #define N 100 main() { int a[N],i,j,k=0,m; __【1】__ for(i=2;i #define N 20 main() { int fibonaci[N],i; for(i=0;i

练习6-指针与一维数组ans

练习6 指针与一维数组参考答案 一、目的 1、掌握指针变量的定义和引用方法; 2、掌握用指向一维数组的指针编写应用程序的一般方法。 二、实验 1.运行程序C6_1r.C(《指导》P38实验3.6-1(1)),验证结果。 运行结果:a=13,b=10 2.运行程序C6_2r.C(《指导》P38实验3.6-1(2)),验证结果。 运行结果:2,2,2 3.运行程序C6_3r.C(《指导》P38实验3.6-1(3)),验证结果。 运行结果:1 2 3 4 4.程序修改:C6_4m.C首先使指针pa指向变量a(初值为10),然后通过pa间接访问a的方法将a的值修改为20。程序在一对/**/之间有两个错误,请修改。 #include void main() {int a=10,*pa; /**/ pa=&a; /*将20赋给pa指向变量(即a)*/ *pa=20; /*将20赋给pa指向变量(即a)*/ /**/ printf("%d\n",a); } 5.运行程序C6_5m.C,输入两个整数,观察程序能否实现功能:使用指针将两个数按降序重新存放。如果不能实现,请修改程序实现上述要求。 #include void main( ) {int a,b,*p1=&a,*p2=&b,t; printf("input a and b:"); scanf("%d %d",&a,&b); if(a #include #define N 6 void main()

实验10 数组指针综合练习

C程序设计实验10:数组指针综合练习 一、实验目的 1.熟悉一维数组元素指针的基本概念和使用方法; 2.熟悉指向二维数组元素指针的基本概念和使用方法; 3了解一维数组指针的基本概念和使用方法; 二、实验内容 1. 熟悉一维数组元素指针的基本概念和使用方法; 热身练习:设a为一维数组,内容为:1-9,有int *p=a; 写程序完成如下测试1 练习:对一列整数进行输入,输出和排序,分别用函数实现,在主程序中测试,Tips2:虽然功能和实验十一一样,但是,我们这次要用指针做为参数,来传递数组的地址了。 输入输出模块举例,首先写函数,数组和数组元素的个数作为形参,定义方法如下:void InputArray(int *pArray,//指向整型变量的指针,实参将一维数组首地址传递过来 int nArrayNum )//数组元素的具体个数 { for(int i=0;i

pArray++;//每次指针加1,指向下一个元素 } } void OutputArray(int *pArray,//指向整型变量的指针,实参将一维数组首地址传递过来 int nArrayNum )//数组元素的具体个数 { for(int i=0;i

C语言实验__一维数组

实验6 一维数组 实验要求: 使用Visual C++ 6.0开发环境,完成以下习题。 1. (此题可不使用数组)输出1~100之间的不能被7整除的数。(要求使用continue语句,如果其能被7整除则continue)。源程序保存为6-1.c。运行效果截图保存为6-1p.jpg。 2. 对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。源程序保存为6-2.c。运行效果截图保存为6-2p.jpg。 3. 定义一个100个元素的数组,依次赋值为1 ~ 100。先输出其中能被3整除的数。再输出其中能被5整除的数。(注意数组的下标是从0开始。)源程序保存为6-3.c。运行效果截图保存为6-3p.jpg。 4. 让用户输入学生的人数n,然后输入这n个学生的语文成绩,保存在数组中。然后分别计算输出: (1)统计语文成绩平均分。 (2)不及格的学生序号及成绩、并统计不及格人数。 (3)最高分的成绩及最高分的学生的序号。 源程序保存为6-4.c。运行效果截图保存为6-4p.jpg。 5. 定义一个数组A存放6个学生的高数成绩,定义一个数组B存放这6个学生的英语成绩, 再定义一个数组C存放这6个学生的C++成绩。在输入时,要求逐个学生的三门课成绩输入(即先输入第1个学生的三门课成绩,再输入第2个学生的三门课成绩,以此类推)。求这6个同学三科的总分存放在数组D中,并输出。源程序保存为6-5.c。运行效果截图保存为6-5p.jpg。 6. 编程实现:简单版成绩管理系统1。 程序首先显示菜单,让用户选择1则添加一个学生的的记录,选择2则查看一个学生的记录,选择3则修改一个学生的记录,选择4则浏览所有学生记录。每个学生记录由其学号、高数成绩、英语成绩、C++成绩组成。(提示:定义一个100个元素的数组,存放学生的学号;定义一个100个元素的数组存放高数成绩,定义一个100个元素的数组存放英语成绩;定义一个100个元素的数组存放C++成绩;定义一个变量记录当前已经总共添加了多少个学生) 当用户选择1之后,让用户输入要添加的学生的学号、高数成绩、英语成绩、C++成绩。 当用户选择2之后,先让用户输入要查看的学生学号,然后输出其高数、英语、C++成绩。 当用户选择3之后,先让用户输入要修改的学生学号,然后依次让用户重新输入这个学生的高数、英语、C++成绩、 当用户选择4之后,依次输出每个学生的学号、高数、英语、C++成绩。 源程序保存为6-6.c。运行效果截图保存为6-6p.jpg。

C语言程序设计 一维数组

5.1一维数组 5.1.1找最小数 【例5-1】输入10个整数,找出其中的最小数,然后输出这10个数和最小数。 参考程序如下: /*程序5-1.c*/ #include int main() { int i,min,a[10];/*定义数组*/ printf("Enter data:");/*提示输入*/ for(i=0;i<10;i++) scanf("%d",&a[i]);/*输入10个数*/ min=a[0];/*假设下标为0的元素最小*/ for(i=1;i<10;i++)/*找最小值a[i]*/ if(a[i]

C语言 数组和指针练习题

若当堂没做完,下周四之前上交也可。 至ftp://211.64.82.253/ 用户名和密码:stu C语言程序设计练习题——数组 一、选择题 77、以下对一维数组a的正确说明是_d ___ A、char a(10); B、int a[ ]; C、int k=5,a[k]; D、char a[ ]={'a' , 'b' , 'c'}; 78、若有说明语句:int a[2][4];,则对a数组元素的正确引用是_a___ A、a[0][3] B、a[0][4] C、a[2][2] D、a[2][2+1] 79、以下能对二维数组y进行初始化的语句是_b__ A、static int y[2][ ]={{1,0,1}, {5,2,3}}; B、static int y[ ][3]={{1,2,3}, {4,5,6}}; C、static int y[2][4]={{1,2,3}, {4,5} , {6}}; D、static int y[ ][3]={{1,0,1,0}, { }, {1,1}}; 80、若有说明语句:int y[ ][4]={0,0};则下面叙述不正确的是_d___ A、数组y的每个元素都可得初值0 B、二维数组y的行数为1 C、该说明等价于int y[ ][4]={0}; D、只有元素y[0][0]和y[0][1]可得到初值0,其余元素均得不到初值0 81、以下各组选项中,均能正确定义二维实型数组s的选项是_c___ A、float s[3][4]; B、float s(3,4); float s[ ][4]; float s[ ][ ]={{0};{0}}; float s[3][ ]={{1},{0}}; float s[3][4]; C、 float s[3][4]; D、float s[3][4]; static float s[ ][4]={{0},{0}}; float s[3][ ]; auto float s[ ][4]={{0},{0},{0}}; float s[ ][4]; 82、若有说明语句:int a[ ][3]={1,2,3,4,5,6,7,8}; ,则a数组的行数为__a__ A、3 B、2 C、无确定值 D、1 83、若二维数组y有m列,则在y[i][j]前的元素个数为_B___ A、j*m+i B、i*m+j C、i*m+j-1 D、i*m+j+1 84、下面程序中有错误的行是__D__ 1、 main( ) 2、 { 3、 int x[3]={1}; 4、 int k; 5、 scanf("%d", &x); 6、 for (k=1; k<3; k++) 7、 x[0]=x[0]+x[i]; 8、 printf("x[0]=%d\n", x[0]); 9、 } A、3 B、6 C、7 D、5 85、若有以下语句,则正确的描述是__b__ char x[ ]="12345"; char y[ ]={'1', '2', '3', '4', '5'}; A、x数组与y数组的长度相同 B、x数组长度大于y数组长度 C、x数组长度小于y数组长度

实验4数组(答案解析)

实验四数组 实验课程名:高级语言程序设计4 数组 专业班级:学号:姓名:实验时间:2016年4月27日实验地点:K4 指导教师:

(3)结果分析:当i能被3整除时,就换一次行。 (二)实验任务2 (1)程序代码:#include void main( ) { int i,a[5],sum=0; for(i=0;i<=4;i++) scanf("%d",&a[i]); for(i=0;i<=4;i++) sum+=a[i]; printf("sum=%d\n",sum); } (2)程序运行结果:

(3)程序分析:使用for循环依次输入5个数,并使5个数相加。 (三)实验任务3 (1)程序代码:#include int main( ) { int i,j,row=0,colum=0,max; int a[3][4] = {{1,2,3,4}, {9,8,7,6}, {-10,10,-5,2}}; max=a[0][0]; for(i=0;i<=2;i++) for (j=0;j<=3;j++) if(a[i][j]>max) {max=a[i][j]; row=i; colum=j; } printf(" Max=%d, Row=%d, Colum=%d\n", max, row, colum); return 0; } (2)程序运行结果:

(3)程序分析:分别将这12个元素同max相比较,当某个元素的值大于max时,则将此元素的值赋值给max,最后输出max及最大值的下标。 (四)实验任务4 (1)程序代码:#include void main( ) { int i, x, a[10]={1,2,3,4,5,6,7,8,9,10}; scanf("%d",&x); /*输入x变量的值*/ for ( i=0; i<10; i++ ) printf("%4d",a[i]); printf("\n"); for(i=0;i<10;i++) /* 循环查找与x相等的元素*/ if ( x==a[i] ) printf("%d\n",i); /* 输出查找结论,输出下标值*/ else printf("Not found %d\n",x); } (2)运行结果:

一维数组与指针

指 针 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),图例如下: a b c a b 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是具体的内容。 从以上程序来看,*pointer_1和i 是一回事。 到此为止,我们已经知道了指针变量的定义,既然变量定义了,就要使用,如何使用呢?

实验10数组指针综合练习.doc

C程序设计实验10:数组指针综合练习 ?、实验目的 1. 熟悉一维数组元素指针的基本概念和使用方法; 2. 熟悉指向二维数组元素指针的基本概念和使用方法; 3了解一维数组指针的基本概念和使用方法; 二、实验内容 1.熟悉一维数组元素指针的基本概念和使用方法; 热身练习:设a为一维数组,内容为:1-9,有int*p=a;写程序完成如下测试1 Tipsl用°/以可以输出十六进制的地址值,%o可以输出八进制地址值,测试值输出什么进制,看 练习:对一列整数进行输入,输出和排序,分别用函数实现,在主程序中测试,Tips2:虽然功能和实验十一一样,但是,我们这次要用指针做为参数,来传递数组的地址了。 输入输出模块举例,首先写函数,数组和数组元素的个数作为形参,定义方法如下: void lnputArray(int *pArray,//指向整型变量的指针,实参将一维数组首地址传递过来int nArrayNum >//数组元素的具体个数 { for(int i=O;i

scanf("%d",pArray);//逐个输入数组的每个元素 pArray++;//每次指针加1,指向下一个元素 void OutputArray(int *pArray、//指向整型变ii的指针,史参将一维数组首地址传递过来int nArrayNum )//数组元素的具体个数 { for(int i=O;i

相关文档
最新文档