时间范围:2022年10月31日-2022年11月6日
2022年10月31日
/*
* 作者:徐子宸
* 来源:原创
* 功能:用指针实现冒泡排序
* 日期:2022年10月31日
*
*/
#include<stdio.h>
int input(int a[],int n)
{
int *p=a;
n=5;
printf("请输入待排序的数\n");
for(int i=0;i<5;i++)
{
scanf("%d",&p[i]);
}
}
int sort(int a[],int n)
{
int *p=a;
for(int i=0;i<5;i++)
{
for(int j=0;j<5-i;j++)
{
if(p[j]>p[j+1])
{
int tmp=p[j];
p[j]=p[j+1];
p[j+1]=tmp;
}
}
}
}
int output(int a[],int n)
{
int *p=a;
printf("已完成排序\n");
for(int i=0;i<5;i++)
{
printf("%d\n",p[i]);
}
}
int main()
{
int a[5]={0};
input(a,5);
sort(a,5);
output(a,5);
//int i,j;
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
float jia(float a,float b)
{
return a+b;
}
float jian(float a,float b)
{
return a-b;
}
float cheng(float a,float b)
{
return a*b;
}
float chu(float a,float b)
{
return a/b;
}
int main()
{
float a,b;
char c;
char str[10]={'\0'};
//while(1);
printf("输入quit退出,goon继续\n");
while(1)
{
gets(str);
if(strcmp(str,"quit")==0)
{
exit(0);
}
else if(strcmp(str,"goon")==0)
{
printf("请输入要计算的数字和操作\n");
scanf("%f%*c%c%f",&a,&c,&b);
switch(c)
{
case '+':
//jia(a,b);
printf("%f\n",jia(a,b));
break;
case '-':
//jian(a,b);
printf("%f\n",jian(a,b));
break;
case '*':
//cheng(a,b);
printf("%f\n",cheng(a,b));
break;
case '/':
//chu(a,b);
printf("%f\n",chu(a,b));
break;
default:
printf("ERROR");
break;
}
}
}
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
char b='c';
char *q=&b;
printf("%ld\n",sizeof(int *));
printf("%ld\n",sizeof(char *));
return 0;
}
#include<stdio.h>
int swap(int x,int y)
{
int temp=x;
x=y;
y=temp;
}
int main()
{
int x=3;
int y=4;
swap(x,y);
printf("x=%d,y=%d\n",x,y);
return 0;
}
#include<stdio.h>
int swap(int *x,int *y)
{
int temp=*x;
*x=*y;
*y=temp;
printf("x=%d,y=%d\n",*x,*y);
}
int main()
{
int x=3,y=4;
swap(&x,&y);
printf("x=%d,y=%d\n",x,y);
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
printf("%d",*&a);
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
*p=20;
printf("%d",*p);
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
printf("%d\n",*p);
*p=20;
printf("%d\n",a);
printf("%d\n",*&a);
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
int b=20;
*p=b;
printf("%p\n",&a);
printf("%p\n",p);
printf("%d\n",*p);
printf("%p\n",&b);
printf("%p\n",p);
printf("%d\n",*p);
return 0;
}
#include<stdio.h>
int main()
{
int *p;
printf("%p\n",p);
return 0;
}
#include<stdio.h>
int main()
{
int *p;
p=NULL;
printf("%p\n",p);
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
const int *p=&a;
printf("%p\n",p);
int b=20;
p=&b;
printf("%p\n",p);
return 0;
}
#include<stdio.h>
int main()
{
const int *p=&a;
int b;
int a;
printf("%p\n",*p);
*p=b;
printf("%p\n",*p);
return 0;
}
#include<stdio.h>
int main()
{
int a=20,b=10;
int * const p=&a;
*p=10;
*p=20;
printf("%d\n",*p);
return 0;
}
#include<stdio.h>
int main()
{
int a[5];
int *p=a;
for(int i=0;i<5;i++)
{
scanf("%d",&p[i]);
}
for(int i=0;i<5;i++)
{
printf("%d\n",p[i]);
}
return 0;
}
#include<stdio.h>
int main()
{
int a[5];
int *p=a;
for(int i=0;i<5;i++)
{
scanf("%d",p+i);
}
for(int i=0;i<5;i++)
{
printf("%d\n",*(p+i));
}
return 0;
}
#include<stdio.h>
int main()
{
int a[5];
int *p=a;
for(int i=0;i<5;i++)
{
scanf("%d",p++);
}
p=a;
for(int i=0;i<5;i++)
{
printf("%d\n",*(p++));
}
return 0;
}
#include<stdio.h>
int main()
{
int *p=arr;
for(int i=0;i<5;i++)
{
scanf("%d\n",&p[i]);
}
for(int i=0;i<5;i++)
{
printf("%d\n",p[i]);
}
return 0;
}
#include<stdio.h>
int main()
{
int a[5];
int *p=a;
for(int i=0;i<5;i++)
{
scanf("%d",p++);
}
/*for(int i=0;i<5;i++)
{
printf("%d\n",*(p--));
}*/
for(int i=0;i<5;i++)
{
printf("%d\n",*(--p));
}
return 0;
}
#include<stdio.h>
int swap(int *a,int *b)
{
int c=*a;
*a=*b;
*b=c;
}
int main()
{
int a=10,b=20;
printf("a=%d,b=%d\n",a,b);
return 0;
}
#include<stdio.h>
int swap(int *a,int *b)
{
int *temp;
*temp=*a;
*a=*b;
*b=*temp;
printf("a=%d,b=%d\n",*a,*b);
}
int main()
{
int a=10,b=20;
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
/*
* 段错误
*
*/
2022年11月1日
#include<stdio.h>
int my_strcat(char *s,char *q)
{
while(*s!='\0')
{
s++;
}
while(*q!='\0')
{
*s=*q;
q++;
s++;
}
}
int main()
{
char str[50]="aaaaa";
char str1[50]="bbbbb";
my_strcat(str,str1);
printf("%s",str);
return 0;
}
#include<stdio.h>
int my_strcmp(char *s,char *q)
{
while(*s==*q&&*q!=0)
{
s++;
q++;
}
if(*s>*q)
{
printf(">\n");
}
else if(*s<*q)
{
printf("<\n");
}
else
{
printf("=\n");
}
}
int main()
{
char str[100]="xuzichen";
char str1[100]="zhaozhanqin";
my_strcmp(str,str1);
return 0;
}
#include<stdio.h>
int main()
{
char str1[100]={'\0'};
char str2[100]={'\0'};
gets(str1);
gets(str2);
int i=0;
int j=0;
while(str1[i]!='\0')
{
i++;
}
while(str2[j]!='\0')
{
str1[i]=str2[j];
i++;
j++;
}
puts(str1);
return 0;
}
#include<stdio.h>
int main()
{
char str1[100]={'\0'};
char str2[100]={'\0'};
gets(str1);
gets(str2);
int i=0;
while(str2[i]!='\0')
{
str1[i]=str2[i];
i++;
}
str1[i]='\0';
puts(str1);
return 0;
}
#include<stdio.h>
/*
* 作者:徐子宸
* 来源:22091班上课笔记
* 功能:实现字符串的拷贝
*
*
*
*/
int main()
{
char *str="China";
char *atr="country";
char *p=atr;
char *q=atr;
int i=0;
while(*(p++)!='\0')
{
*(q++)=*(p++);
//i++;
}
p[i]='\0';
puts(str);
return 0;
}
#include<stdio.h>
int input(int n,int *p)
{
//int i=0;
for(int i=0;i<n;i++)
{
scanf("%d",&p[i]);
}
}
int output(int n,int *p)
{
for(int i=0;i<n;i++)
{
printf("%d ",p[i]);
}
}
int sort(int n,int *p)
{
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(p[j]>p[j+1])
{
int temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
}
int main()
{
int arr[5]={0};
input(5,arr);
sort(5,arr);
output(5,arr);
return 0;
}
#include<stdio.h>
void my_strcpy(char *p,char *q)
{
while(*q!='\0')
{
*q=*p;
p++;
q++;
}
*p='\0';
}
int main()
{
char str[100]="abcde";
char str1[100]="aa";
my_strcpy(str,str1);
puts(str);
return 0;
}
/*
* 有问题
*
*
*/
#include<stdio.h>
int my_strlen(char *s)
{
char *p=s;
while(*p!='\0')
{
p++;
}
return p-s;
}
int main()
{
char str[10]="abcde";
printf("%d",my_strlen(str));
return 0;
}
#include<stdio.h>
int my_strlen(char *s)
{
char *p=s;
while(*(p++)!='\0');
return p-s-1;
}
int main()
{
char *a="abcde";
printf("%d",my_strlen(a));
return 0;
}
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int *p=&arr[0];
int *q=&arr[1];
printf("%ld",q-p);
return 0;
}
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int *p=&arr[0];
int *q=&arr[1];
printf("%p\n",q);
printf("%p\n",p);
printf("%p\n",q-p);
printf("%d\n",q-p);
return 0;
}
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int *p=arr;
printf("%p\n",p);
p++;
printf("%p\n",p);
printf("%p\n",&arr[1]);
return 0;
}
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int *p=arr;
printf("%p\n",p);
printf("%p\n",&arr[0]);
p++;
printf("%p\n",p);
printf("%p\n",&arr[1]);
p--;
printf("%p\n",p);
printf("%p\n",&arr[0]);
return 0;
}
/*
* 指针的运算
*
*/
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int *p=arr;
printf("%p\n",p);
printf("%p\n",&arr[0]);
p++;
printf("%p\n",p);
printf("%p\n",&arr[1]);
p--;
printf("%p\n",p);
printf("%p\n",&arr[0]);
p+1;
printf("%p\n",p);
p-1;
printf("%p\n",p);
return 0;
}
/*
* p++/p-- 往地址增大或减小的方向移动一个数据类型的大小,p的指向发生了改变
* p+1/p-1 往地址增大或减小的方向移动一个数据类型的大小,p的指向未发生改变
*
*
*/
#include<stdio.h>
int main()
{
char a[10]; // 错误
a[10]="abcde";
char b[10]; // 错误
b="abcde";
char *c; // 错误
*c="abcde";
char *d; // 改变指针指向
d="abcde";
char *e="abcde"; // 错误
*e="ab";
char f[10]="abcde"; // 正确
char *p;
p=f;
char g[10]="abcde"; // 正确
char *q=g;
q=&g[2];
char *h=NULL; // 正确
h="abcde";
return 0;
}
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
for(int i=0;i<5;i++)
{
printf("%d",arr[i]);
}
return 0;
}
#include<stdio.h>
int main()
{
char arr[5]="abcd";
for(int i=0;i<5;i++)
{
printf("%c",arr[i]);
}
return 0;
}
#include<stdio.h>
int main()
{
char arr[5]="abcd";
printf("%s",arr);
return 0;
}
#include<stdio.h>
int main()
{
char str[3][20]={"aaaa","bbbb","cccc"};
int i;
printf("%s",str[i]);
return 0;
}
#include<stdio.h>
int main()
{
char *s="abcde";
*s="a";
return 0;
}
#include<stdio.h>
int main()
{
char str[10]="abcde";
char *p=str;
printf("%s\n",p);
p=&str[2];
printf("%s\n",p);
printf("%s\n",str);
return 0;
}
#include<stdio.h>
int main()
{
char str[10]="abcde";
printf("%s",str[2]);
return 0;
}
#include<stdio.h>
int main()
{
char *p="abcde";
printf("%c\n",*p);
printf("%s\n",*p);
printf("%s\n",p);
printf("%d\n",*p);
return 0;
}
#include<stdio.h>
int main()
{
char *s="abcde";
s++;
printf("%s\n",s);
s++;
printf("%s\n",s);
s++;
printf("%s\n",s);
s++;
printf("%s\n",s);
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
int **q=&p;
printf("%d\n",sizeof(p));
printf("%d\n",sizeof(q));
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
int **q=&p;
printf("%p\n",&a);
printf("%p\n",p);
printf("%p\n",*q);
printf("%p\n",&p);
printf("%p\n",q);
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
int **q=&p;
printf("%d\n",*p);
printf("%p\n",*q);
printf("%p\n",**q);
printf("%p\n",p);
printf("%p\n",&a);
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
int **s=&p;
printf("%d\n",**s);
printf("%p\n",&a);
printf("%p\n",p);
printf("%p\n",*s);
int b=20;
*s=&b;
printf("%p\n",&b);
printf("%p\n",p);
printf("%p\n",*s);
return 0;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
int b=20;
int *pp=&b;
int const **s=&p;
**s=*pp;
s=&pp;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
int b=20;
int *pp=&b;
int ** const s=&p;
**s=*pp;
s=&pp;
}
#include<stdio.h>
int main()
{
int a=10;
int *p=&a;
int b=20;
int *pp=&b;
int * const * s=&p;
**s=*pp;
s=&pp;
}
#include<stdio.h>
int main()
{
char *str[3]={"abcde","qwert","zxcvb"};
int i=0;
for(i=0;i<3;i++)
{
printf("%s\n",*str[i]);
}
return 0;
}
2022年11月2日
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int (*p)[5]=&arr;
printf("%p\n",arr);
printf("%p\n",&arr);
printf("%p\n",&arr[0]);
printf("%p\n",p);
return 0;
}
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int (*p)[5]=&arr;
printf("%p\n",p);
int arr1[5]={1,2,3,4,5};
//int arr1[3]={1,2,3};
p=&arr1;
printf("%p\n",p);
return 0;
}
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int (*p)[5]=&arr;
printf("%p\n",p);
p++;
printf("%p\n",p);
return 0;
}
/*
* 作者:徐子宸
* 来源:原创
* 功能:用指针实现冒泡排序
* 日期:2022年10月31日
*
*/
#include<stdio.h>
int input(int (*p)[5]/*,int n*/)
{
//int *p=a;
//n=5;
printf("请输入待排序的数\n");
for(int i=0;i<5;i++)
{
scanf("%d",&(*p)[i]);
}
}
int sort(int (*p)[5]/*,int n*/)
{
//int *p=a;
for(int i=0;i<5-1/* i<2 i<1 */;i++)
{
for(int j=0;j<5-1-i;j++)
{
if((*p)[j]>(*p)[j+1])
{
int tmp=(*p)[j];
(*p)[j]=(*p)[j+1];
(*p)[j+1]=tmp;
}
}
}
}
int output(int (*p)[5]/*,int n*/)
{
//int *p=a;
printf("已完成排序\n");
for(int i=0;i<5;i++)
{
printf("%d\n",(*p)[i]);
}
}
int main()
{
int a[5]={0};
int (*p)[5]=&a;
input(&a/*,5*/);
sort(&a/*,5*/);
output(&a/*,5*/);
//int i,j;
return 0;
}
/*
* 思路分析:
* 输入元素:1 9 4 2 6
* 第一趟:
* 1 9 4 2 6
* 1 4 9 2 6
* 1 4 2 9 6
* 1 4 2 6 9
* 第二趟:
* 1 4 2 6 9
* 1 2 4 6 9
*
*
*
*
*
*
*
*
*
*
*
*
*/
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int (*p)[5]=&arr;
for(int i=0;i<5;i++)
{
printf("%d\n",*(arr+i));
}
for(int i=0;i<5;i++)
{
printf("%d\n",*(*p+i));
}
for(int i=0;i<5;i++)
{
printf("%d\n",*(*p++));
}
for(int i=0;i<5;i++)
{
printf("%d\n",*((*p)++));
}
}
#include<stdio.h>
int main()
{
int arr[5];
int (*p)[5]=&arr;
//int i;
for(int i=0;i<5;i++)
{
scanf("%d",&(*p)[i]);
}
for(int i=0;i<5;i++)
{
printf("%d",(*p)[i]);
}
}
#include<stdio.h>
int main()
{
int arr[5];
int (*p)[5]=&arr;
//int i;
for(int i=0;i<5;i++)
{
scanf("%d",&*(*p+i));
}
for(int i=0;i<5;i++)
{
printf("%d",(*p)[i]);
}
return 0;
}
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int (*p)[5]=&arr;
printf("%d\n",sizeof(int(*)[5]));
printf("%d\n",sizeof(int[5]));
return 0;
}
#include<stdio.h>
int main()
{
printf("%d\n",sizeof(int *));
printf("%d\n",sizeof(char *));
printf("%d\n",sizeof(double *));
printf("%d\n",sizeof(int (*)[5]));
return 0;
}
附习题:
若有以下定义和语句:
double r=99;double *p=&r ;
*p=r ;
则以下正确的叙述是 。
A. 以上两处的*p 含义相同,都说明给指针变量p 赋值
B. 在"double r=99,*p=&r;"中,把r 的地址赋值给了p 所指的存储单元
C. 语句"*p=r;"把变量r 的值赋给指针变量p
D. 语句"*p=r;"取变量r 的值放回r 中
5、 分析下面函数,以下说法正确的是 。
swap(int *p1,int *p2)
{
Int *p;
*p=*p1; *p1=*p2; *p2=*p;
}
A. 交换*p1和*p2的值 B. 正确,但无法改变*p1和*p2的值
C. 交换*p1和*p2的地址 D. 可能造成系统故障,因为使用了野指针
9、 有如下程序段
int *p ,a=10 ,b=1 ;
p=&a ; a=*p+b ;
执行该程序段后,a 的值为 。
A. 12 B. 11 C. 10 D. 编译出错
8、 若int x ; int *pb; ,则正确的赋值表达式是 。
A. pb=&x B. pb=x; C. *pb=&x; D. *pb=*x
12、若有说明:long *p ,a;则不能通过scanf 语句正确给输入项读入数据的程序段
是 。
A. *p=&a; scanf("%ld",p);
B. p=(long *)malloc(8); scanf("%ld",p);
C. scanf("%ld",p=&a);
D. scanf("%ld",&a);
13、对于类型相同的两个指针变量之间,不能进行的运算是 。
A. < B. = C. + D. -
2、执行以下程序后,a的值为( )b的值为( )
void main()
{
int a,b,k=4,m=6,*p1=&k,*p2=&m;
a = p1==&m;
b=(-*p1)/(*p2)+7;
printf(“a=%d\n”, a);
printf(“b=%d\n”, b);
}
A.-1 B.1 C.0 D.4
A.5 B.6 C.7 D.10
6、有四组对指针变量进行操作的语句,以下判断正确的选项是()
1. int p, q; q=p; int a,*p,*q; p=q=&a;
2. int a,*p,*q; q=&a; p=*q; int a=20,*p; p=a;
3. int a=b=0,*p; p=&a; b=*p; int a=20,*p,*q=&a; p=q;
4. int a=20,*p,*q=&a; p=q; int p,*q; p=q;
A.正确(1) 不正确(2)(3)(4)
B.正确(1)(4) 不正确(2)(3)
C.正确(3) 不正确(1)(2)(4)
D.正确(1)(3) 不正确 (2)(4)
7、以下程序中调用scanf 函数给变量a输入值的方法是错误的,其错误原因是( )
void main()
{
int*p, q, a, b;
p=&a;
printf(“input a:”);
scanf(“%d”,*p);
……
}
A.*p表示的是指针变量p的地址
B.*p表示的是变量a的值,而不是变量a的地址
C.*p表示的是指针变量p的值
D.*p只能用来说明p是一个指针变量
2.已有定义int k=2;int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是 。
A)k=*ptr1+*ptr2 B)ptr2=k C)ptr1=ptr2 D)k=*ptr1*(*ptr2)
5.若有说明:int *p1, *p2,m=5,n;以下均是正确赋值语句的选项是
A)p1=&m; p2=&p1 ; B)p1=&m; p2=&n; *p1=*p2 ;
C)p1=&m; p2=p1 ; D)p1=&m; *p1=*p2 ;
6.若有语句:int *p,a=4;和p=&a;下面均代表地址的一组选项是
A)a,p,*&a B)&*a,&a,*p C)*&p,*p,&a D)&a,&*p,p
- 有以下程序
void fun(char *a, char *b)
{
a=b; (*a)++;
}
void main()
{
char c1='A',c2='a',*p1,*p2;
p1=&c1; p2=&c2; fun(p1,p2);
printf("%c%c\n",c1,c2);
}
程序运行后的输出结果是( )
A)Ab B)aa C)Aa D)Bb
2、下列选项中正确的语句组是( )
A)char s[8]; s={"Beijing"}; B)char *s; s={"Beijing"};
C)char s[8]; s="Beijing"; D)char *s; s="Beijing";
3、下面程序是对两个整型变量的值进行交换,以下正确的说法是( )
void main()
{
int a=10,b=20;
printf(“(1)a=%d, b=%d\n”, a , b);
swap(&a, &b);
printf(“(2)a=%d, b=%d\n”, a ,b);
}
swap(int p, int q)
{
int t; t=p; p=q; q=t;
}
A.程序正确 ,能实现既定功能
B.程序有错,只要将语句swap(&a,&b);中的参数改成a,b即可
C.程序有错,只要将swap()函数中的形参p和q 以及t均定义为指针(执行语句不变)即可
D.以上说法都不对
4、以下程序中函数scmp的功能是返回形参指针s1和s2所指字符串中较小字符串的首地址
#include <stdio.h>
#include <string.h>
char *scmp(char *s1, char *s2)
{
if(strcmp(s1,s2)<0)
return(s1);
else return(s2);
}
main()
{
int i;
char string[20], str[3][20];
for(i=0;i<3;i++) gets(str[i]);
strcpy(string,scmp(str[0],str[1])); /*库函数strcpy对字符串进行复制*/
strcpy(string,scmp(string,str[2]));
printf("%s\n",string);
}
若运行时依次输入:abcd、abba和abc三个字符串,则输出结果为( )
A)abcd B)abba C)abc D)abca
5、有以下程序
#include <string.h>
main()
{
char str[ ][20]={"Hello","Beijing"},*p=str[0];
printf("%d\n",strlen(p+20));
}
程序运行后的输出结果是( )
A)0 B)5 C)7 D)20
6、有以下程序_______
main()
{
int p[7]={11,13,14,15,16,17,18},i=0,k=0;
while(i<7&&*(p+i)%2) {k=k+*(p+i); i++;}
printf("%d\n",k);
}
执行后输出的结果是( )
A) 58 B) 56 C) 45 D) 24
7、 有以下程序
main(int argc,char *argv[])
{ int n,i=0;
while(argv[1][i]!='\0')
{ n=fun(); i++;}
printf("%d\n",n*argc);
}
int fun()
{ static int s=0;
s+=1;
return s;
}
假设程序编译、连接后生成可执行文件exam.exe,若键入以下命令
exam 123〈回车〉
则运行结果为( )
A) 6 B) 8 C) 3 D) 4
8、下列程序的输出结果是( )
main()
{ char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5;
printf("%d",*--p);
}
A) 非法 B)a[4]的地址 C)5 D)3
9、有以下程序
main()
{ char *s[]={"one","two","three"},*p;
p=s[1];
printf("%c,%s\n",*(p+1),s[0]);
}
执行后输出结果是( )
A) n,two B) t,one C) w,one D) o,two
10、下面判断正确的是( )
A. char*a=”china”;等价于char *a; a=”china”;
B. char str[10]={“china”};等价于char str[10]; str=”china”
C. char*s=”china”;等价于char str[10] =”china”
D. char c[4]=”abc”,d[4]=”abc” 等价于char c[4]=b[4]=”abc”;
11、设char*s=”\ta\017bc”;则指针变量s指向的字符串所占的字节数是 ( )
A.9 B.5 C.6 D.7
12、下面能正确进行字符串赋值的操作的是( )
A. char s[5]={“ABCDE”};
B. char s[5]={‘A’,’B’,’C’,’D’,’E’,};
C. char*s; s=”ABCDE”;
D. char s; scanf(“%s”, s);
13、下面程序段的运行结果是( )
char*s=”abcde”; s+=2; printf(“%d”,s);
A.cde B.字符’c’ C.字符’c’的地址 D.无确定结果
14、设有以下程序段:char s[]=”china”; char*p; p=s; 则下列叙述正确的是( )
A.s和p完全相同
B.数组s中的内容和指针变量p中的内容相等
C.s数组长度和p所指向的字符串长度相等
D.*p与s[0]相等
15、下面程序段的运行结果是( )
char*format=”%s, a=%d, b=%d\n”;
int a=1,b=10; a+=b;
printf(format,” a+=b,”, a, b);
A. for,” a+=”,a b B. format,” a+=b”
C. a+=b, a=11,b=10 D.以下结果都不对
16、以下正确的程序段是( )
A. char str [20]; scanf(“%s”, &str);
B. char *p; scanf(“%s”, p);
C. char str[20]; scanf(“%s”, &str[2]);
D. char str[20], *p = str; scanf(“%s”, p+2);
17、下面程序段的运行结果是( )
char str[]=”ABC”, *p=str;
printf(“%d\n”,*(p+3));
A. 67 B. 0 C.字符’C’的地址 D.字符’C’
18、下面程序段运行结果是( )
char a[]=”language”,*p; p=a;
while(*p!=’u’) {printf(“%c”,*p-32);p++;}
A. LANGUAGE B. language
C. LANG D. language
19、下面说明不正确的是( )
A.char a[10]=”china”; B.char a[10],*p=a;p=”china”;
C.char*a; a=”china”; D.char a[10],*p; p=a=”china”;
20、 若有说明语句
char a[]=”It is mine”; char*p=”It is mine”;
则以下不正确的叙述是( )
A.a+1表示的是字符t的地址
B.p指向另外的字符串时,字符串的长度不受限制
C.p变量中存放的地址值可以改变
D.a中只能存放10个字符
21、若已定义char s[10];则在下面表达式中不能表示s[1]的地址是( )
A.s+1 B.s++ C.&s[0]+1 D. &s[1]
22、下面程序段的运行结果是( )
char s[6]; s=”abcd” printf(“\”%s\”\n”,s);
A.”abcd” B.”abcd “ C.\”abcd\” D.编译出错
23、当运行以下程序时,从键盘输入Happy!<CR> ,则下面的程序运行结果是( )
#include<stdio.h>
#include<string.h>
stre(char str[])
{
int num=0;
while(*(str+num)!=’\0’)
num++;
return(num);
}
void main()
{
char str [10],*p = str;
gets (p);
printf(“%d\n”, stre(p));
}
A.7 B.6 C.5 D.10
24、下面程序的运行结果是( )
#include<stdio.h>
void main()
{
static char a[ ]=“Language”,b[ ]=”programe”;
char p1, p2; int k;
p1=a; p2=b; printf(" %c”,*(p1+k));
}
A. age B. ag C. Language D.有语法错误
25、下面程序运行结果( )
#include<stdio.h>
void main()
{
int a=28,b;
char s[10],*p;
p=s;
do{
b=a%16;
if(b<10) *p=b+48;
else *p=b+55;
p++;
a=a/5;
}while(a>0);
*p=’\0’;
puts(s);
}
A.10 B. C2 C.C51 D.\0
26、下面程序的运行结果是( )
#include<stdio.h>
void delch(char *s)
{
int I,j;
char *a;
a=s;
for(I=0,j=0;a[I]!=’\0’;I++)
if(a[I]>=’0’&&a[I]<=’9’){s[j]=a[I];j++;}
s[j]=’\0’;
}
void main()
{
char*item=”a34bc”;
delch(item);
printf("\n%s",item);
}
A.abc B.34 c.a34 D.a34bc
27、下面程序运行结果是( )
#include<stdio.h>
#include<string.h>
void main()
{
char *s1=”AbDeG”; char *s2=”AbdEg”;
s1+=2; s2+=2;
printf(“%d\n”,strcmp(sl,s2));
}
A.正数 B.负数 C.零 D.不确定的值
28、下面的程序的运行结果是( )
#include<stdio.h>
#include<string.h>
fun(char*s)
{
char a[7];
s=a;
strcpy(a,”look”);
}
void main()
{
char *p;
fun(p);
puts(p);
}
A.look□□□ B.look C.异常结束 D.不确定的值
29、下面程序的运行结果是( )
#include<stdio.h>
#incude<string.h>
void main()
{
char* p1,*p2,str[50]=”abc”;
p1=”abc”; p2=”abc”;
strcpy(str+1,strcat(p1,p2));
printf(“%s\n”,str);
}
A.abcabcabc B.bcabcabc C.aabcabc D.cabcabc
30、下面程序的运行结果是( )
#include<stdio.h>
abc(char*p)
{
int I,j;
for(I=0,j=0;*(p+I)!=’\0’;I++)
if(*(p+I)>=’d’){*(p+j)=*(p+I); j++; }
*(p+j)=’\0’;
}
void main()
{
char str[]=”cdalb”;
abc(str);
puts(str);
}
A.dalb B.cd C.dl D.c
31、若有以下定义,则对a数组元素的正确引用是
int a[5],*p=a;
A.*&a[5] B.a+2 C.*(p+5) D.*(a+2)
32、若有定义:int a[2][3];则对a数组的第I行,第j列元素值的正确引用是( )
A.*(*a+I)+j) B.(a+I)[j] C*(a+I+j) D.*(a+I)+j
33、若有以下定义和语句,则对a数组元素的正确引用为( )
int a[2][3],(*p)[3]; p=a;
A.(p+1)[0] B.*(*(p+2)+1)
C.*(p[1]+1) D.p[1]+2
34、若有定义:int a[5];则a数组中首元素地址可以表示为( )
A.&a B.a+1 C.a D.&a[1]
35、有以下程序
void fun(char *c,intd)
{*c=*c+1;d=d+1;
printf("%c,%c,",*c,d);
}
main()
{char a='A',b='a';
fun(&b,a); printf("%c,%c\n",a,b);
}
程序运行后的输出结果是( )。
A) B,a,B,a B) a,B,a,B C) A,b,A,b D) b,B,A,b
36、以下程序中函数sort的功能是对a所指数组中的数据进行由大到小的排序
void sort(int a[],int n)
{int i,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]<a[j]) {t=a[i];a[i]=a[j];a[j]=t;}
}
main()
{int aa[10]={1,2,3,4,5,6,7,8,9,10},i;
sort(&aa[3],5);
for(i=0;i<10;i++) printf("%d,",aa[i]);
printf("\n");
}
程序运行后的输出结果是( )。
A) 1,2,3,4,5,6,7,8,9,10,
B) 10,9,8,7,6,5,4,3,2,1,
C) 1,2,3,8,7,6,5,4,9,10,
D) 1,2,10,9,8,7,6,5,4,3,
37、有以下程序
main()
{char a[]={'a','b','c','d','e','f','g','h','\0'}; int i,j;
i=sizeof(a); j=strlen(a);
printf("%d,%d\n",i,j);
}
程序运行后的输出结果是( )。
A) 9,9 B) 8,9 C) 1,8 D) 9,8
38、以下程序中的函数reverse的功能是将a所指数组中的内容进行逆置。
void reverse(int a[],int n)
{int i,t;
for(i=0;i<n/2;i++)
{t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;}
}
main()
{int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0;
reverse(b,8);
for(i=6;i<10;i++) s+=b[i];
printf("%d\n",s);
}
程序运行后的输出结果是( )
A) 22 B) 10 C) 34 D) 30
39、若有以下定义,则*(p+5)表示( )
int a[10],*p=a;
A.元素a[5]的地址 B.元素a[5]的值
C.元素a[6]的地址 D.元素a[6]的值
40、以下正确的说明语句是( )
A.int*b[]={1,3,5,7,9};
B.int a[5],*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
C.int a[]={1,3,5,7,9};
D.int a[3][4],(*num)[4];num[1]=&a[1][3];
41、若有以下定义,且0<=I<4,则不正确的赋值语句是( )
int b[4][6],*p,*q[4];
A.q[I]=b[I]; B.p=b; C.p=b[I]; D.q[I]=&b[0][0];
42、有以下程序
void ss(char *s,char t)
{while(*s)
{if(*s==t) *s=t-'a'+'A';
s++;
}
}
main()
{char str1[100]="abcddfefdbd",c='d';
ss(str1, C); printf("%s\n",str1);
}
程序运行后的输出结果是______。
A) ABCDDEFEDBD
B) abcDDfefDbD
C) abcAAfefAbA
D) Abcddfefdbd
43、有以下程序
#include <stdlib.h>
main()
{char *p,*q;
p=(char *)malloc(sizeof(char)*20); q=p;
scanf("%s%s",p,q); printf("%s%s\n",p,q);
}
若从键盘输入:abc def<回车>,则输出结果是______。
A) def def B) abc def C) abc d D) d d
44、以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。
#include <string.h>
void f(char (*p) [10], int n)
{ char t[20]; int i,j;
for(i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if(strcmp(p[i],p[j])<0)
{ strcpy(t,p[i]);strcpy(p[i],p[j]);strcpy(p[j],t);}
}
main()
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i;
f(p,5);
printf("%d\n",strlen(p[0]));
}
程序运行后的输出结果是 ________
A) 6 B) 4 C) 5 D) 3
45、阅读以下程序:
void main()
{
int a[10]={2,4,6,8,10,12,14,16,18,20},*p;
p=a;
printf(“%x\n”,p);
printf(“%x\n”,p+9);
}
若第一个printf语句输出的是ffca,则第二个printf语句输出的是( )
A.ffee B.ffdc C.ffde D.ffcd
46、设有以下定义:
char *cc[2]={“1234”,”5678”};
则正确的叙述是( )
A.cc数组的两个元素中各自存放了字符串“1234”和“5678”的首地址
B.cc数组的两个元素分别存放的是含有4个字符的一维字符数组的首地址
C.cc是指针变量,它指向含有两个数组元素的字符型一维数组
D.cc数组元素的值分别是“1234”和“5678”
47、若有以下定义
int x[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}
int(*p)[3]=x;
则能够正确表示数组元素x[1][2]的表达式是( )
A *((*p+1)[2]) B (*p+1)+2 C *(*p+5) D *(*p+1)+2)
48、下面程序的运行结果是( )
void main()
{
int x[5]={2,4,6,8,10},*p,**pp;
p=x;
pp=&p;
printf(“%d”,*(p+1));
printf(“%3d\n”**pp);
}
A 4 4 B 2 4 C 4 2 D, 4 6
49、若有说明:
char *language[]={“fortran” ,”basic” ,”pascal” ,“java” ,
”c”};则表达式language[1]>language[3]比较的是( )
A 字符f和字符p 的大小
B 字符串basic和字符串java地址的大小
C 字符b和字符j 的大小
D 字符串fortran和字符串pascal地址的大小
50、若有说明( )
char *language[]={“fortran”,”basic”,”pascal”,”java”,
”c”}则language[2]的值是
A 一个字符 B 一个地址 C 一个字符串 D一个不定值
51、 若有说明
char *language []={“fortran” ,”basic”,“pascal” ,“java”,“c”}则以下不正确的是( )
A.language+2表示字符串”pascal”的首地址
B.language[2]的值是字母p
C.language是一个字符型指针数组,它包含5个元素每个元素都是一个指向字符变量的指针
D.language是一个字符型指针数组,它包含5个元素其初值分别是:fortran,basic,pascal,java,c,
52、语句int(*ptr) ()的含义是( )
A.ptr是指一维数组的指针变量
B.ptr是指向int型数据的指针变量
C.ptr是指向函数的指针,该函数返回一个int型数据
D.ptr 是一个函数名,该函数的返回值是指向int型数据的指针
52、若有函数max(a,b)并且已使函数指针变量p指向max,当调用该函数时正确的调用方法是( )
A.(*p)max(a,b) B.pmax(a,b) C.(p)(a,b) D.*p(a,b)
53、已有函数max(a,b),为了让函数指针变量p指向函数max正确的赋值方法是( )
A.p=max B.*p=max C.p=max(a,b) D.*p=max(a,b)
54、已有定义int(*p)( ) ,指针p可以( )
A.代表函数的返回值
B.指向函数的入口地址
C.表示函数的类型
D.表示函数返回值的类型
55、若有以下说明和语句:char*language[]=
{“fortran” ,“basic” ,”pascal” ,“java”,“c”}
char**p;
p=language+2
则语句printf(“%o/n”*p);( )
A.输出的是language[2]元素的地址
B.输出的是字符串pascal
C.输出的是language[2]元素的值,它是字符串pascal的首地址
D.格式说明不正确,无法得到确定的输出
56、若要对a进行++运算,则a应具有下面说明( )
A.int a[3][2]
B.char *a[]{“12”,ab}
C.char(*a)[3]
D.int b[10],*a=b;
二、填空题
1、以下程序运行后的输出结果是 【 1,0,3,4,5,0,7,8,9 】
void main()
{
int i,j,a[ ][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++)
for(j=i+1;j<3;j++) *(*(a+j)+i)=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++) printf("%d ",*(*(a+i)+j));
printf("\n");
}
}
2、以下程序运行后输入:3,abcde<回车>,则输出结果是 【 edcba,5 】
#include <string.h>
move(char *str, int n)
{ char temp; int i;
temp=str[n-1];
for(i=n-1;i>0;i--) str[i]=str[i-1];
str[0]=temp;
}
main()
{ char s[50]; int n, i, z;
scanf("%d,%s",&n,s);
z=strlen(s);
for(i=1; i<=n; i++) move(s, z);
printf("%s\n",s);
}
3、有以下程序,若输入的字符串是:abc123edf456gh,则执行程序后输出:【 123456 】。
#include <stdio.h>
#include <ctype.h>
main()
{ char s[80], d[80]; int i,j;
gets(s);
for(i=j=0;*(s+i)!='\0';i++)
if(*(s+i)>='0' && *(s+i)<='9' ) { *(d+j)= *(s+i); j++; }
*(d+j)='\0';
puts(d);
}
4、若有以下程序
main()
{int a[4][4]={{1,2,-3,-4},{0,-12,-13,14} ,
{-21,23,0,-24},{-31,32,-33,0}};
int i,j,s=0;
for(i=0;i<4;i++)
{ for(j=0;j<4;j++)
{ if(*(*(a+i)+j)<0) continue;
if(*(*(a+i)+j) ==0) break;
s+=*(*(a+i)+j);
}
}
printf("%d\n",s);
}
执行后输出结果是【 3 】。
5、 以下函数的功能是删除字符串s中的所有数字字符。请填空。
viod dele(char *s)
{
int n=0,i;
for(i=0;s[i];i++)
if(【 s[i]!=’\0’&&s[i]>=0&&s[i]<=9 】)
s[n++]=s[i];
s[n]=【 ‘\0’ 】;
}
6、 设函数findbig已定义为求3个数中的最大值。以下程序将利用函数指针调用findbig函数。请填空。
main()
{ int findbig(int,int,int);
int (*f)(int,int,int),x,y,z,big;
f=【 findbig(x,y,z) 】;
scanf("%d%d%d",&x,&y,&z);
big=(*f)(x,y,z);
printf("big=%d\n",big);
}
7、以下程序通过函数指针p调用函数fun,请在填空栏内,写出定义变量p的语句。
void fun(int *x,int y)
{ …… }
main()
{ int a=10,b=20;
【 fun(&a,&b); 】 ; /定义变p */
p=fun; p(&a,&b);
……
}
8、 下列程序的输出结果是 【 100 0 】 。
void fun(int *n)
{ while( (*n)--);
printf("%d",++(*n));
}
main()
{ int a=100;
fun(&a);
}
9、 以下程序的输出结果是 【 20 10 】 。
main()
{ int arr[ ]={30,25,20,15,10,5}, *p=arr;
p++;
printf("%d\n",*(p+3));
}
10、 以下程序中,主函数调用了LineMax函数,实现在N行M列的二维数组中,找出每一行上的最大值。请填空。
#define N 3
#define M 4
void LineMax(int (*x)[M])
{ int i,j,p;
for(i=0; i<N;i++)
{ p=0;
for(j=1; j<M;j++)
if(x[i][p]<x[i][j]) 【 p=x[i][j] 】 ;
printf("The max value in line %d is %d\n", i, 【 p 】 );
}
}
main()
{ int x[N][M]={1,5,7,4,2,6,4,3,8,2,3,1};
【LineMax (x)】
}
1、 若有以下定义和语句,且0≤i<10则对数组元素的错误引用是 。
int a[10]={1,2,3,4,5,6,7,8,9,10},*p,i;
p=a;
A. *(a+i) B. a[p-a] C. p+i D. *(&a[i])
4、 char *s="\t \\ N a m e \\ A d d r e s s \n";
指针s所指字符串的长度为: 。
A. 说明不合法 B. 19 C. 18 D. 15
14、若已定义:int a[9] ,*p=a;并在以后的语句中未改变p 的值,不能表示a[1] 地
址的表达式是 。
A. p+1 B. a+1 C. a++ (数组名是常量,常量不能自运算) D. ++p
15、若有以下说明:
int a[10]={1,2,3,4,5,6,7,8,9,10} ,*p=a ;
则数值为6 的表达式是 。
A. *p+6 B. *(p+6) C. *p+=5 D. p+5
6、设P1 和P2 是指向同一个int 型一维数组的指针变量,k 为int 型变量,则不能正
确执行的语句是 。
A. k=*P1+*P2; B. p2=k; C. P1=P2; D. k=*P1 * (*P2);
17、若有以下的定义:
int a[ ]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} , *p=a ;
则值为3 的表式是 。
A. p+=2 , *(p++) B. p+=2 ,*++p
C. p+=3 , *p++ D. p+=2 ,++*p
18、若有以下定义和语句:
int a[10]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} ,*p=a ;
则不能表示a 数组元素的表达式是 。
A. *p B. a[10] C. *a D. a[p-a]
19、有如下说明
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
则数值为9 的表达式是 。
A. *p+9 B. *(p+8) C. *p+=9 D. p+8
1. 在16位编译系统上 sizeof(int) =2,若有定义int a[]={10,20,30}, *p=a;,当执行p++;后,下列说法错误的是( )
A)p向高地址移了一个字节 B)p向高地址移了一个存储单元
C)p向高地址移了两个字节 D)p与a+1等价
2.有以下程序段
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;
b=p[5];
b中的值是()
A)5 B)6 C)8 D)9
3.若有以下定义,则对a数组元素的正确引用是_________.
int a[5],*p=a;
a)*&a[5] b)a+2 c)*(p+5) d)*(a+2)
4.若有以下定义,则p+5表示_______.
int a[10],*p=a;
a)元素a[5]的地址 b)元素a[5]的值
c)元素a[6]的地址 d)元素a[6]的值
2022年11月3日
6.有以下程序段
#include <stdio.h>
int main()
{ int x[] = {10, 20, 30};
int *px = x;
printf("%d,", ++*px); 11 printf("%d,", *px);11
px = x;
printf("%d,", (*px)++);11 printf("%d,", *px);12
px = x;
printf("%d,", *px++); 12 printf("%d,", *px); 20
px = x;
printf("%d,", *++px);20 printf("%d\n", *px);20
return 0;
}
程序运行后的输出结果是(11,11,11,12,12,20,20,20 )
A)11,11,10,11,10,20,20,20 B)20,10,11,10,11,10,11,10
C)11,11,11,12,12,20,20,20 D)20,10,11,20,11,12,20,20
7.设有如下定义:
int arr[]={6,7,8,9,10};
int *ptr;
ptr=arr;
*(ptr+2)+=2;
printf ("%d,%d\n",*ptr,*(ptr+2));
则程序段的输出结果为
A)8,10 B)6,8 C)7,9 D)6,10
8.若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是__4____. *(a+5)的值是_____10____. 12
9.若有以下说明和语句,int c[4][5],(*p)[5];p=c;能正确引用c数组元素的是______.
A) p+1 B) *(p+3) C) *(p+1)+3 D) *(p[0]+2))
10.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为______.
a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j
11.若有以下定义:int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是__8___. *(*(a+1)+0)的值是___8_____.
12.有以下定义
char a[10],*b=a;
不能给数组a输入字符串的语句是()
A)gets(a) B)gets(a[0]) C)gets(&a[0]); D)gets(b);
13.下面程序段的运行结果是_________.
char *s="abcde";
s+=2;printf("%d",s);
a)cde b)字符'c' c)字符'c'的地址 d)无确定的输出结果
14.以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是()
A) char s[10]="abcdefg"; B) char t[]="abcdefg",*s=t;
C) char s[10];s="abcdefg"; D) char s[10];strcpy(s,"abcdefg");
16.有以下程序
main()
{
char a[]="programming",b[]="language";
char *p1,*p2;
int i;
p1=a;p2=b;
for(i=0;i<7;i++)
if(*(p1+i)==*(p2+i))
printf("%c",*(p1+i));
}
输出结果是()
A)gm B)rg C)or D)ga
17.以下正确的程序段是_________.
a)char str[20]; b)char *p;
scanf("%s",&str); scanf("%s",p);
c)char str[20]; d)char str[20],*p=str;
scanf("%s",&str[2]); scanf("%s",p[2]);
18.若有说明语句
char a[]="It is mine";
char *p="It is mine";
则以下不正确的叙述是________.
a)a+1表示的是字符t的地址
b)p指向另外的字符串时,字符串的长度不受限制
c)p变量中存放的地址值可以改变
d)a中只能存放10个字符
19.下面程序的运行结果是_______.
#include <stdio.h>
#include <string.h>
main()
{ char *s1="AbDeG";
char *s2="AbdEg";
s1+=2;s2+=2;
printf("%d\n",strcmp(s1,s2));
}
a)正数 b)负数 c)零 d)不确定的值
20、下列选项中声明了一个指针数组的是:
A)int *p[2]; B)int (*p)[2];
C)typedef int* intPtr; intPtr p[2];
D)A和B
E)A和C
F)B和C
21、下面代码能通过编译的是:
A)int main()
{
int a[3]={1,2,3};
int *b[3]={&a[1],&a[2],&a[3]};
int **p = b;
return 0;
}
B)int main()
{
int a[3]={1,2,3};
int *b[3]={a[1],a[2],a[3]};
int **p = b;
return 0;
}
C)int main()
{
int a[3]={1,2,3};
int *b[3]={&a[1],&a[2],&a[3]};
int *p = b;
return 0;
}
D)int main()
{
int a[3]={1,2,3};
int *b[3]={&a[1],&a[2],&a[3]};
int *p = &b;
return 0;
}
22、若要对a进行++运算,则a应具有下面说明_______.
A) int a[3][2]; B) char *a[ ] = {“12”,”ab”};
C) char (*a)[3];
23、若有以下说明语句:
char *language[ ] = {“FORTRAN”,”BASIC”,’’PASCAL”,’’JAVA”,”C”};
char **q;
q = language + 2;
则语句printf(“%s\n”, *q) 输出的是_______.
A) language[2]元素的地址;
B)字符串PASCAL
C) language[2]元素的值,它是字符串PASCAL的首地址
D)格式说明不正确,无法得到确定的输出
24、若有以下程序:
void main()
{
char *a[3] = {"I","love","China"};
char **ptr = a;
printf("%c %s" , *(*(a+1)+1), *(ptr+1) );
}
这段程序的输出是()
A) I l
B) o o
C)o love
D) I love
25、对于语句int *pa[5];下列描述中正确的是_______.
A) pa是一个指向数组的指针,所指向的数组是5个int型元素
B) pa是一个指向某数组中第5个元素的指针,该元素是int型变量
C) pa [5]表示某个元素的第5个元素的值
D) pa是一个具有5个元素的指针数组,每个元素是一个int型指针
26、若有以下定义,且0≤i<4,则不正确的赋值语句是_______.
int b[4][6], *p, *q[4];
A) q[i] = b[i]; B) p = b;
C) p = b[i] D) q[i] = &b[0][0];
27.若有程序段:int a[2][3],(*p)[3]; p=a;则对a数组元素地址的正确引用是 。
A)*(p+2) B)p[2] C)p[1]+1 D)(p+1)+2
#include<stdio.h>
int main()
{
int arr[3][4]={1,2,3,4,5};
int (*p)[4]=arr;
printf("p[i][j]\n");
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%d\n",p[i][j]);
}
}
printf("*(p[i]+j)\n");
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%d\n",*(p[i]+j));
}
}
printf("*(*(arr+i)+j)\n");
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%d\n",*(*(arr+i)+j));
}
}
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int n=0;
printf("您想要存放几个数:\n");
//gets(n); 段错误
scanf("%d",&n);
int * arr=(void *)malloc(sizeof(arr)*n);
if(NULL == arr)
{
printf("ERROR\n");
return -1;
}
memset(arr,0,sizeof(arr)*n);
printf("请输入数字:\n");
for(int i=0;i<n;i++)
{
scanf("%d",arr+i);
}
printf("输出结果:\n");
for(int i=0;i<n;i++)
{
printf("%d\n",*(arr+i));
}
free(arr);
return 0;
}
#include<stdio.h>
int main()
{
int arr[3][4]={1,1,3,4,5,6};
int (*p)[4]=arr;
printf("int arr[3][4]={1,1,3,4,5,6};int (*p)[4]=arr\n");
printf("&arr[0][0]=%p\n",&arr[0][0]);
printf("&arr[0]=%p\n",&arr[0]);
printf("arr[0]=%p\n",arr[0]);
printf("arr=%p\n",arr);
printf("&arr=%p\n",&arr);
printf("p=%p\n",p);
printf("p++:\n");
p++;
printf("&arr[0][0]=%p\n",&arr[0][0]);
printf("&arr[0]=%p\n",&arr[0]);
printf("arr[0]=%p\n",arr[0]);
printf("arr=%p\n",arr);
printf("&arr=%p\n",&arr);
printf("p=%p\n",p);
printf("p--:\n");
p--;
printf("&arr[0][0]=%p\n",&arr[0][0]);
printf("&arr[0]=%p\n",&arr[0]);
printf("arr[0]=%p\n",arr[0]);
printf("arr=%p\n",arr);
printf("&arr=%p\n",&arr);
printf("p=%p\n",p);
printf("p+1:\n");
p+1;
printf("&arr[0][0]=%p\n",&arr[0][0]);
printf("&arr[0]=%p\n",&arr[0]);
printf("arr[0]=%p\n",arr[0]);
printf("arr=%p\n",arr);
printf("&arr=%p\n",&arr);
printf("p=%p\n",p);
printf("p-1:\n");
p-1;
printf("&arr[0][0]=%p\n",&arr[0][0]);
printf("&arr[0]=%p\n",&arr[0]);
printf("arr[0]=%p\n",arr[0]);
printf("arr=%p\n",arr);
printf("&arr=%p\n",&arr);
printf("p=%p\n",p);
return 0;
}
2022年11月4日
单选题(2×24=48分)
1. 要把高级语言编写的源程序转换为目标程序,需要使用( )
A) 编辑程序 B)驱动程序 C)诊断程序 D)编译程序
2. 以下叙述中正确的是( )
A)C语言程序将从源程序中第一个函数开始执行
B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行
C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束
D)main可作为用户标识符,用以命名任意一个函数作为主函数
3. 若变量a是int类型,并执行了语句:a=‘A'+1.6;,则正确的叙述是 ( )
A) a的值是字符B的ASCII 码 B)a的值是浮点型
C) 不允许字符型和浮点型相加 D) a的值是字符‘A’的ASCII 值加上2。
4. 若变量已正确定义并赋值,以下符合C语言语法的表达式是( )
A)a:=b+1 B)a=b=c+2 C)int 18.5%3 D)a=a+7=c+b
5. 下列可用于C语言用户标识符的一组是( )
A)void, define, WORD B)a3_b3, _123,Car C)For, -abc, IF Case D)2a, DO, sizeof
6若在定义语句:int a,b,c,*p=&c;之后,接着执行以下选项中的语句,则能正确执行的语句
是( )
A)scanf("%d",a,b,c); B)scanf("%d%d%d",a,b,c);
C)scanf("%d",p); D)scanf("%d",&p);
7以下关于long、int和short类型数据占用内存大小的叙述中正确的是( )
A)均占4个字节 B)根据数据的大小来决定所占内存的字节数
C)由用户自己定义 D)由C语言编译系统决定
8若变量已正确定义,有以下程序段
i=0;
do{
printf("%d,",i);
} while(i++);
printf("%d\n",i)
其输出结果是( )
A)0,0 B)0,1 C)1,1 D)程序进入无限循环
9有以下计算公式
若程序前面已在命令中包含math.h文件,不能够正确计算上述公式的程序段是( )
A)if(x>=0) y=sqrt(x); B)y=sqrt(x)
else y=sqrt(-x); if(x<0) y=sqrt(-x);
C) if(x>=0)y=sqrt(x); D)y=sqrt(x>=0?x:-x);
if(x<0)y=sqrt(-x);
10设有条件表达式:(EXP)?i++:j--,则以下表达式中(EXP)完全等价的是( )
A)(EXP= =0) B)(EXP!=0) C)(EXP= =1) D)(EXP!=1)
11有以下程序
#include<stdio.h>
int main(void)
{
int y=9;
for( ; y>0;y--){
if(y%3= =0) printf("%d",--y);
}
}
程序的运行结果是( )
A)741 B)963 C)852 D)875421
12若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是( )
A)函数的实参和其对应的形参共占同一存储单元
B)形参只是形式上的存在,不占用具体存储单元
C)同名的实参和形参占同一存储单元
D)函数的形参和实参分别占用不同的存储单元
13已知字符’A’的ASCⅡ代码值是65,字符变量c1的值是’A’,c2的值是’D’。执行语句
printf("%d,%d",c1,c2-2);后,输出结果是( )
A)A,B B)A,68 C)65,66 D)65,68
14以下叙述中错误的是( )
A)改变函数形参的值,不会改变对应实参的值
B)函数可以返回地址值
C)可以给指针变量赋一个整数作为地址值
D)当在程序的开头包含文件stdio.h 时,可以给指针变量赋NULL
15以下正确的字符串常量是( )
A)"\\\" B)’abc’ C)Olympic Games D)""
16设有定义:char p[]={’1’,’2’,’3’},*q=p; ,以下不能计算出一个char型数据所占字节数的表达式是( )
A)sizeof(p) B)sizeof(char) C) sizeof(*q) D)sizeof(p[0])
17有以下函数
int aaa(char *s)
{
char *t=s;
while(*t++) ;
t--;
return(t-s);
}
以下关于aaa函数的功能叙述正确的是( )
A)求字符串s的长度 B)比较两个串的大小
C)将串s复制到串t D)求字符串s所占字节数
18若有定义语句:int a[3][6]; ,按在内存中的存放顺序,a数组的第10个元素是( )
A)a[0][4] B)a[1][3] C)a[0][3] D)a[1][4]
19有以下程序
#include<stdio.h>
void fun(char **p)
{
++p;
printf("%s\n",*p);
}
int main(void)
{
char *a[ ]={"Morning","Afternoon","Evening","Night"};
fun(a);
}
程序的运行结果是( )
A)Afternoon B)fternoon C)Morning D)orning
20若有定义语句:int a[2][3],*p[3]; ,则以下语句中正确的是( )
A)p=a; B)p[0]=a; C) p[0]=&a[1][2]; D)p[1]=&a;
21有以下程序
#include<stdio.h>
int fun(char s[])
{
int n=0;
while(*s<=’9’&&*s>=’0’){
n=10*n+*s-’0’;
s++;
}
return(n);
}
int main(void)
{
char s[10]={’6’,’1’,’*’,’4’,’*’,’9’,’*’,’0’,’*’};
printf("%d\n",fun(s));
}
程序运行的结果是( )
A)9 B)61490 C)61 D)5
22以下能正确定义一维数组的选项是( )
A)int a[5]={0,1,2,3,4,5}; B)char a[]={0,1,2,3,4,5};
C)char a={’A’,’B’,’C’}; D)int a[5]="0123";
23以下叙述中正确的是( )
A)预处理命令行必须位于源文件的开头
B)在源文件的一行上可以有多条预处理命令
C)宏名必须用大写字母表示
D)宏替换不占用程序的运行时间
24以下语句或语句组中,能正确进行字符串赋值的是 ( )
A)char *sp;*sp="right!"; B)char s[10];s="right!";
C)char s[10];*s="right!"; D)char *sp="right!";
简答题(5×4+7=27分)
1.以下程序的功能是:输出a、b、c三个变量中的最小值.请填空。
#include<stido.h>
int main(void)
{
int a,b,c,t1,t2;
scanf("%d%d%d",&a,&b,&c);
t1=a<b? _____;a:b
t2=c<t1? ____; c:t1
printf("%d\n",t2);
}
2.以下程序的输出结果是____. 54321
#include <stdio.h>
int main(void)
{
int n=12345, d;
while(n!=0){
d=n%10;
printf("%d",d);
n/=10;
}
}
3.已有定义如下:
struct node
{
int data;
struct node *next;
} *p;
以下语句调用malloc 函数,使指针p指向一个具有struct node类型的动态存储空
间。
p = (struct node *)malloc(_________________); sizeof(*p)
4.表达式(int)((double)5/2+2.5)的值是:____________ 5
5.写出以下两段程序的执行结果。如果程序无法编译,请指出出错部分并写明原因;如果程
序陷入死循环,请回答“死循环”。 如果执行结果出现内存错误,请指出出错部分并写明原
因。
第一个:
int main(void)
{
char s[ ]="man";
int i;
for(i=0;s[ i ];i++)
printf("\n%c%c%c%c",s[ i ], *(s+i), *(i+s), i[s]);
} m m m m
a a a a
n n n n
第二个 :
int main(void)
{
char *cptr,c;
void *vptr,v;
c=10; v=0;
cptr=&c; vptr=&v;
printf("%c%v", c, v);
}
内存错误
没有void *指针
6、Test函数的运行结果如何?
Void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
没有free函数,会造成内存泄漏
编程题(30分)
1、打印出所有的“水仙花”数。所谓“水仙花”数是指一个3位数,其各个位数字立方和等于该数本身。
for(i=100;i<=999;i++)
{
a=i/100; // 百位
b=i/10%10; // 十位
c=i%10; // 个位
If(a*a*a+b*b*b+c*c*c==i)
{
printf(“%d\n”,i);
}
本文章只做参考,请自行调试或运行代码
作者:徐子宸
班级:嵌入式22101班
培训机构:西安华清远见
未完待续......