目录
3.在复习题1中,ref的地址是什么?ref + 1是什么意思?++ref指向什么
4.在下面的代码中,*ptr和*(ptr + 2)的值分别是什么
int *ptr; int torf[2][2] = {12, 14, 16};
int fort[2][2] = { {12}, {14,16} };
5.在下面的代码中,**ptr和**(ptr + 1)的值分别是什么?
int torf[2][2] = {12, 14, 16};
int fort[2][2] = { {12}, {14,16} };
c.mat是一个内含3个元素的数组,每个元素都是内含5个整数的数组
d.psa是一个内含20个元素的数组,每个元素都是指向int的指针
e.pstr是一个指向数组的指针,该数组内含20个char类型的值
a.声明一个内含6个int类型值的数组,并初始化各元素为1、2、4、8、16、32
c.假设编译器支持C99/C11标准,声明一个内含100个int类型值的数组,并初始化最后一个元素为-1,其他元素不考虑
d.假设编译器支持C99/C11标准,声明一个内含100个int类型值的数组,并初始化下标为5、10、11、12、3的元素为101,其他元素不考虑
float rootbeer[10], things[10][5], *pf, value = 2.2;
g.pf = value; h.pf = rootbeer;
a.分别以传统方式和以变长数组为参数的方式编写处理trots数组的void函数原型和函数调用 b.分别以传统方式和以变长数组为参数的方式编写处理clops数组的void函数原型和函数调用
c.分别以传统方式和以变长数组为参数的方式编写处理shots数组的void函数原型和函数调用
void show(const double ar[], int n); // n是数组元素的个数
void show2(const double ar2[][3], int n); // n是二维数组的行数
a.编写一个函数调用,把一个内含8、3、9和2的复合字面量传递给show()函数。
b.编写一个函数调用,把一个2行3列的复合字面量(8、3、9作为第1行,5、4、1作为第2行)传递给show2()函数
1.修改程序清单10.7的rain.c程序,用指针进行计算(仍然要声明并初始化数组)
double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
copy_ptrs(target3, source, source + 5);
3.编写一个函数,返回储存在int类型数组中的最大值,并在一个简单的程序中测试该函数
4.编写一个函数,返回储存在double类型数组中最大值的下标,并在一个简单的程序中测试该函数
5.编写一个函数,返回储存在double类型数组中最大值和最小值的差值,并在一个简单的程序中测试该函数
6.编写一个函数,把double类型数组中的数据倒序排列,并在一个简单的程序中测试该函数
12.重写程序清单10.7的rain.c程序,把main()中的主要任务都改成用函数来完成
13.编写一个程序,提示用户输入3组数,每组数包含5个double类型的数(假设用户都正确地响应,不会输入非数值数据)。该程序应完成下列任务。
e.打印结果 每个任务都要用单独的函数来完成(使用传统C处理数组的方式)。
完成任务b,要编写一个计算并返回一维数组平均值的函数,利用循环调用该函数3次。对于处理其他任务的函数,应该把整个数组作为参数,完成任务c和d的函数应把结果返回主调函数
复习题
1.下面的程序将打印什么内容
#include <stdio.h>
int main(void)
{
int ref[] = { 8, 4, 0, 2 };
int *ptr;
int index;
for (index = 0, ptr = ref; index < 4; index++, ptr++)
printf("%d %d\n", ref[index], *ptr);
return 0;
}
8 8
4 4
0 0
2 2
2.在复习题1中,ref有多少个元素
4
3.在复习题1中,ref的地址是什么?ref + 1是什么意思?++ref指向什么
- 该数组的第一个元素的地址
- 该数组第二个元素的地址
- ++ref不是个有效的表达式,ref是常量,不是变量
4.在下面的代码中,*ptr和*(ptr + 2)的值分别是什么
a.
int *ptr; int torf[2][2] = {12, 14, 16};
ptr = torf[0];
b.
int * ptr;
int fort[2][2] = { {12}, {14,16} };
ptr = fort[0];
a.
12 16
b.
12 14//多维数组是按连续的存储空间存储的
5.在下面的代码中,**ptr和**(ptr + 1)的值分别是什么?
a.
int (*ptr)[2];
int torf[2][2] = {12, 14, 16};
ptr = torf;
b.
int (*ptr)[2];
int fort[2][2] = { {12}, {14,16} };
ptr = fort;
a.
12 16
b.
12 14
6.假设有下面的声明:
int grid[30][100];
a.用1种写法表示grid[22][56]的地址
b.用2种写法表示grid[22][0] 的地址
c.用3种写法表示grid[0][0]的地址
a.
&grid[22][56]
b.
grid[22]
&grid[22][0]
c.
grid
grid[0]
&grid[0][0]
7.正确声明以下各变量:
a.digits是一个内含10个int类型值的数组
b.rates是一个内含6个float类型值的数组
c.mat是一个内含3个元素的数组,每个元素都是内含5个整数的数组
d.psa是一个内含20个元素的数组,每个元素都是指向int的指针
e.pstr是一个指向数组的指针,该数组内含20个char类型的值
a. int gigits[10];
b. float rates[6];
c. int mat[3][5];
d. int *pas[20];
e. char (*pstr)[20];
8.
a.声明一个内含6个int类型值的数组,并初始化各元素为1、2、4、8、16、32
b.用数组表示法表示a声明的数组的第3个元素(其值为4)
c.假设编译器支持C99/C11标准,声明一个内含100个int类型值的数组,并初始化最后一个元素为-1,其他元素不考虑
d.假设编译器支持C99/C11标准,声明一个内含100个int类型值的数组,并初始化下标为5、10、11、12、3的元素为101,其他元素不考虑
a. int a[] = {1, 2, 4, 8, 16, 32};
b. a[2]
c. int a[]={[99] = -1};//可以指明或不指明数组大小,不指明默认100,指明比100小编译器报错
d. int a[100] = {[5] = 101, [10] = 101, 101, 101, [3] = 101};//不能写成[5] = [10] = ... = 101
9.内含10个元素的数组下标范围是什么
0-9
10.假设有下面的声明:
float rootbeer[10], things[10][5], *pf, value = 2.2;
int i = 3;
判断以下各项是否有效:
a.rootbeer[2] = value;
b.scanf("%f", &rootbeer );
c.rootbeer = value;
d.printf("%f", rootbeer);
e.things[4][4] = rootbeer[3];
f.things[5] = rootbeer;
g.pf = value; h.pf = rootbeer;
a. o b. x c. x d. x e. o f. x g. x
11.声明一个800×600的int类型数组
int a[800][600];
12.下面声明了3个数组:
double trots[20];
short clops[10][30];
long shots[5][10][15];
a.分别以传统方式和以变长数组为参数的方式编写处理trots数组的void函数原型和函数调用 b.分别以传统方式和以变长数组为参数的方式编写处理clops数组的void函数原型和函数调用
c.分别以传统方式和以变长数组为参数的方式编写处理shots数组的void函数原型和函数调用
a.
void func(double []);
void func(int, double [*]);
/*
题目说的是调用- -自闭
void func(double a[]){}
void func(int a, double b[a]){}
*/
func(trots);
func(20, trots);
b.
void func(short [][30]);
void func(int, int, short [*][*]);
/*
void func(short a[][30]){}
void func(int a, int b, short c[a][b]){}
*/
func(clops);
func(10, 30, clops);
c.
void func(long [][10][15]);
void func(int, int, int, long[*][*][*]);
/*
void func(long a[][10][15]){}
void func(int a, int b, int c, long d[a][b][c]){}
*/
func(shots);
func(5, 10, 15, shots);
13.下面有两个函数原型:
void show(const double ar[], int n); // n是数组元素的个数
void show2(const double ar2[][3], int n); // n是二维数组的行数
a.编写一个函数调用,把一个内含8、3、9和2的复合字面量传递给show()函数。
b.编写一个函数调用,把一个2行3列的复合字面量(8、3、9作为第1行,5、4、1作为第2行)传递给show2()函数
a.
void show((double []){8, 3, 9, 2}, 4);
b.
void show((double [][3]){
{8, 3, 9},{5, 4, 1}}, 6);//二维里的3不能落下
编程练习
1.修改程序清单10.7的rain.c程序,用指针进行计算(仍然要声明并初始化数组)
#include <stdio.h>
#include <stdlib.h>
#define MONTHS 12 // 一年的月份数
#define YEARS 5 // 年数
int main(void)
{ // 用2010~2014年的降水量数据初始化数组
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, 1.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, 1.7, 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)\n");
for (year = 0, total = 0; year < YEARS; year++)
{ // 每一年,各月的降水量总和
for (month = 0, subtot = 0; month < MONTHS; month++)
subtot += *(*(rain + year) + month);
printf("%5d %15.1f\n", 2010 + year, subtot);
total += subtot; // 5年的总降水量
}
printf("\nThe yearly average is %.1f inches.\n\n", total / YEARS);
printf("MONTHLY AVERAGES:\n\n");
printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct ");
printf(" Nov Dec\n");
for (month = 0; month < MONTHS; month++)
{ // 每个月,5年的总降水量
for (year = 0, subtot = 0; year < YEARS; year++)
subtot += *(*(rain + year) + month);
printf("%4.1f ", subtot / YEARS);
}
printf("\n");
return 0;
}