内容正文:
8.5节:用数组名作函数参数
一、单项选择题
1.以下关于数组名本质描述正确的是( )
A. 数组名是普通变量,可执行自增 arr++
B. 数组名代表数组首元素的地址常量
C. 数组名存储数组全部元素的值
D. 数组名等价于普通 int 指针变量
2.定义函数void swap(int *x,int *y),想要交换主函数变量 a、b 的值,正确调用语句是()
A. swap (a,b); B. swap (&a,&b);
C. swap (*a,*b); D. swap (int a,int b);
3.数组名作为函数实参传递给函数时,实际传递的内容是()
A. 数组中全部元素的数值 B. 数组首元素的地址
C. 数组定义的长度数字 D. 数组所有元素的地址
4.地址传递与值传递最大区别是()
A. 值传递只能传数字,地址传递只能传数组
B. 地址传递函数内修改形参会同步改变实参原始数据
C. 值传递运行速度更快
D. 地址传递会复制全部数据,占用更多内存
5.数组名作函数参数时,以下说法错误的是()
A. 不会复制数组所有元素,节省内存
B. 函数内通过指针修改数组元素,主函数数组同步变化
C. 形参数组可以自动获取原始数组长度
D. 形参可写 int arr [] 或 int *arr 两种形式
6.执行以下代码段的输出结果是()
#include <stdio.h>
void swap(int *x,int *y){
int *t=x;x=y;y=t;}
int main(){
int a=10,b=20;
swap(&a,&b);
printf("%d %d",a,b); }
A. 20 10 B. 10 20 C. 0 0 D. 随机数字
7.执行以下代码段的输出结果是()
#include <stdio.h>
void show(int *p)
{ printf("%d",*(p+3));}
int main()
{ int arr[]={2,4,6,8,10};
show(arr);
return 0; }
A. 6 B. 8 C. 10 D. 4
8.执行以下代码段的输出结果是()
#include <stdio.h>
void change(int x)
{ x=x*2;}
int main()
{ int a=9;
change(a);
printf("%d",a);
return 0; }
A. 18 B. 9 C. 0 D. 2
9.执行以下代码段的输出结果是()
#include <stdio.h>
void lenCalc(char *s)
{ int cnt=0;
while(*s!='\0')
{ cnt++;
s++;}
printf("%d",cnt);
}
int main()
{ char str[]="pear";
lenCalc(str);
return 0; }
A. 4 B. 5 C. 6 D. 0
10.执行以下代码段的输出结果是()
#include <stdio.h>
void modify(int *p)
{ *(p+1)=9;}
int main()
{ int num[]={1,2,3};
modify(num);
printf("%d",num[0]+num[1]+num[2]);
return 0; }
A. 6 B. 13 C. 12 D. 14
二、填空题。
1.普通 int 变量作为实参直接传给函数,属于________传递,函数内部修改形参不会影响主函数原始变量。
2.函数形参为int *p,主函数数组int num[6]={2,4,6,8,10,12}调用test(num),函数内执行*(p+3),取出的数字是___________。
3.定义void add(int *x){*x = *x + 7;},主函数int m=13; add(&m);,执行后 m 的数值为___________。
4.函数接收字符指针char *s="daisy",执行s += 3后,*s对应字符的 ASCII 十进制数值为___________。
5.int arr[]={1,3,5,7,9}传入函数void calc(int *p),函数执行printf("%d",*(p+1)+*(p+3));,输出数字为___________。
6.函数void add5(int *p){*p = *p + 5;},主函数int num=14; add5(&num);,执行结束后变量 num 的值为___________。
7.定义void calc(int *p){printf("%d",*(p+2)+*(p+4));},主函数数组int arr[]={2,5,1,9,3}调用 calc (arr),屏幕输出数字为___________。
8.主函数数组int data[]={6,2,8,1}传入void change(int *p){*(p+1)=10;},修改后数组全部元素累加和为___________。
9.void move(int arr[]){arr += 3; printf("%d",*arr);},主函数int num[]={9,2,5,7,4}调用 move (num),输出数字是___________。
10.主函数int m=7; void doubleNum(int x){x=x*2;}调用 doubleNum (m),执行完毕 m 的值为___________。
三、阅读程序题。
1.写出下列程序段的输出结果:________________。
#include <stdio.h>
#include <stdio.h>
void fun1(int x)
{
x = x + 8;
}
void fun2(int *p)
{
*p = *p + 8;
}
int main()
{
int a = 5, b = 5;
fun1(a);
fun2(&b);
printf("%d", a * b);
return 0;
}
2.写出下列程序段的输出结果:________________。
#include <stdio.h>
void calc(int *arr)
{
int i, sum = 0;
arr += 1;
for (i = 0; i < 3; i++)
{
if (*arr % 2 == 1)
sum = sum + *arr;
arr++;
}
printf("%d", sum);
}
int main()
{
int num[] = {2, 3, 6, 9, 1};
calc(num);
return 0;
}
3.写出下列程序段的输出结果:________________。
#include <stdio.h>
void mul(int *arr)
{
int res = 1;
arr++;
while (*arr != 1)
{
res = res * (*arr);
arr++;
}
printf("%d", res);
}
int main()
{
int num[] = {0, 2, 3, 5, 1};
mul(num);
return 0;
}
4.写出下列程序段的输出结果:________________。
#include <stdio.h>
void edit(int *p, int len)
{
int i;
for (i = 0; i < len; i++)
{
if (i % 2 == 0)
*(p + i) = *(p + i) * 2;
}
}
int main()
{
int arr[] = {3, 2, 4, 1};
edit(arr, 4);
printf("%d", arr[0] + arr[1] + arr[2] + arr[3]);
return 0;
}
5.写出下列程序段的输出结果:________________。
#include <stdio.h>
void countNoE(char *s)
{
int cnt = 0;
while (*s != '\0')
{
if (*s != 'e')
cnt++;
s++;
}
printf("%d", cnt);
}
int main()
{
char s[] = "elephant";
countNoE(s);
return 0;
}
6.写出下列程序段的输出结果:________________。
#include <stdio.h>
void addOne(int *p)
{
*(p + 1) += 1;
}
void mulTwo(int arr[], int n)
{
int i;
for(i=0;i<n;i+=2)
*(arr+i) *= 2;
}
int main()
{
int a[] = {2,4,6,8},sum=0,i;
mulTwo(a,4);
addOne(a);
for(i=0;i<4;i++)
sum += a[i];
printf("%d",sum);
return 0;
}
7.写出下列程序段的输出结果:________________。
#include <stdio.h>
int getEvenDigit(char *s)
{
int idx=0,sum=0;
while(*s)
{
if(idx%2==0 && *s>='0'&&*s<='9')
sum += (*s-'0');
s++;
idx++;
}
return sum;
}
int main()
{
char buf[] = "9s3k7p2";
printf("%d",getEvenDigit(buf));
return 0;
}
8.写出下列程序段的输出结果:________________。
#include <stdio.h>
void subOne(int *p)
{
*(p + 3) = *(p + 1) - *(p + 2);
}
void mulOdd(int arr[], int len)
{
int i;
for(i = 0; i < len; i++)
{
if(i % 2 == 1)
*(arr + i) = *(arr + i) * 3;
}
}
int main()
{
int num[] = {5, 2, 4, 9, 1},total = 0, i;
mulOdd(num, 5);
subOne(num);
for(i = 0; i < 5; i++)
total += num[i];
printf("%d", total);
return 0;
}
9.写出下列程序段的输出结果:________________。
#include <stdio.h>
void compress(int *p, int len)
{
int *write = p;
int i;
for(i = 0; i < len; i++)
{
if(*(p+i) % 3 != 0)
{
*write = *(p+i);
write++;
}
}
*write = 0;
}
int main()
{
int arr[6] = {3, 5, 9, 2, 12, 7},s = 0;
compress(arr, 6);
while(arr[s] != 0)
{
printf("%d", arr[s]);
s++;
}
return 0;
}
10.写出下列程序段的输出结果:________________。
#include <stdio.h>
void reverseArr(int *p, int len)
{
int *left = p;
int *right = p + len - 1;
int t;
while(left < right)
{
t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
int main()
{
int data[5] = {2, 6, 1, 8, 4};
reverseArr(data, 5);
printf("%d%d%d%d%d", data[0], data[1], data[2], data[3], data[4]);
return 0;
}
四、程序填空题(根据题意,将空缺的语句补上)
1.下列程序的功能是:自定义函数形参为int *arr,全程只用指针自增 / 偏移完成数组左移,不数组下标;每次把首指针元素暂存,全体指针向后覆盖,末尾填入暂存值;主函数传数组名(首地址)调用。
#include <stdio.h>
void leftShift(int *arr, int len, int n)
{
int i, temp;
int *p;
n = n % len;
for (i = 0; i < n; i++)
{
temp = *arr;
for (p = arr; p < _______①_____; p++)
{
*(p) = _______②______
}
*(arr + len - 1) = _____③____
}
}
int main()
{
int data[7] = {2,5,8,1,7,3,9};
int *p = data;
leftShift(data,7,3);
printf("平移结果:");
for(p = data; p < data + 7; p++)
printf("%d ",*p);
return 0;
}
2.下列程序的功能是:函数形参char *src, char *letter, char *num,仅用指针自增遍历原字符串,分别向两个目标指针写入字符;再独立指针函数反转数字串,指针操作无下标。
#include <stdio.h>
void splitStr(char *src, char *letter, char *num)
{
char *p = src, *l = letter, *n = num;
while (*p != '\0')
{
if(__________①________)
*l++ = *p;
else if(*p >= '0' && *p <= '9')
_______②_______
p++;
}
*l = '\0';
*n = '\0';
}
void reverseStr(char *s)
{
char *end = s;
char temp;
while (_______③______) end++;
end--;
while(s < end)
{
temp = *s;
*s = *end;
*end = temp;
s++;
end--;
}
}
int main()
{
char input[100],letter[100],num[100];
printf("输入混合字符串:");
gets(input);
splitStr(input,letter,num);
reverseStr(num);
printf("输出:%s%s",letter,num);
return 0;
}
3.下列程序的功能是:函数void calcPrime(int *arr, int len, int *sum, int *cnt),数组遍历依靠指针偏移;用两个 int 指针形参修改主函数外部变量,实现多结果带回,全程指针操作。
#include <stdio.h>
int isPrime(int num)
{
int i;
if(num < 2) return 0;
for(i=2;i*i<=num;i++)
if(num%i==0) return 0;
return 1;
}
void calcPrime(int *arr, int len, int *sum, int *cnt)
{
int *p = arr;
*sum = 0;
*cnt = 0;
while(p < arr + len)
{
if(_______①______)
{
*sum += *p;
______②_____
}
p++;
}
}
int main()
{
int num[8] = {4,7,11,15,2,19,9,5};
int sum,cnt;
calcPrime(num,8,&sum,&cnt);
if(cnt == 0)
printf("无素数");
else
printf("素数均值:%.1f",______③______);
return 0;
}
4.下列程序的功能是:双有序数组指针归并,函数void merge(int *a, int la, int *b, int lb, int *res),指针 p1、p2 分别遍历两个源数组,比较指针指向数值,写入结果指针。
#include <stdio.h>
void merge(int *a, int la, int *b, int lb, int *res)
{
int *p1 = a, *p2 = b, *p = res;
while(p1 < a + la && ______①_____)
{
if(*p1 < *p2)
*p++ = *p1++;
else
_______②______
}
while(p1 < a + la) *p++ = *p1++;
while(________③_______) *p++ = *p2++;
}
int main()
{
int arr1[4] = {1,3,5,9};
int arr2[5] = {2,4,7,8,10};
int out[20];
int *p = out;
merge(arr1,4,arr2,5,out);
printf("合并有序数组:");
for(p = out; p < out + 9; p++)
printf("%d ",*p);
return 0;
}
5.下列程序的功能是:字符指针遍历,统计连续元音最大长度,函数int maxVowel(char *s),单一指针遍历字符串,解引用判断元音字符,用局部变量记录连续长度。
#include <stdio.h>
int maxVowel(char *s)
{
char *p = s;
int cur = 0, maxLen = 0;
while(*p != '\0')
{
if(___________①_________)
{
cur++;
if(cur > maxLen) _______②______
}
else cur = 0;
_______③_______
}
return maxLen;
}
int main()
{
char str[] = "aaabeeeiixopuuuu";
printf("最长连续元音:%d",maxVowel(str));
return 0;
}
五、编程题。
1. 读写双 int 指针原地过滤数组偶数,仅保留奇数:函数void filterOdd(int *arr, int len),读指针遍历全部元素,写指针仅保存奇数,末尾指针写入标记值。
2.指针提取数字字符,双指针判断数字串是否回文:拆分两个指针函数:1. 指针遍历提取数字存入临时数组;2. 首尾指针判断回文,全部形参为 char * 指针。
3.指针筛选数组完全数存入新数组,编写要求如下:
①子函数用循环判断数字是否为完全数;
②主函数接收源数组指针、长度、目标数组指针,双指针遍历源数组,把完全数写入目标数组,末尾标记 - 1;
③主函数传内置数组调用,指针遍历输出所有完全数,全程不用下标[]。
4.字符指针统计四类字符数量,指针带回计数,编写要求如下:
①函数接收字符串指针与 4 个 int 指针,指针遍历字符串,区分大写、小写、数字、符号四类字符计数;
②主函数传入混合字符数组,打印四类统计结果,仅用指针读写字符。
5.双指针对撞,反转数组指定区间元素,编写要求如下:
①函数接收数组指针、反转起止下标,左右指针定位区间首尾;
②双指针向内靠拢交换元素,左 >= 右结束;
③主函数调用后指针遍历打印完整数组,全程无下标。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
8.5节:用数组名作函数参数
一、单项选择题
1.以下关于数组名本质描述正确的是( )
A. 数组名是普通变量,可执行自增 arr++
B. 数组名代表数组首元素的地址常量
C. 数组名存储数组全部元素的值
D. 数组名等价于普通 int 指针变量
【答案】B
【解析】数组名是首元素地址常量,地址不可修改,不能做 arr++、arr=xxx 操作。
2.定义函数void swap(int *x,int *y),想要交换主函数变量 a、b 的值,正确调用语句是( )
A. swap (a,b); B. swap (&a,&b);
C. swap (*a,*b); D. swap (int a,int b);
【答案】B
【解析】形参是 int 指针,实参必须传入变量地址,&a、&b 取出变量内存地址传给指针形参。
3.数组名作为函数实参传递给函数时,实际传递的内容是( )
A. 数组中全部元素的数值 B. 数组首元素的地址
C. 数组定义的长度数字 D. 数组所有元素的地址
【答案】B
【解析】数组名传参属于地址传递,仅把数组首地址传给形参,不会复制整个数组。
4.地址传递与值传递最大区别是( )
A. 值传递只能传数字,地址传递只能传数组
B. 地址传递函数内修改形参会同步改变实参原始数据
C. 值传递运行速度更快
D. 地址传递会复制全部数据,占用更多内存
【答案】B
【解析】地址传递共享同一块内存空间,函数内通过指针修改内容,主函数实参同步变化;值传递是副本互不影响。
5.数组名作函数参数时,以下说法错误的是( )
A. 不会复制数组所有元素,节省内存
B. 函数内通过指针修改数组元素,主函数数组同步变化
C. 形参数组可以自动获取原始数组长度
D. 形参可写 int arr [] 或 int *arr 两种形式
【答案】C
【解析】形参只是指针,丢失原数组长度信息,无法直接获取原始数组大小,需要额外传长度参数。
6.执行以下代码段的输出结果是( )
#include <stdio.h>
void swap(int *x,int *y){
int *t=x;x=y;y=t;}
int main(){
int a=10,b=20;
swap(&a,&b);
printf("%d %d",a,b); }
A. 20 10 B. 10 20 C. 0 0 D. 随机数字
【答案】B
【解析】仅交换指针副本 x、y,没有操作a、b 对应的内存空间,原始数值保持不变。
7.执行以下代码段的输出结果是( )
#include <stdio.h>
void show(int *p)
{ printf("%d",*(p+3));}
int main()
{ int arr[]={2,4,6,8,10};
show(arr);
return 0; }
A. 6 B. 8 C. 10 D. 4
【答案】B
【解析】数组首地址传给指针 p,p+3 偏移 3 个 int 单位,对应下标 3 元素 8。
8.执行以下代码段的输出结果是( )
#include <stdio.h>
void change(int x)
{ x=x*2;}
int main()
{ int a=9;
change(a);
printf("%d",a);
return 0; }
A. 18 B. 9 C. 0 D. 2
【答案】B
【解析】普通变量值传递,函数内修改的是副本 x,主函数 a 数值不变,仍为 9。
9.执行以下代码段的输出结果是( )
#include <stdio.h>
void lenCalc(char *s)
{ int cnt=0;
while(*s!='\0')
{ cnt++;
s++;}
printf("%d",cnt);
}
int main()
{ char str[]="pear";
lenCalc(str);
return 0; }
A. 4 B. 5 C. 6 D. 0
【答案】A
【解析】pear 包含 4 个有效字母,结束符不计入计数,cnt 最终等于 4。
10.执行以下代码段的输出结果是( )
#include <stdio.h>
void modify(int *p)
{ *(p+1)=9;}
int main()
{ int num[]={1,2,3};
modify(num);
printf("%d",num[0]+num[1]+num[2]);
return 0; }
A. 6 B. 13 C. 12 D. 14
【答案】B
【解析】函数修改下标 1 元素为 9,数组变为 {1,9,3},1+9+3=13。
二、填空题。
1.普通 int 变量作为实参直接传给函数,属于________传递,函数内部修改形参不会影响主函数原始变量。
【答案】值
【解析】值传递开辟独立内存副本,副本修改不作用于实参。
2.函数形参为int *p,主函数数组int num[6]={2,4,6,8,10,12}调用test(num),函数内执行*(p+3),取出的数字是___________。
【答案】8
【解析】p 指向下标 0,p+3 偏移 3 位,对应数组下标 3 元素 8。
3.定义void add(int *x){*x = *x + 7;},主函数int m=13; add(&m);,执行后 m 的数值为___________。
【答案】20
【解析】*x 修改 m 原值,13+7=20。
4.函数接收字符指针char *s="daisy",执行s += 3后,*s对应字符的 ASCII 十进制数值为___________。
【答案】115
【解析】d (0),a (1),i (2),s (3),字符 s 的 ASCII 码为 115。
5.int arr[]={1,3,5,7,9}传入函数void calc(int *p),函数执行printf("%d",*(p+1)+*(p+3));,输出数字为___________。
【答案】10
【解析】(p+1)=3,(p+3)=7,3+7=10。
6.函数void add5(int *p){*p = *p + 5;},主函数int num=14; add5(&num);,执行结束后变量 num 的值为___________。
【答案】19
【解析】地址传递直接修改原变量,14+5=19。
7.定义void calc(int *p){printf("%d",*(p+2)+*(p+4));},主函数数组int arr[]={2,5,1,9,3}调用 calc (arr),屏幕输出数字为___________。
【答案】4
【解析】(p+2)=1,(p+4)=3,1+3=4。
8.主函数数组int data[]={6,2,8,1}传入void change(int *p){*(p+1)=10;},修改后数组全部元素累加和为___________。
【答案】25
【解析】修改后数组 {6,10,8,1},6+10+8+1=25。
9.void move(int arr[]){arr += 3; printf("%d",*arr);},主函数int num[]={9,2,5,7,4}调用 move (num),输出数字是___________。
【答案】7
【解析】形参 arr 是指针变量,向后偏移 3 位,指向下标 3 元素 7。
10.主函数int m=7; void doubleNum(int x){x=x*2;}调用 doubleNum (m),执行完毕 m 的值为___________。
【答案】7
【解析】值传递仅修改形参副本,原变量 m 保持原值不变。
三、阅读程序题。
1.写出下列程序段的输出结果:________________。
#include <stdio.h>
#include <stdio.h>
void fun1(int x)
{
x = x + 8;
}
void fun2(int *p)
{
*p = *p + 8;
}
int main()
{
int a = 5, b = 5;
fun1(a);
fun2(&b);
printf("%d", a * b);
return 0;
}
【答案】65
2.写出下列程序段的输出结果:________________。
#include <stdio.h>
void calc(int *arr)
{
int i, sum = 0;
arr += 1;
for (i = 0; i < 3; i++)
{
if (*arr % 2 == 1)
sum = sum + *arr;
arr++;
}
printf("%d", sum);
}
int main()
{
int num[] = {2, 3, 6, 9, 1};
calc(num);
return 0;
}
【答案】12
3.写出下列程序段的输出结果:________________。
#include <stdio.h>
void mul(int *arr)
{
int res = 1;
arr++;
while (*arr != 1)
{
res = res * (*arr);
arr++;
}
printf("%d", res);
}
int main()
{
int num[] = {0, 2, 3, 5, 1};
mul(num);
return 0;
}
【答案】30
4.写出下列程序段的输出结果:________________。
#include <stdio.h>
void edit(int *p, int len)
{
int i;
for (i = 0; i < len; i++)
{
if (i % 2 == 0)
*(p + i) = *(p + i) * 2;
}
}
int main()
{
int arr[] = {3, 2, 4, 1};
edit(arr, 4);
printf("%d", arr[0] + arr[1] + arr[2] + arr[3]);
return 0;
}
【答案】17
5.写出下列程序段的输出结果:________________。
#include <stdio.h>
void countNoE(char *s)
{
int cnt = 0;
while (*s != '\0')
{
if (*s != 'e')
cnt++;
s++;
}
printf("%d", cnt);
}
int main()
{
char s[] = "elephant";
countNoE(s);
return 0;
}
【答案】6
6.写出下列程序段的输出结果:________________。
#include <stdio.h>
void addOne(int *p)
{
*(p + 1) += 1;
}
void mulTwo(int arr[], int n)
{
int i;
for(i=0;i<n;i+=2)
*(arr+i) *= 2;
}
int main()
{
int a[] = {2,4,6,8},sum=0,i;
mulTwo(a,4);
addOne(a);
for(i=0;i<4;i++)
sum += a[i];
printf("%d",sum);
return 0;
}
【答案】29
7.写出下列程序段的输出结果:________________。
#include <stdio.h>
int getEvenDigit(char *s)
{
int idx=0,sum=0;
while(*s)
{
if(idx%2==0 && *s>='0'&&*s<='9')
sum += (*s-'0');
s++;
idx++;
}
return sum;
}
int main()
{
char buf[] = "9s3k7p2";
printf("%d",getEvenDigit(buf));
return 0;
}
【答案】21
8.写出下列程序段的输出结果:________________。
#include <stdio.h>
void subOne(int *p)
{
*(p + 3) = *(p + 1) - *(p + 2);
}
void mulOdd(int arr[], int len)
{
int i;
for(i = 0; i < len; i++)
{
if(i % 2 == 1)
*(arr + i) = *(arr + i) * 3;
}
}
int main()
{
int num[] = {5, 2, 4, 9, 1},total = 0, i;
mulOdd(num, 5);
subOne(num);
for(i = 0; i < 5; i++)
total += num[i];
printf("%d", total);
return 0;
}
【答案】18
9.写出下列程序段的输出结果:________________。
#include <stdio.h>
void compress(int *p, int len)
{
int *write = p;
int i;
for(i = 0; i < len; i++)
{
if(*(p+i) % 3 != 0)
{
*write = *(p+i);
write++;
}
}
*write = 0;
}
int main()
{
int arr[6] = {3, 5, 9, 2, 12, 7},s = 0;
compress(arr, 6);
while(arr[s] != 0)
{
printf("%d", arr[s]);
s++;
}
return 0;
}
【答案】527
10.写出下列程序段的输出结果:________________。
#include <stdio.h>
void reverseArr(int *p, int len)
{
int *left = p;
int *right = p + len - 1;
int t;
while(left < right)
{
t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
int main()
{
int data[5] = {2, 6, 1, 8, 4};
reverseArr(data, 5);
printf("%d%d%d%d%d", data[0], data[1], data[2], data[3], data[4]);
return 0;
}
【答案】48162
四、程序填空题(根据题意,将空缺的语句补上)
1.下列程序的功能是:自定义函数形参为int *arr,全程只用指针自增 / 偏移完成数组左移,不数组下标;每次把首指针元素暂存,全体指针向后覆盖,末尾填入暂存值;主函数传数组名(首地址)调用。
#include <stdio.h>
void leftShift(int *arr, int len, int n)
{
int i, temp;
int *p;
n = n % len;
for (i = 0; i < n; i++)
{
temp = *arr;
for (p = arr; p < _______①_____; p++)
{
*(p) = _______②______
}
*(arr + len - 1) = _____③____
}
}
int main()
{
int data[7] = {2,5,8,1,7,3,9};
int *p = data;
leftShift(data,7,3);
printf("平移结果:");
for(p = data; p < data + 7; p++)
printf("%d ",*p);
return 0;
}
【答案】①arr + len - 1 ②*(p + 1); ③temp;
2.下列程序的功能是:函数形参char *src, char *letter, char *num,仅用指针自增遍历原字符串,分别向两个目标指针写入字符;再独立指针函数反转数字串,指针操作无下标。
#include <stdio.h>
void splitStr(char *src, char *letter, char *num)
{
char *p = src, *l = letter, *n = num;
while (*p != '\0')
{
if(__________①________)
*l++ = *p;
else if(*p >= '0' && *p <= '9')
_______②_______
p++;
}
*l = '\0';
*n = '\0';
}
void reverseStr(char *s)
{
char *end = s;
char temp;
while (_______③______) end++;
end--;
while(s < end)
{
temp = *s;
*s = *end;
*end = temp;
s++;
end--;
}
}
int main()
{
char input[100],letter[100],num[100];
printf("输入混合字符串:");
gets(input);
splitStr(input,letter,num);
reverseStr(num);
printf("输出:%s%s",letter,num);
return 0;
}
【答案】①(*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')
②*n++ = *p; ③*end != '\0'
3.下列程序的功能是:函数void calcPrime(int *arr, int len, int *sum, int *cnt),数组遍历依靠指针偏移;用两个 int 指针形参修改主函数外部变量,实现多结果带回,全程指针操作。
#include <stdio.h>
int isPrime(int num)
{
int i;
if(num < 2) return 0;
for(i=2;i*i<=num;i++)
if(num%i==0) return 0;
return 1;
}
void calcPrime(int *arr, int len, int *sum, int *cnt)
{
int *p = arr;
*sum = 0;
*cnt = 0;
while(p < arr + len)
{
if(_______①______)
{
*sum += *p;
______②_____
}
p++;
}
}
int main()
{
int num[8] = {4,7,11,15,2,19,9,5};
int sum,cnt;
calcPrime(num,8,&sum,&cnt);
if(cnt == 0)
printf("无素数");
else
printf("素数均值:%.1f",______③______);
return 0;
}
【答案】①isPrime(*p) ②(*cnt)++; ③(double)sum/cnt
4.下列程序的功能是:双有序数组指针归并,函数void merge(int *a, int la, int *b, int lb, int *res),指针 p1、p2 分别遍历两个源数组,比较指针指向数值,写入结果指针。
#include <stdio.h>
void merge(int *a, int la, int *b, int lb, int *res)
{
int *p1 = a, *p2 = b, *p = res;
while(p1 < a + la && ______①_____)
{
if(*p1 < *p2)
*p++ = *p1++;
else
_______②______
}
while(p1 < a + la) *p++ = *p1++;
while(________③_______) *p++ = *p2++;
}
int main()
{
int arr1[4] = {1,3,5,9};
int arr2[5] = {2,4,7,8,10};
int out[20];
int *p = out;
merge(arr1,4,arr2,5,out);
printf("合并有序数组:");
for(p = out; p < out + 9; p++)
printf("%d ",*p);
return 0;
}
【答案】①p2 < b + lb ②*p++ = *p2++; ③p2 < b + lb
5.下列程序的功能是:字符指针遍历,统计连续元音最大长度,函数int maxVowel(char *s),单一指针遍历字符串,解引用判断元音字符,用局部变量记录连续长度。
#include <stdio.h>
int maxVowel(char *s)
{
char *p = s;
int cur = 0, maxLen = 0;
while(*p != '\0')
{
if(___________①_________)
{
cur++;
if(cur > maxLen) _______②______
}
else cur = 0;
_______③_______
}
return maxLen;
}
int main()
{
char str[] = "aaabeeeiixopuuuu";
printf("最长连续元音:%d",maxVowel(str));
return 0;
}
【答案】①*p=='a'||*p=='e'||*p=='i'||*p=='o'||*p=='u'
②maxLen = cur; ③p++;
五、编程题。
1. 读写双 int 指针原地过滤数组偶数,仅保留奇数:函数void filterOdd(int *arr, int len),读指针遍历全部元素,写指针仅保存奇数,末尾指针写入标记值。
【参考代码】
#include <stdio.h>
void filterOdd(int *arr, int len)
{
int *read = arr, *write = arr;
while(read < arr + len)
{
if(*read % 2 != 0)
{
*write = *read;
write++;
}
read++;
}
*write = -1;
}
int main()
{
int num[9] = {3,6,9,2,7,10,1,15,4};
int *p = num;
filterOdd(num,9);
printf("过滤偶数:");
while(*p != -1)
{
printf("%d ",*p);
p++;
}
return 0;
}
2.指针提取数字字符,双指针判断数字串是否回文:拆分两个指针函数:1. 指针遍历提取数字存入临时数组;2. 首尾指针判断回文,全部形参为 char * 指针。
【参考代码】
#include <stdio.h>
int getDigit(char *src, char *digit)
{
char *p = src, *d = digit;
while(*p != '\0')
{
if(*p >= '0' && *p <= '9')
*d++ = *p;
p++;
}
*d = '\0';
return d - digit;
}
int isPalindrome(char *s)
{
char *left = s;
char *right = s;
while(*right != '\0') right++;
right--;
while(left < right)
{
if(*left != *right) return 0;
left++;
right--;
}
return 1;
}
int main()
{
char input[100],dig[100];
int len;
printf("输入混合字符串:");
gets(input);
len = getDigit(input,dig);
if(len == 0)
printf("无数字");
else if(isPalindrome(dig))
printf("数字是回文");
else
printf("数字非回文");
return 0;
}
3.指针筛选数组完全数存入新数组,编写要求如下:
①子函数用循环判断数字是否为完全数;
②主函数接收源数组指针、长度、目标数组指针,双指针遍历源数组,把完全数写入目标数组,末尾标记 - 1;
③主函数传内置数组调用,指针遍历输出所有完全数,全程不用下标[]。
【参考代码】
#include <stdio.h>
int isPerfect(int num)
{
int i, sum = 0;
if(num < 2) return 0;
for(i = 1; i < num; i++)
if(num % i == 0) sum += i;
return sum == num ? 1 : 0;
}
void pickPerfect(int *src, int len, int *dest)
{
int *read = src, *write = dest;
while(read < src + len)
{
if(isPerfect(*read))
*write++ = *read;
read++;
}
*write = -1;
}
int main()
{
int source[10] = {6, 12, 28, 9, 15, 496, 33, 8, 1, 20};
int res[100], *p;
pickPerfect(source, 10, res);
printf("完全数:");
for(p = res; *p != -1; p++)
printf("%d ", *p);
return 0;
}
4.字符指针统计四类字符数量,指针带回计数,编写要求如下:
①函数接收字符串指针与 4 个 int 指针,指针遍历字符串,区分大写、小写、数字、符号四类字符计数;
②主函数传入混合字符数组,打印四类统计结果,仅用指针读写字符。
【参考代码】
#include <stdio.h>
void statAllChar(char *str, int *cntUp, int *cntLow, int *cntNum, int *cntSym)
{
char *p = str;
*cntUp = *cntLow = *cntNum = *cntSym = 0;
while(*p != '\0')
{
if(*p >= 'A' && *p <= 'Z') (*cntUp)++;
else if(*p >= 'a' && *p <= 'z') (*cntLow)++;
else if(*p >= '0' && *p <= '9') (*cntNum)++;
else (*cntSym)++;
p++;
}
}
int main()
{
char buf[] = "Pro#GrAm78!s9t@r";
int upper, lower, number, symbol;
statAllChar(buf, &upper, &lower, &number, &symbol);
printf("大写:%d
小写:%d
数字:%d
符号:%d", upper, lower, number, symbol);
return 0;
}
5.双指针对撞,反转数组指定区间元素,编写要求如下:
①函数接收数组指针、反转起止下标,左右指针定位区间首尾;
②双指针向内靠拢交换元素,左 >= 右结束;
③主函数调用后指针遍历打印完整数组,全程无下标。
【参考代码】
#include <stdio.h>
void reversePart(int *arr, int start, int end)
{
int *left = arr + start, *right = arr + end, temp;
while(left < right)
{
temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
int main()
{
int data[8] = {1, 3, 5, 7, 9, 11, 13, 15}, *p;
reversePart(data, 2, 6);
printf("分段反转数组:");
for(p = data; p < data + 8; p++)
printf("%d ", *p);
return 0;
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$