C语言刷题(1)----指针数组

简介: C语言刷题(1)----指针数组

下面指针选题来源于教材、牛客网。

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++;  
  }

544916e8be824e62832280109141b632.png

#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;
}
相关文章
|
12天前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
28 3
|
24天前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
45 0
|
11天前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
25 2
|
20天前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
25 1
|
26天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
35 6
|
23天前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
15 2
|
23天前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
23天前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
29天前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
29天前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。