1、使用指针完成以下内容:
定义三个整数的的列阵,写三个功能,input(),deal(),print():输入,处理,打印:input功能,需要完成三个编号的输入,deal功能需要从小到大排序,print功能需要打印结果。
我的思路:首先定义一个整数的数组,长度为3;然后分别输入,再处理排序,用排序方法排序,最后输出结果;
实现代码:
主函数里就定义四行代码 :
int a[3]; input(a); deal(a); print(a);分别实现的方法:
void input(int *x){ for(int i=0;i<3;i++){ printf("请输入第%d位数:",i+1); scanf("%d",&(*x)); *x++; } } void deal(int *x){ for(int i=0;i<2;i++){ for(int j=i+1;j<3;j++){ if(*(x+i)>*(x+j)){ *(x+i)^=*(x+j); *(x+j)^=*(x+i); *(x+i)^=*(x+j); } } } } void print(int *x){ printf("该编号最小到大:"); for(int i=0;i<3;i++){ printf("%d,",*x++); } }ok,
2、
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
代码即注释如下:
int nmax=50;//定个50长的数组 int i,k,m,n,num[nmax],*p; printf("please input the total of numbers:"); scanf("%d",&n);//输入一个整数 p=num;//p指向数组的首地址 for(i=0;i<n;i++) *(p+i)=i+1;//给数组的各元素赋值,从1到n; i=0;//记录循环数是否到末尾,到开发就赋值0 k=0;//k是记录三次 m=0;//记录还有几个数,如果m还有最后一个数,也就是m>=n-1时,不再循环,就跳出来输出; while(m<n-1) { if(*(p+i)!=0) k++; if(k==3) { *(p+i)=0; k=0; m++; } i++; if(i==n) i=0; } while(*p==0) p++;//判断哪个数不为0,不为0的就是最后剩下来的; printf("%d is leftn",*p);//最后输出该数
int a=100; fun(&a); void fun(int *n) { while( (*n)--); printf("%d\n",++(*n)); }
结果为:0
解释:首先fun(&a)传的是地址,函数里*n就是a的值100;while循环最后直接跟了个分号相当于空语句,这一点有好多初学者容易忽略,忽略掉就不对了,你明明想的会输出从100到0,怎么就输出一个0了呢!原因就是分号,再看里面的条件,*n本来就是a的值100,也就相当于a--,这样a就成了99,以此类推,等到a变成了0,也就是假,大家知道,在以语言中0就是假,所以当*n为0时,(*n)--变成-1的时候跳出来,再下面打印时打印++(-1),你说是几,当然是0了;
4、有代码如下:请输出结果
int a[] = {0, 2,4,6,8}; int *p[5]={a, a+1, a+2, a+3, a+4}; int ** pp = p;
a==*p==*pp; printf("%d\n",*pp ++);//它就是a的首地址 printf("%d\n", *pp-a);//1-0=1 printf("%d\n", **++pp);// printf("%d\n", pp - p);
4176
1
4
2
解释:首先说明a是个数组里有5个数,*p[5]一个数组指针也有5个元素分别是:a的首地址、a的第二个、第三人,第四个、第五个地址;然后就是**p二级指针,指向p的首地址,也就是a的首地址,这样说,下面就知道输出什么了吧!
第一个输出语句:输出第一个*pp就是p的首地址也就是a的首fbfh,所以输出一个地址4176;
你要是不信,你就再打印这一句:
printf("%d,%d,%d,%d\n",a,&a[0],*p,*pp);
这一句的输出结果 是: 4176,4176,4176,4176第二个输出语句:当第一个输出语句执行完,*pp++就指向了下一个元素就是*p里面的a+1;当a+1-a=1,所以这样输出了1喽;
第三个输出语句:**++pp看起来不好看,咱拆开看,写成这样 *(*++pp),这样清楚了,(*++pp)就相当于a+2,因为在第一个输出语句执行完了以后*pp就已经是a+1了,现在又++所以变成a+2;然后再*(a+2)不就是a[2]的值4嘛!
第四个输出语句:执行完第三个语句后 *pp指向*p[2]的值是a+2,p是首地址a,它两相减pp-p=a+2-a=2;所以输出2;
5、输出以下图形:
*******
*****
***
*
***
*****
*******
int m,n; for(int k=1;k<=7;k++){ n=7-abs(k-4);//一行前面输出的空格 m=abs(k-4)*2+1;//一行上有多少个星星 for(int i=0;i<n;i++){ printf("%s"," "); } for(int j=0;j<m;j++){ printf("%s","*"); } printf("\n"); }