内容正文:
8.5节:指针作为函数参数
一、单项选择题
1.以下程序的输出结果是( )
#include <stdio.h>
void fun(int *p, int n) {
int i;
for(i = 0; i < n; i++) {
p[i] = i * 2;
}
}
main() {
int a[5] = {0};
fun(a, 5);
printf("%d", a[3]);
}
A. 0 B. 3 C. 6 D. 编译错误
2.以下程序的输出结果是()
#include <stdio.h>
void f(char *p) {
while(*p) {
if(*p >= 'a' && *p <= 'z') {
*p -= 32;
}
p++;
}
}
main() {
char s[] = "Hello123";
f(s);
printf("%s", s);
}
A. hello123 B. HELLO123 C. Hello123 D. 编译错误
3.以下程序的输出结果是()
#include <stdio.h>
void f(int *p, int n) {
int i;
for(i = 0; i < n / 2; i++) {
int t = *(p + i);
*(p + i) = *(p + n - 1 - i);
*(p + n - 1 - i) = t;
}
}
main() {
int a[] = {1, 2, 3, 4, 5};
f(a, 5);
printf("%d", a[1]);
}
A. 2 B. 4 C. 1 D. 5
4.以下程序的输出结果()
#include <stdio.h>
void f(int *p) {
*p = 10;
p++;
*p = 20;
}
main() {
int a[2] = {0};
f(a);
printf("%d,%d", a[0], a[1]);
}
A. 0,0 B. 10,20 C. 10,0 D. 0,20
5.以下程序的输出结果是()
#include <stdio.h>
void f(char *p) {
p[1] = 'A';
}
main() {
char s[10] = "hello";
f(s);
printf("%s", s);
}
A. hello B. hAllo C. hAlo D. 编译错误
二、程序运行结果题
6.执行以下程序的输出结果是()
#include <stdio.h>
void fun(int *p, int n) {
int sum = 0,i;
for(i = 0; i < n; i++) {
sum += *(p + i);
}
*p = sum;
}
main() {
int a[5] = {1, 2, 3, 4, 5};
fun(a, 5);
printf("%d", a[0]);
}
7.执行以下程序的输出结果是()
#include <stdio.h>
void modify(char *s) {
int i = 0;
while(s[i] != '\0') {
if(i % 2 == 0) {
s[i] = s[i] + 1;
}
i++;
}
}
main() {
char str[] = "abcdef";
modify(str);
printf("%s", str);
}
8.执行以下程序的输出结果是()
#include <stdio.h>
void process(int arr[], int n) {
int i;
for(i = 0; i < n - 1; i++) {
arr[i] = arr[i] + arr[i + 1];
}
}
main() {
int a[5] = {1, 3, 5, 7, 9};
process(a, 5);
printf("%d %d %d", a[0], a[1], a[2]);
}
9.执行以下程序的输出结果是()
#include <stdio.h>
void change(int *p) {
int i;
for(i = 0; i < 3; i++) {
*(p + i) = (i + 1) * 10;
}
}
main() {
int a[5] = {0};
change(a);
printf("%d %d %d", a[0], a[2], a[4]);
}
10.执行以下程序的输出结果是()
#include <stdio.h>
void transform(char *str) {
while(*str) {
if(*str >= '0' && *str <= '9') {
*str = '*';
}
str++;
}
}
main() {
char s[] = "a1b2c3d4";
transform(s);
printf("%s", s);
}
11.执行以下程序的输出结果是()
#include <stdio.h>
void reverse(int *p, int n) {
int *q = p + n - 1;
while(p < q) {
int t = *p;
*p = *q;
*q = t;
p++;
q--;
}
}
main() {
int a[] = {10, 20, 30, 40, 50};
reverse(a, 5);
printf("%d %d %d", a[0], a[2], a[4]);
}
12.执行以下程序的输出结果是()
#include <stdio.h>
void func(int *x, int *y, int *z) {
*x = *y + *z;
*y = *x + *z;
*z = *x + *y;
}
main() {
int a = 1, b = 2, c = 3;
func(&a, &b, &c);
printf("%d %d %d", a, b, c);
}
13.执行以下程序的输出结果是()
#include <stdio.h>
void edit(char *s) {
int i;
for(i = 0; s[i] != '\0'; i++) {
if(s[i] == ' ') {
s[i] = '_';
}
}
}
main() {
char str[] = "C programming language";
edit(str);
printf("%s", str);
}
14.执行以下程序的输出结果是()
#include <stdio.h>
void calc(int *arr, int n) {
int i;
for(i = 0; i < n; i++) {
if(arr[i] > 0) {
arr[i] = 1;
} else if(arr[i] < 0) {
arr[i] = -1;
}
}
}
main() {
int a[] = {5, -2, 0, 8, -3};
calc(a, 5);
printf("%d %d %d", a[0], a[1], a[2]);
}
15.执行以下程序的输出结果是()
#include <stdio.h>
void rotate(int *p, int n) {
int last = p[n - 1],i;
for(i = n - 1; i > 0; i--) {
p[i] = p[i - 1];
}
p[0] = last;
}
main() {
int b[] = {1, 2, 3, 4, 5};
rotate(b, 5);
printf("%d %d", b[0], b[1]);
}
16.执行以下程序的输出结果是()
#include <stdio.h>
void modify_str(char *p) {
int count = 0;
while(*p) {
if(*p == 'e') {
count++;
if(count == 2) {
*p = 'E';
break;
}
}
p++;
}
}
main() {
char s[] = "complete example";
modify_str(s);
printf("%s", s);
}
17.执行以下程序的输出结果是()
#include <stdio.h>
void process(int *a, int *b, int n) {
int i;
for(i = 0; i < n; i++) {
if(i % 2 == 0) {
b[i] = a[i] * 2;
} else {
b[i] = a[i] + 10;
}
}
}
main() {
int x[4] = {1, 2, 3, 4};
int y[4];
process(x, y, 4);
printf("%d %d %d %d", y[0], y[1], y[2], y[3]);
}
18.执行以下程序的输出结果是()
#include <stdio.h>
void update(int *ptr) {
static int count = 0;
*ptr = count;
count++;
}
main() {
int values[3],i;
for(i = 0; i < 3; i++) {
update(&values[i]);
}
printf("%d %d %d", values[0], values[1], values[2]);
}
19.执行以下程序的输出结果是()
#include <stdio.h>
void transform(int *arr, int size) {
int i;
for(i = 0; i < size; i++) {
arr[i] = (arr[i] % 2 == 0) ? arr[i] / 2 : arr[i] * 2;
}
}
main() {
int data[] = {2, 3, 4, 5};
transform(data, 4);
printf("%d %d", data[1], data[3]);
}
20.执行以下程序的输出结果是()
#include <stdio.h>
void manipulate(char *src, char *dest) {
int i = 0, j = 0;
while(src[i]) {
if(src[i] != 'a' && src[i] != 'e' && src[i] != 'i' &&
src[i] != 'o' && src[i] != 'u') {
dest[j] = src[i];
j++;
}
i++;
}
dest[j] = '\0';
}
main() {
char input[] = "hello world";
char output[20];
manipulate(input, output);
printf("%s", output);
}
三、编程题
1.编写一个函数swap_min_max,接收一个整型数组和数组长度,查找数组中的最小值和最大值,并交换它们的位置。在main函数中测试该函数。
2.编写一个函数remove_duplicates,接收一个整型数组和数组长度,删除数组中的重复元素(只保留第一次出现的元素),并返回新数组的长度。在main函数中测试。
3.编写一个函数matrix_transpose,接收一个3×3的整型矩阵,求其转置矩阵(行列互换)。在main函数中测试。
4.编写一个函数array_rotate,接收一个整型数组和数组长度n,将数组循环右移k个位置(k由参数指定)。在main函数中测试。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
8.5节:指针作为函数参数
一、单项选择题
1.以下程序的输出结果是( )
#include <stdio.h>
void fun(int *p, int n) {
int i;
for(i = 0; i < n; i++) {
p[i] = i * 2;
}
}
main() {
int a[5] = {0};
fun(a, 5);
printf("%d", a[3]);
}
A. 0 B. 3 C. 6 D. 编译错误
【答案】C
2.以下程序的输出结果是( )
#include <stdio.h>
void f(char *p) {
while(*p) {
if(*p >= 'a' && *p <= 'z') {
*p -= 32;
}
p++;
}
}
main() {
char s[] = "Hello123";
f(s);
printf("%s", s);
}
A. hello123 B. HELLO123 C. Hello123 D. 编译错误
【答案】
3.以下程序的输出结果是( )
#include <stdio.h>
void f(int *p, int n) {
int i;
for(i = 0; i < n / 2; i++) {
int t = *(p + i);
*(p + i) = *(p + n - 1 - i);
*(p + n - 1 - i) = t;
}
}
main() {
int a[] = {1, 2, 3, 4, 5};
f(a, 5);
printf("%d", a[1]);
}
A. 2 B. 4 C. 1 D. 5
【答案】B
4.以下程序的输出结果( )
#include <stdio.h>
void f(int *p) {
*p = 10;
p++;
*p = 20;
}
main() {
int a[2] = {0};
f(a);
printf("%d,%d", a[0], a[1]);
}
A. 0,0 B. 10,20 C. 10,0 D. 0,20
【答案】B
5.以下程序的输出结果是( )
#include <stdio.h>
void f(char *p) {
p[1] = 'A';
}
main() {
char s[10] = "hello";
f(s);
printf("%s", s);
}
A. hello B. hAllo C. hAlo D. 编译错误
【答案】B
二、程序运行结果题
6.执行以下程序的输出结果是( )
#include <stdio.h>
void fun(int *p, int n) {
int sum = 0,i;
for(i = 0; i < n; i++) {
sum += *(p + i);
}
*p = sum;
}
main() {
int a[5] = {1, 2, 3, 4, 5};
fun(a, 5);
printf("%d", a[0]);
}
【答案】15
7.执行以下程序的输出结果是( )
#include <stdio.h>
void modify(char *s) {
int i = 0;
while(s[i] != '\0') {
if(i % 2 == 0) {
s[i] = s[i] + 1;
}
i++;
}
}
main() {
char str[] = "abcdef";
modify(str);
printf("%s", str);
}
【答案】bbddff
8.执行以下程序的输出结果是( )
#include <stdio.h>
void process(int arr[], int n) {
int i;
for(i = 0; i < n - 1; i++) {
arr[i] = arr[i] + arr[i + 1];
}
}
main() {
int a[5] = {1, 3, 5, 7, 9};
process(a, 5);
printf("%d %d %d", a[0], a[1], a[2]);
}
【答案】4 8 12
9.执行以下程序的输出结果是( )
#include <stdio.h>
void change(int *p) {
int i;
for(i = 0; i < 3; i++) {
*(p + i) = (i + 1) * 10;
}
}
main() {
int a[5] = {0};
change(a);
printf("%d %d %d", a[0], a[2], a[4]);
}
【答案】10 30 0
10.执行以下程序的输出结果是( )
#include <stdio.h>
void transform(char *str) {
while(*str) {
if(*str >= '0' && *str <= '9') {
*str = '*';
}
str++;
}
}
main() {
char s[] = "a1b2c3d4";
transform(s);
printf("%s", s);
}
【答案】a*b*c*d*
11.执行以下程序的输出结果是( )
#include <stdio.h>
void reverse(int *p, int n) {
int *q = p + n - 1;
while(p < q) {
int t = *p;
*p = *q;
*q = t;
p++;
q--;
}
}
main() {
int a[] = {10, 20, 30, 40, 50};
reverse(a, 5);
printf("%d %d %d", a[0], a[2], a[4]);
}
【答案】50 30 10
12.执行以下程序的输出结果是( )
#include <stdio.h>
void func(int *x, int *y, int *z) {
*x = *y + *z;
*y = *x + *z;
*z = *x + *y;
}
main() {
int a = 1, b = 2, c = 3;
func(&a, &b, &c);
printf("%d %d %d", a, b, c);
}
【答案】5 8 13
13.执行以下程序的输出结果是( )
#include <stdio.h>
void edit(char *s) {
int i;
for(i = 0; s[i] != '\0'; i++) {
if(s[i] == ' ') {
s[i] = '_';
}
}
}
main() {
char str[] = "C programming language";
edit(str);
printf("%s", str);
}
【答案】C_programming_language
14.执行以下程序的输出结果是( )
#include <stdio.h>
void calc(int *arr, int n) {
int i;
for(i = 0; i < n; i++) {
if(arr[i] > 0) {
arr[i] = 1;
} else if(arr[i] < 0) {
arr[i] = -1;
}
}
}
main() {
int a[] = {5, -2, 0, 8, -3};
calc(a, 5);
printf("%d %d %d", a[0], a[1], a[2]);
}
【答案】1 -1 0
15.执行以下程序的输出结果是( )
#include <stdio.h>
void rotate(int *p, int n) {
int last = p[n - 1],i;
for(i = n - 1; i > 0; i--) {
p[i] = p[i - 1];
}
p[0] = last;
}
main() {
int b[] = {1, 2, 3, 4, 5};
rotate(b, 5);
printf("%d %d", b[0], b[1]);
}
【答案】5 1
16.执行以下程序的输出结果是( )
#include <stdio.h>
void modify_str(char *p) {
int count = 0;
while(*p) {
if(*p == 'e') {
count++;
if(count == 2) {
*p = 'E';
break;
}
}
p++;
}
}
main() {
char s[] = "complete example";
modify_str(s);
printf("%s", s);
}
【答案】completE example
17.执行以下程序的输出结果是( )
#include <stdio.h>
void process(int *a, int *b, int n) {
int i;
for(i = 0; i < n; i++) {
if(i % 2 == 0) {
b[i] = a[i] * 2;
} else {
b[i] = a[i] + 10;
}
}
}
main() {
int x[4] = {1, 2, 3, 4};
int y[4];
process(x, y, 4);
printf("%d %d %d %d", y[0], y[1], y[2], y[3]);
}
【答案】2 12 6 14
18.执行以下程序的输出结果是( )
#include <stdio.h>
void update(int *ptr) {
static int count = 0;
*ptr = count;
count++;
}
main() {
int values[3],i;
for(i = 0; i < 3; i++) {
update(&values[i]);
}
printf("%d %d %d", values[0], values[1], values[2]);
}
【答案】0 1 2
19.执行以下程序的输出结果是( )
#include <stdio.h>
void transform(int *arr, int size) {
int i;
for(i = 0; i < size; i++) {
arr[i] = (arr[i] % 2 == 0) ? arr[i] / 2 : arr[i] * 2;
}
}
main() {
int data[] = {2, 3, 4, 5};
transform(data, 4);
printf("%d %d", data[1], data[3]);
}
【答案】6 10
20.执行以下程序的输出结果是( )
#include <stdio.h>
void manipulate(char *src, char *dest) {
int i = 0, j = 0;
while(src[i]) {
if(src[i] != 'a' && src[i] != 'e' && src[i] != 'i' &&
src[i] != 'o' && src[i] != 'u') {
dest[j] = src[i];
j++;
}
i++;
}
dest[j] = '\0';
}
main() {
char input[] = "hello world";
char output[20];
manipulate(input, output);
printf("%s", output);
}
【答案】hll wrld
三、编程题
1.编写一个函数swap_min_max,接收一个整型数组和数组长度,查找数组中的最小值和最大值,并交换它们的位置。在main函数中测试该函数。
【答案】
#include <stdio.h>
void swap_min_max(int arr[], int n) {
int min_idx = 0, max_idx = 0,i,temp;
if(n <= 0) return;
// 查找最小值和最大值的下标
for(i = 1; i < n; i++) {
if(arr[i] < arr[min_idx]) {
min_idx = i;
}
if(arr[i] > arr[max_idx]) {
max_idx = i;
}
}
// 交换最小值和最大值
temp = arr[min_idx];
arr[min_idx] = arr[max_idx];
arr[max_idx] = temp;
}
int main() {
int a[] = {5, 2, 9, 1, 7, 4};
int n = sizeof(a) / sizeof(a[0]),i;
printf("原数组: ");
for(i = 0; i < n; i++) {
printf("%d ", a[i]);
}
swap_min_max(a, n);
printf("
交换后: ");
for(i = 0; i < n; i++) {
printf("%d ", a[i]);
}
}
2.编写一个函数remove_duplicates,接收一个整型数组和数组长度,删除数组中的重复元素(只保留第一次出现的元素),并返回新数组的长度。在main函数中测试。
【答案】
#include <stdio.h>
int remove_duplicates(int arr[], int n) {
int new_len = 1,i,j;
if(n <= 1) return n;
for(i = 1; i < n; i++) {
int is_duplicate = 0;
// 检查当前元素是否在前面出现过
for(j = 0; j < new_len; j++) {
if(arr[i] == arr[j]) {
is_duplicate = 1;
break;
}
}
// 如果不是重复元素,添加到新位置
if(!is_duplicate) {
arr[new_len] = arr[i];
new_len++;
}
}
return new_len;
}
int main() {
int a[] = {1, 2, 3, 2, 4, 1, 5, 3};
int n = sizeof(a) / sizeof(a[0]),i,new_n;
printf("原数组: ");
for(i = 0; i < n; i++) {
printf("%d ", a[i]);
}
new_n = remove_duplicates(a, n);
printf("
去重后: ");
for(i = 0; i < new_n; i++) {
printf("%d ", a[i]);
}
printf("
新长度: %d", new_n);
}
3.编写一个函数matrix_transpose,接收一个3×3的整型矩阵,求其转置矩阵(行列互换)。在main函数中测试。
【答案】
#include <stdio.h>
void matrix_transpose(int mat[3][3]) {
int temp,i,j;
// 只交换上三角部分(不包括对角线)
for(i = 0; i < 3; i++) {
for(j = i + 1; j < 3; j++) {
// 交换mat[i][j]和mat[j][i]
temp = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = temp;
}
}
}
void print_matrix(int mat[3][3]) {
int i,j;
for(i = 0; i < 3; i++) {
for(j = 0; j < 3; j++) {
printf("%d\t", mat[i][j]);
}
printf("
");
}
}
main() {
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
printf("原矩阵:
");
print_matrix(matrix);
matrix_transpose(matrix);
printf("
转置后:
");
print_matrix(matrix);
}
4.编写一个函数array_rotate,接收一个整型数组和数组长度n,将数组循环右移k个位置(k由参数指定)。在main函数中测试。
【答案】
#include <stdio.h>
// 辅助函数:反转数组的指定区间
void reverse(int arr[], int start, int end) {
while(start < end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
void array_rotate(int arr[], int n, int k) {
if(n <= 1 || k % n == 0) return;
k = k % n; // 处理k大于n的情况
// 方法:三次反转法
// 1. 反转整个数组
reverse(arr, 0, n - 1);
// 2. 反转前k个元素
reverse(arr, 0, k - 1);
// 3. 反转剩余元素
reverse(arr, k, n - 1);
}
main() {
int a[] = {1, 2, 3, 4, 5, 6, 7};
int n = sizeof(a) / sizeof(a[0]);
int k = 3,i;
printf("原数组: ");
for(i = 0; i < n; i++) {
printf("%d ", a[i]);
}
array_rotate(a, n, k);
printf("
右移%d位后: ", k);
for(i = 0; i < n; i++) {
printf("%d ", a[i]);
}
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$