下面指针选题来源于教材、牛客网。
1.键盘输入一个字符串,编写代码获取字符串的长度并输出,要求使用字符指针实现。
示例:
输入:
helloworld
返回值:
10
代码实现
#include<stdio.h> int main (void) { char str[128]={0};//给字符串数组初始化为一个空字符串 char *p=str;int i; printf("请输入一个字符串:\n"); gets(str);//将从键盘输入的字符串存入到str; for (i=1;*p!=0;i++) p++; printf("%d",i-1); return 0; }
在这个题目中,循环是一个关键。可能写成while循环更好理解。当p所指向的地址的内容不为空,即*p!=0时,这时计数器计一个数,然后指针移动到字符串数组的下一个元素。
#include<stdio.h> int main (void) { char str[128]={0};//给字符串数组初始化为一个空字符串 char *p=str;int i=0; //此时注意i初始化为0 printf("请输入一个字符串:\n"); gets(str);//将从键盘输入的字符串存入到str; while(*p!=0) { i+=1; p++ } printf("%d",i-1); return 0; }
键盘输入一个长度为len的字符串(1=<len<30),再输入一个正整数m(1=<m<=30),将此字符串中从第m个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。
示例:
输入:
helloworld
返回值:
world
代码实现
#include <stdio.h> int main (void) { char str[30]={0};//将str初始化为一个空字符串 char *p; int m; printf("请输入一个字符串:\n"); gets(str); printf("请输入一个正整数:\n"); scanf("%d",&m); p=str+m-1;//第m个字符,它是第[m-1](编号)个元素,地址是首地址+编号,即str+m-1 while(*p!=0) { printf("%c",*p);//依次对第m个元素之后进行输出 p++; } printf("\n"); return 0; }
编写一个函数,实现两个整数的互换,要求采用指针的方式实现。
示例:
输入:
2
3
返回值:
3 2
#include <stdio.h> void swap(int *p,int *q); int main (void) { int a,b,*p=&a,*q=&b; scanf("%d%d",&a,&b); swap(p,q); printf("a=%d,b=%d",a,b); return 0; } void swap(int *p,int *q)//函数功能实现两个数的交换 { int t; t=*p; *p=*q; *q=t; }
实现两个数的互换,不能通过return返回值实现。因为通过函数return,只能得到一个返回值。 两个数互换,实际上就是对两个变量重新赋值,只不过赋的值是特殊的(另一个数)。
若想通过被调函数改变主调函数中变量的值,就使用指针做函数形参,把主调函数中要改变的变量的地址传递给指针,在被调函数中改变形参指针所指向的变量的值。 |
```c #include
键盘随机输入6个整数,将这些数据保存到数组中,利用指针遍历数组中的元素并打印。
示例:
10
20
30
40
50
60
返回值:
10 20 30 40 50 60
代码实现
#include <stdio.h> int main (void) { int a[6]={0},i;\\给数组完成初始化 int *p=a;\\数组名即数组首元素的地址 printf("Please input 6 integer numbers:\n"); for (i=0;i<6;i++) scanf("%d",&*(p+i));\\给数组元素赋值 for (i=0;i<6;i++) printf("%d\t",*(p+i));\\依次输出 return 0; }
我的一些改进: 关于数组元素的赋值 scanf是输入,它的参数应该是一个指针即地址,表示把输入的值存放在改地址中。 |
for (i=0;i<6;i++) { scanf("%d",p); \\给数组元素赋值 p++; }
#include<stdio.h> int cal(int n,int*p); int main(void) { int n,a[50]={0},sum=0,i;\\定义数组,保证数组的长度。\\并将数组元素全部初始化为0 scanf("%d",&n); for (i=0;i<n;i++)\\对数组元素进行重新赋值 scanf("%d",&a[i]); for (i=0;i<n;i++)\\将数组中的重新赋过值的元素依次加到sum中 sum+=a[i]; printf("%d",sum); return 0; }
这个题目中,不知道数组具体的长度(不必过度纠结),可以将数组的长度设置的适当,保证数据不会溢出即可。 |
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/fb0f804f99c24215ad570f635bf67e6e.png)
代码实现
#include<stdio.h> int main (void) { int a[50]={0},n,x,i,k=0; printf("请输入一个整数\n"); scanf("%d",&n); printf("请输入这%d个数:\n",n); for (i=0;i<n;i++) scanf("%d",&a[i]); printf("请输入要删除的整数:\n"); scanf("%d",&x); for (i=0;i<n;i++) if (a[i]!=x) { a[k]=a[i]; k++; } for (i=0;i<k;i++) printf("%d\t",a[i]); return 0; }
对于这个删除指定数字后再输出数组序列的题目,刚开始接触理解这个题目时,我的想法是再建立一个和a相同长度的数组b,然利用循环对数组a中的每一个元素(i=0 to n)进行遍历,若不是要删除的元素,则将这个元素移到数组b中,数组b的下标从0开始,依次被赋值(直到k),然后将数组b中的元素打印出来。
听过老师的讲解,这个数组b也可以是它自己,节省内存空间。即对数组a再重新对它赋值。 |
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/0453e437cb664df6b1f53329ccf1048b.png)
#include<stdio.h> int main (void) { int n,a[50]={0},x,i,index; printf("请输入一个整数n:\n"); scanf("%d",&n); printf("请输入%d个整数:\n",n); for (i=0;i<n;i++) scanf("%d",&a[i]); printf("请输入一个想插入的整数:\n"); scanf("%d",&x); if (x<a[0] ||x==a[0]) { a[0]=x; for (i=1;i<=n;i++) a[i]=a[i-1]; } else if (x>a[n-1] || x==a[n-1]) { a[n]=x; } else for (i=0;i<n;i++) if (x>=a[i] && x<a[i+1]) { a[i+1]=x; index=i+1; for (i=n;i>index;i--) a[i]=a[i-1]; } for (i=0;i<=n;i++) printf("%d",a[i]); return 0; }
输入10个数,将第一个元素和最后一个元素交换,第二个元素与倒数第二个元素交换……
#include <stdio.h> void swap(int *p,int *q); int main (void) { int a[10],*p,*head,*end; for (p=a;p<=a+9;p++) scanf("%d",p); //利用指针对数组中的每一个元素赋初值 head=a;end=a+9; while(end>head) { swap(head,end); head--; end++; } for (p=a;p<a+10;p++) printf("%d",*p); return 0; } void swap(int *p,int *q)//函数功能实现两个数的交换 { int t; t=*p; *p=*q; *q=t; }