数组与指针的练习 复习题 1.1下面程序将打印出什么? #include <stdio.h> int main() { int ref[] = { 8,4,0,2 }; int *ptr; int index; for (index = 0, ptr = ref; index < 4; index++, ptr++) printf(“%d %d ”, ref[index], *ptr); return 0; } 【运行结果】 8 8 4 4 0 0 2 2 1.2数组ref包含多少个素:4个 1.2ref是哪些数据的地址?ref+1呢?++ref指向什么? A:数组名ref指向数组的第一个素,表达式ref+1指向第二个素。++ref不是合法的C表达式,因为ref是常量不是变量。 2.下面每种情况中*ptr和(ptr+2)的值分别是什么? a. int *ptr; int torf[2][2] ={12,14,16}; ptr =torf[0] [*ptr =12,(ptr+2)=16] [相当于{12,14},{16,0}] b. int *ptr; int fort[2][2]={{12},{14,16}}; ptr =fort; [*ptr =12,(ptr+2)=14] [ptr+2代表第二行第一个素] 3.下面每种情况中ptr和(ptr+1)的值分别是什么 a. int (*ptr)[2]; int torf[2][2] ={12,14,16]; ptr =torf; [ptr=12 (ptr+1)=16] b. int(*ptr)[2]; int fort[2][2] ={{12},{14,16}}; ptr =fort; [ptr=12 (ptr+1)=14] [ptr指向第一行,ptr+1指向第二行] 6.假如有如下定义 int grid [30][100]a.用一种方法表示grid[22][56]的地址 &grid[22][56] b.用两种方法表示grid[22][0]的地址 &grid[22][0] grid[22] c.用三种方法表示grid[0][0] &grid[0][0] grid[0] (int *)grid 4. 用适当的方法声明下面每个变量: a.digits:一个包含10个int值得数组:int digits[10] b.rates:一个包含6个float值得数组:float rates[6] c.mat:一个包含3个素的数组,其中每个素是一个包含5个整数的数组: int mat[3][5] d.psa: 一个包含20个指向char的指针的数组: char *psa[20] e.pstr:一个指向数组的指针,其中数组由20个char值构成:char (*pstr)[20] 8.a.定义一个包含6个int值得数组,并且数值1、2、4、8、16和32进行初始化。 int array[6] ={1,2,4,8,16,32}; b.用数组符号表示a部分中数组的第三个素 array[2]; c.假设系统支持C99规则,定义一个包含100个int值得数组并且初始化它,使它的末素为-1,其他素的值不考虑. int arrc[100]={[99]=-1}; 5.包含10个素的数组的索引范围是什么? 0~9 6.假设有如下声明 float rootbeer[10],things[10][5],*pf,value = 2.2; int i = 3; 则下列语句中哪些是正确的,哪些是错误的? a.rootbeer[2] = value; 正确 b.scanf(“%f”,&rootbeer); 不正确,rootbeer不是一个float变量 c.rootbeer = value; 不正确 d.printf(“%f”,rootbeer); 不正确 e.things[4][4] =rootbeer[3]; 正确 f.things[5] = rootbeer; 不正确,不能使用数组赋值 g.pf =value;不正确,value不是一个地址 h.pf = rootbeer; 正确 7.声明一个800*600的int数组 int screen[800][600] 8.以下是3个数组声明: double trot[20]; short clops[10][30]; long shots[5][10][15]; a.以传统的void函数方式,写出处理数组trots的函数原型和函数调用;然后以变长数组方式,写出处理数组trots的函数原型和函数调用。 void process(double ar[],int n); void processvla(int n,double ar[n]); process (trots,20); processvla(20,trots); b.以传统的void函数方式,写出处理数组clops的函数原型和函数调用;然后以变长数组方式,写出处理数组clops的函数原型和函数调用。 void process2(short ar2[30],int n); void process2vla(int n,int m,short ar2[n][m]); process2(clops,10); process2vla(10,30,clops); c.以传统的void函数方式,写出处理数组shots的函数原型和函数调用;然后以变长数组方式,写出处理数组shots的函数原型和函数调用。 void process3(long ar3[10][15],int n); void process3vla(int n,int m,int k ,long ar3[n][m][k]); process3(shots,5); process3vla(5,10,15,shots); 9.下面是两个函数原型: void show(double ar[],int n); //n是素数 void show2(double ar2[][3],int n); //n是行数 a.编写一个函数调用,把包含数值8、3、9和2的复合文字传递给函数shows()。 show((int [4]){8,3,9,2},4}; b.编写一个函数调用,把包含2行3列数值的复合文字传递给函数show2(),其中第一行为8、3、9;第二行为5、4、1。 show2((int[][3]{8,3,9}{5,4,1}),2}; 编程题 1.修改rain程序,使它不适用数组下标,而是使用指针进行计算 /*rain.c –针对若干年的降水量数据,计算年降水总量、年降水平均量,以及月降水平均量*/ #include <stdio.h> #define MONTHS 12 #define YEARS 5 int main() { //把数组初始化为2000年到2004年的降水量数据 const float rain[YEARS][MONTHS] = { {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6}, {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,4.4,7.3}, {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4}, {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,7.4,4.3,6.2}, {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2} }; int year, month; float subtot, total; printf(“YEAR RAINFALL(inches) ”); for (year = 0, total = 0; year < YEARS; year++) { for (month = 0, subtot = 0; month < MONTHS; month++) { subtot += rain[year][month]; } printf(“%5d %15.1f ”, 2000 + year, subtot); total += subtot; } printf(” The yearly average is %.1f inches . ”, total / YEARS); printf(“MONTHLY AVERAGES: ”); printf(” Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ”); for (month = 0; month < MONTHS; month++) { //对于每个月,各年该月份的总降水量 for (year = 0, subtot = 0; year < YEARS; year++) subtot += rain[year][month]; printf(“%4.1f”, subtot / YEARS); } printf(” ”); return 0; } . /*rain.c –针对若干年的降水量数据,计算年降水总量、年降水平均量,以及月降水平均量*/ #include <stdio.h> #define MONTHS 12 #define YEARS 5 int main() { //把数组初始化为2000年到2004年的降水量数据 const float rain[YEARS][MONTHS] = { {4.3,4.3,4.3,3.0,2.0,1.2,0.2,0.2,0.4,2.4,3.5,6.6}, {8.5,8.2,1.2,1.6,2.4,0.0,5.2,0.9,0.3,0.9,4.4,7.3}, {9.1,8.5,6.7,4.3,2.1,0.8,0.2,0.2,1.1,2.3,6.1,8.4}, {7.2,9.9,8.4,3.3,1.2,0.8,0.4,0.0,0.6,7.4,4.3,6.2}, {7.6,5.6,3.8,2.8,3.8,0.2,0.0,0.0,0.0,1.3,2.6,5.2} }; int year, month; float subtot, total; printf(“YEAR RAINFALL(inches) ”); for (year = 0, total = 0; year < YEARS; year++) { for (month = 0, subtot = 0; month < MONTHS; month++) { subtot += *(*(rain+year)+month); } printf(“%5d %15.1f ”, 2000 + year, subtot); total += subtot; } printf(” The yearly average is %.1f inches . ”, total / YEARS); printf(“MONTHLY AVERAGES: ”); printf(” Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ”); for (month = 0; month < MONTHS; month++) { //对于每个月,各年该月份的总降水量 for (year = 0, subtot = 0; year < YEARS; year++) subtot +=*(*(rain+year)+month); printf(“%4.1f”, subtot / YEARS); } printf(” ”); return 0; }
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/63974.html