函数调用时参数所传送的内容是:
数组地址传送、简单变量地址传送、变量地址或数组地址传送
若有语句组
char name[32]="beijing", *pn=name; while( pn[0]!='\0'){pn++;}
执行后pn[0]
的值是_____
\0
利用指针指向数组的内容,跟利用索引值取得的数组元素值是相同的;也就是说:*(a+1)与 a[1]都是指向数组的第2个元素。
错误
假设a是一个整型数组的数组名,则a=a+1
的表示不合法。
正确
想要利用指针传递到函数中,
int main (void) {int a[5]={13,32,67,14,95};int i,num=24; replace(a, 4, num);} void replace(int *ptr, int n, int num) {*(ptr+n-1)=num;},
置换后数组a[5]={13, 32, 67, 14, 24}
。
错误
指针不但可以指向任何一种数据型态的变量,还可以让指针指向另一个指针变量,这种指向指针的指标(pointer of pointer),通称为双重指标。
正确
不能把一个整数常量直接赋值给指针变量
正确
指针变量的初始化可以直接赋地址,比如int *ps=10000;
错误
设指针变量已经指向一个有效地址,则表达式&*p==p
的结果为真.
正确
设
struct s
{
int id;
char name[32];
}stu, *ps;
ps = &stu;
通过指针ps读入stu成员的id和name的语句为:
scanf("%d", ________id);
scanf("______", ________name);
&ps->
%s
ps->
指针指向一维数组时,比如若有int s[10],*ps;
则对ps的初始化,即 ps=s; 和ps=&s[0];
使得ps指向s的同一个元素。
正确
以下语句组,可以实现从键盘输入一个整数给变量x。
int x, *px; scanf("%d", px);
错误
利用指针指向数组的内容,跟利用索引值取得的数组元素值是相同的;也就是说:&a[1]与 a+1都是指向内存的同一个地址。
正确
若有char *ps="beijing", 则ps[3]的值为____;strlen(ps)的值为________
j
7
/*------------------------------------------------
【程序设计】 Guo S.
--------------------------------------------------
题目:完成函数void fun(char *s),
功能是将s指向的字符串中的所有数字字符前,插入一个#,
比如当s指向a1b2c33时,
执行fun后,s指向的字符串为a#1b#2c#3#3
要求: 利用指针完成.
--------------------------------------------------
注意:部分源程序给出如下。请勿改动主函数
main和其它函数中的任何内容,仅在函
数的花括号中begin和end之间填入所编写的若干语句。
*********Begin**********和********** End **********不可删除
------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define N 128
void bky();
void fun1(char *s)
{
/**********Begin**********/
/********** End **********/
}
int main()
{
char s[256];
printf("请输入一个字符串:");
gets(s);
fun1(s);
puts(s);
bky();
return 0;
}
void bky()
{
FILE *IN,*OUT;
int i;
char s[256];
IN=fopen("in.dat","r");
if(IN==NULL)
{
printf("Please Verify The Currernt Dir..it May Be Changed");
return;
}
OUT=fopen("out.dat","w");
if(OUT==NULL)
{
printf("Please Verify The Current Dir.. it May Be Changed");
return;
}
for(i=0;i<3;i++)
{
fscanf(IN, "%s", s);
fun1(s);
fprintf(OUT, "%s\n", s);
}
fclose(IN);
fclose(OUT);
}
【参考代码】
char *p, *q, *s0=s;
int len;
len = strlen(s);
p=(char *)malloc( sizeof(char)*(len*2+1) );
if(NULL==p){
exit(1);
}
q=p;
while(*s)
{
if( *s>='0'&&*s<='9')
{
*p++ = '#';
}
*p++ = *s++;
}
*p='\0';
strcpy(s0,q);
free(q);
q=p=NULL;
return ;
/*------------------------------------------------
【程序设计】 一、二维数组;排序;guosumei
--------------------------------------------------
题目:键盘输入3人成绩(整数)和姓名,按照空格隔开。比如
80 zhangshan
100 lisi
90 zhaoliu
要求:完成函数fun1,
按照成绩排序(从高到低),程序会按照以下输出
100 lisi
90 zhaoliu
80 zhangshan
--------------------------------------------------
注意:部分源程序给出如下。请勿改动主函数
main和其它函数中的任何内容,仅在函
数的花括号中begin和end之间填入所编写的若干语句。
*********Begin**********和********** End **********不可删除
------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define N 128
#define L 3
void bky();
//第一个参数为成绩首地址,第二个为姓名的首地址,第三个为数组长度
void fun1(int score[], char name[][32], int num)
{
// 数组长度num
/**********Begin**********/
/********** End **********/
}
int main()
{
int num=3, n, m,k=1;
int score[3];
char name[3][32];
for(n=0;n<num;n++){
printf("请输入第%d个整数成绩和姓名(空格隔开):\n", n+1);
scanf("%d%s", &score[n], name[n]);
}
fun1(score, name, num);
for(n=0;n<num;n++){
printf("%d %s\n", score[n], name[n] );
}
bky();
return 0;
}
void bky()
{
FILE *IN,*OUT;
int num=3, n, m,k=1;
int score[3];
char name[3][32];
IN=fopen("in.dat","r");
if(IN==NULL)
{
printf("Please Verify The Currernt Dir..it May Be Changed");
return;
}
OUT=fopen("out.dat","w");
if(OUT==NULL)
{
printf("Please Verify The Current Dir.. it May Be Changed");
return;
}
for(n=0;n<num;n++){
fscanf(IN, "%d%s", &score[n], name[n]);
}
fun1(score, name, num);
for(n=0;n<num;n++){
fprintf(OUT, "%d %s\n", score[n], name[n] );
}
fclose(IN);
fclose(OUT);
}
【参考代码】
int i,j,t;
char temp[32];
for(i=0;i<num;i++)
for(j=i+1;j<num;j++)
{
if( score[i]<score[j])
{
t=score[i]; score[i]=score[j];
score[j]=t;
strcpy(temp, name[i]);
strcpy(name[i], name[j]);
strcpy(name[j], temp);
}
}
return ;
/*------------------------------------------------
【程序设计】Guo S.
--------------------------------------------------
题目:输入一个字符串,将连续数字字符作为整数输出。
设只有英文大小写字符和数字组成,比如a123b4x576AAZ36,将其中连续的数字字符作为一个整数,
依次存放到一维数组中,比如整数123、4、576和36分别存放于num[0],num[1],num[2]和num[3]中,
输出字符串中构成整数的个数,以及各个整数。
完成函数 int fun1(char *str, int num[])
// 函数返回数字的个数,即num的个数
//
// 数组num, 设str中连续数字中,不超过32
// num[0]存放第一个连续的数字,
// num[2]存放第二个连续的数字,
// 以此类推
本例题中,则需输出个数4,以及具体数值123、4、576和36。
共有4个数字:
123
4
576
36
要求: 字符串部分、存放结果的部分,均用指针完成.
--------------------------------------------------
注意:部分源程序给出如下。请勿改动主函数
main和其它函数中的任何内容,仅在函
数的花括号中begin和end之间填入所编写的若干语句。
*********Begin**********和********** End **********不可删除
------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define N 128
void bky();
int fun1(char *str, int num[])
{
// 函数返回数字的个数,即num的个数
//
// 数组num, 设str中连续数字中,不超过32
// num[0]存放第一个连续的数字,
// num[2]存放第二个连续的数字,
// 以此类推
/**********Begin**********/
/********** End **********/
}
int main()
{
char str[N];
int num[32], number, j;
printf("输入一个字符串: ");
scanf("%s", str);
number=fun1(str, num);
printf("共有%d个数字:\n", number);
for(j=0;j<number;j++)
printf("%d\n",num[j]);
bky();
return 0;
}
void bky()
{
FILE *IN,*OUT;
int i;
char str[N];
int num[32], number, j;
IN=fopen("in.dat","r");
if(IN==NULL)
{
printf("Please Verify The Currernt Dir..it May Be Changed");
return;
}
OUT=fopen("out.dat","w");
if(OUT==NULL)
{
printf("Please Verify The Current Dir.. it May Be Changed");
return;
}
for(i=0;i<6;i++)
{
fscanf(IN, "%s", str);
number=fun1(str, num);
fprintf(OUT, "共有%d个数字:\n", number);
for(j=0;j<number;j++)
fprintf(OUT, "%d\n",num[j]);
}
fclose(IN);
fclose(OUT);
}
【参考代码】
int len,i,*nump,isum=0, flg, number=0;
len =strlen(str);
nump=num;
for(i=0;i<32;i++)
num[i] = 0;
while( *str ){ //ab12c0c568dd666:结果是12,0,568,666四个数字
isum=0;
flg=0;
while( *str>='0' && *str<='9') {
isum = isum*10 + (*str-'0');
str++;
flg=1;
}
if(flg) {
*nump=isum;
nump++;
str--;
number++;
}
str++;
}
return number;
/*------------------------------------------------
【程序设计】
--------------------------------------------------
题目:编程实现:
完成函数 void fun1(int *n, int num)
// 指针n指向存放num*num个整数,num为奇数
// 将最大一个数存放到中间,其他按从小到大以此存放
键盘输入大于等于3且小于等于11的奇数N,以及N*N的二维数组的值,将最大值存放到中间,将从小到大的值依次放数组中。
比如当输入3,以及
41 3 4
1 5 2
3 6 9
则有最大值41,存放到数组的中间,其余按照从小到大放入:
1 2 3
3 41 4
5 6 9
要求: 利用指针指向二维数组完成.
--------------------------------------------------
注意:部分源程序给出如下。请勿改动主函数
main和其它函数中的任何内容,仅在函
数的花括号中begin和end之间填入所编写的若干语句。
*********Begin**********和********** End **********不可删除
------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define N 128
void bky();
void fun1(int *n, int num)
{
// 指针n指向存放num*num个整数,num为奇数
// 将最大一个数存放到中间,其他按从小到大以此存放
/**********Begin**********/
/********** End **********/
}
int main()
{
int *x, num, n, m,k=1;
do{
printf("输入一个大于等于3,且小于等于11的奇数: ");
scanf("%d", &num);
}while( num<3 || num>11 || num%2==0);
x=(int *)malloc(sizeof(int)*num*num);
for(n=0;n<num;n++){
for(m=0;m<num;m++){
printf("请输入第%d个数:", k);
scanf("%d", (x+n*num+m));
k++;
}
}
fun1(x, num);
for(n=0;n<num;n++){
for(m=0;m<num;m++){
printf("%d ", *(x+n*num+m));
}
printf("\n");
}
bky();
return 0;
}
void bky()
{
FILE *IN,*OUT;
int i;
int *x, num, n, m,k=1,*p1,*p2;
x=(int *)malloc(sizeof(int)*121);
IN=fopen("in.dat","r");
if(IN==NULL)
{
printf("Please Verify The Currernt Dir..it May Be Changed");
return;
}
OUT=fopen("out.dat","w");
if(OUT==NULL)
{
printf("Please Verify The Current Dir.. it May Be Changed");
return;
}
for(i=0;i<3;i++)
{
fscanf(IN, "%d", &num);
p1=x;
for(n=0;n<num;n++){
for(m=0;m<num;m++){
fscanf(IN, "%d", p1);
p1++;
}
}
fun1(x, num);
p1=x;
for(n=0;n<num;n++){
for(m=0;m<num;m++){
fprintf(OUT, "%d ", *p1);
p1++;
}
fprintf(OUT,"\n");
}
}
fclose(IN);
fclose(OUT);
}
【参考代码】
int i,j,k, max, temp, *p1, N2, *p2;
N2 = num*num;
max=*n;
for(i=0;i<N2-1;i++)
{
p1=n+i;
for(j=i, p2 = n+j; j<N2;j++){
if(*p1 > *p2){
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
p2++;
}
}
k = N2/2;
max = *(n+N2-1);
for(i=N2-1;i>k;i--)
*(n+i)=*(n+i-1);
*(n+k)=max;
return ;
/*------------------------------------------------
【程序设计】Guo S.
--------------------------------------------------
题目:
完成函数void fun1(char *str),将指针str指向的字符串反转。
即:当字符串为abc123时,则将字符串变为321cba
要求: 字符串部分的处理用指针完成.
输入字符串部分,在程序的其他部分完成,无需考虑。
--------------------------------------------------
注意:部分源程序给出如下。请勿改动主函数
main和其它函数中的任何内容,仅在函
数的花括号中begin和end之间填入所编写的若干语句。
*********Begin**********和********** End **********不可删除
------------------------------------------------*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define N 128
void bky();
void fun1(char *str)
{
/**********Begin**********/
/********** End **********/
}
int main()
{
char str[N];
double ave;
printf("输入一个字符串: ");
scanf("%s", str);
fun1(str);
printf("%s\n",str);
bky();
return 0;
}
void bky()
{
FILE *IN,*OUT;
int i;
char str[N];
double ave;
IN=fopen("in.dat","r");
if(IN==NULL)
{
printf("Please Verify The Currernt Dir..it May Be Changed");
return;
}
OUT=fopen("out.dat","w");
if(OUT==NULL)
{
printf("Please Verify The Current Dir.. it May Be Changed");
return;
}
for(i=0;i<4;i++)
{
fscanf(IN,"%s", str);
fun1(str);
fprintf(OUT, "%s\n",str);
}
fclose(IN);
fclose(OUT);
}
【参考代码】
char temp, *p;
int len;
int i;
len =strlen(str);
p=str+len-1;
while(p>str){
temp = *p;
*p = *str;
*str = temp;
p--;
str++;
}
return ;
文章评论