下面指针选题来源于教材、牛客网。
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,只能得到一个返回值。 两个数互换,实际上就是对两个变量重新赋值,只不过赋的值是特殊的(另一个数)。 |
若想通过被调函数改变主调函数中变量的值,就使用指针做函数形参,把主调函数中要改变的变量的地址传递给指针,在被调函数中改变形参指针所指向的变量的值。 |
键盘随机输入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;
}
这个题目中,不知道数组具体的长度(不必过度纠结),可以将数组的长度设置的适当,保证数据不会溢出即可。 |
代码实现
#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再重新对它赋值。 |
#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;
}