练习题:指针

Hjx的作业(第六次)

第一题

利用指针变量将一个数组中的数据反向输出

代码:

/*************************************************************************
  > File Name:    home01.c
  > Author:       霍巨鑫
  > Description:  利用指针变量将一个数组的数据反向输出
  > Created Time: 2024年12月16日 星期一 19时49分22秒
 ************************************************************************/

#include <stdio.h>

int main(int argc,char *argv[])
{
    int arr[] = {11,22,33,44,55};
    int len = sizeof(arr) / sizeof(arr[0]);
    int *p = arr;

    for(int i = len - 1;i >= 0;i--)
    {
        printf("%d\n",*(p+i));
    }
    return 0;
}

运行结果:

在这里插入图片描述

第二题

利用指针变量计算下标为奇数的数组的和

代码:

/*************************************************************************
  > File Name:    home02.c
  > Author:       霍巨鑫
  > Description:  利用指针变量计算下标为奇数的数组的和
  > Created Time: 2024年12月16日 星期一 20时06分46秒
 ************************************************************************/

#include <stdio.h>

int main(int argc,char *argv[])
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int len = sizeof(arr) / sizeof(arr[0]);
    int sum = 0;

    int *p = arr;

    for(int i = 0;i < len;i++)
    {
      if(*(p+i) % 2 != 0)
      {
        sum += *(p+i);
      }
    }
    printf("该数组中奇数的和为:%d\n",sum);
    return 0;
}

运行结果:

在这里插入图片描述

第三题

确认整型,字符型,浮点型指针变量的大小

代码:

/*************************************************************************
  > File Name:    home03.c
  > Author:       霍巨鑫
  > Description:  确认整型,字符型,浮点型指针变量的大小
  > Created Time: 2024年12月16日 星期一 20时13分52秒
 ************************************************************************/

#include <stdio.h>

int main(int argc, char *argv[])
{
  int *p1;
  char *p2;
  float *p3;
  double *p4;

  printf("整型指针变量的大小为: %ld 字节\n", sizeof(p1));
  printf("字符型指针变量的大小为: %ld 字节\n", sizeof(p2));
  printf("单精度浮点型的指针变量大小为: %ld 字节\n", sizeof(p3));
  printf("双精度浮点型指针变量大小为: %ld 字节\n", sizeof(p4));

  return 0;
}

运行结果:

在这里插入图片描述

第四题

利用指针变量输出字符数组中的所有字符

代码:

/*************************************************************************
  > File Name:    home04.c
  > Author:       霍巨鑫
  > Description:  利用指针变量输出字符数组中的所有字符
  > Created Time: 2024年12月16日 星期一 20时32分55秒
 ************************************************************************/

#include <stdio.h>

int main(int argc,char *argv[])
{
    char arr[] = {'h','j','x'};
    int len = sizeof(arr) / sizeof(arr[0]);

    char* p = arr;

    for(int i = 0;i < len;i++)
    {
      printf("%c\n",*(p+i));
    }
    return 0;
}

运行结果:

在这里插入图片描述

第五题

编写一个函数,用指针变量做参数,用于求出一个浮点型数组元素的平均值

代码:

/*************************************************************************
  > File Name:    home05.c
  > Author:       霍巨鑫
  > Description:  编写一个函数,用指针变量做参数,用于求出一个浮点型数组元素的平均值
  > Created Time: 2024年12月16日 星期一 20时55分59秒
 ************************************************************************/

#include <stdio.h>

double fun(double *p,int len)
{
    double sum = 0.0;

    for(int i = 0;i < len;i++)
    {
      sum += p[i];
    }
    return sum / len;
}

int main(int argc,char *argv[])
{
    double arr[5];
    int len = sizeof(arr) / sizeof(arr[0]);

    printf("请输入五个浮点型的数:\n");
    for(int i = 0;i < len;i++)
    {
      scanf("%lf",&arr[i]);
    }

    double result = fun(arr,len);

    printf("该浮点型数组元素的平均值为:%.2lf\n",result);
}

运行结果:

在这里插入图片描述

第六题

编写函数,要求用指针做形参,分别实现以下功能:

(1)求一个字符串长度

(2)在一个字符串中统计大写字母的个数

(3)在一个字符串中统计数字字符的个数

代码:

/*************************************************************************
  > File Name:    home06.c
  > Author:       霍巨鑫
  > Description:  编写函数,要求用指针做形参
  > Created Time: 2024年12月17日 星期二 11时32分15秒
 ************************************************************************/

/**
 * 分别实现以下功能:
 * (1)求一个字符串长度
 * (2)在一个字符串中统计大写字母的个数
 * (3)在一个字符串中统计数字字符的个数
 */

#include <stdio.h>
#include <string.h>

int fun1(char* arr_1)
{
    return strlen(arr_1);
}

int cap(char* arr_2,int len)
{
    int count = 0;

    for (int i = 0; i < len; i++)
    {
        if (arr_2[i] >= 'A' && arr_2[i] <= 'Z')
        {
            count++;
        }
    }
    return count;
}

int num(char* arr_3,int len)
{
    int sum = 0;

    for(int j = 0;j < len;j++)
    {
      if(arr_3[j] >= '0' && arr_3[j] <= '9')
      {
        sum++;
      }
    }
    return sum;
}


int main(int argc,char *argv[])
{
    char arr[] = {"My name is HJX,I am 25 years old!"};
    int len = fun1(arr);
    printf("这个字符串的长度为:\n%d\n",len);

    int str_1 = cap(arr, len);
    printf("这个字符串中的大写字母个数为:\n%d\n",str_1);

    int str_2 = num(arr,len);
    printf("这个字符串中的数字个数为:\n%d\n",str_2);

    return 0;
}

运行结果:

在这里插入图片描述

第七题

编写函数,要求用指针做形参,实现将二维数组(行列相同)的进行转置(行列数据互换):int(*p)[N]

代码:

/*************************************************************************
  > File Name:    home07.c
  > Author:       霍巨鑫
  > Description:  编写函数,要求用指针做形参,实现将二维数组(行列相同)的进行转置(行列数据互换):int(*p)[N]
  > Created Time: 2024年12月17日 星期二 19时42分18秒
************************************************************************/

#include <stdio.h>
#define N 3

void fun_1(int (*p)[N], int len)
{
  for (int i = 0; i < len; i++)
  {
    for (int j = 0; j < len; j++)
    {
      printf("%d", p[i][j]);
    }
    printf("\n");
  }
}

void fun_2(int (*p)[N], int len)
{
  for (int i = 0; i < len; i++)
  {
    for (int j = i + 1; j < len; j++)
    {
      // 交换元素
      int temp;

      temp = p[i][j];
      p[i][j] = p[j][i];
      p[j][i] = temp;
    }
  }
  for (int i = 0; i < len; i++)
  {
    for (int j = 0; j < len; j++)
    {
      printf("%d", p[i][j]);
    }
    printf("\n");
  }
}

int main(int argc, char *argv[])
{
  int arr[N][N] = {
      {1, 2, 3},
      {4, 5, 6},
      {7, 8, 9}};

  int len = sizeof(arr) / sizeof(arr[0]);

  printf("源二维数组是:\n");
  fun_1(arr, len);

  printf("交换后的二维数组是:\n");
  fun_2(arr, len);
}

运行结果:

在这里插入图片描述

第八题

编写函数,要求用指针做形参,实现统计二维数组上三角中的0 的数量

代码:

/*************************************************************************
  > File Name:    home08.c
  > Author:       霍巨鑫
  > Description:  编写函数,要求用指针做形参,实现统计二维数组上三角中的0的数量
  > Created Time: 2024年12月17日 星期二 20时23分41秒
 ************************************************************************/

#include <stdio.h>
#define N 3

int fun_1(int (*p)[N], int len)
{
  int sum = 0;

  for (int i = 0; i < len; i++)
  {
    for (int j = i; j < len; j++)
    {
      printf("%d", p[i][j]);
      if (p[i][j] == 0)
      {
        sum++;
      }
    }
    printf("\n");
  }
  return sum;
}

int main(int argc, char *argv[])
{
  int arr[N][N] = {
      {0, 2, 0},
      {4, 0, 6},
      {0, 8, 0}};

  int len = sizeof(arr) / sizeof(arr[0]);

  printf("该二维数组中上三角0的个数是:\n%d\n", fun_1(arr, len));
}

运行结果:

在这里插入图片描述

第九题

编写一个指针函数,返回二维数组中最大元素的地址

代码:

/*************************************************************************
  > File Name:    home09.c
  > Author:       霍巨鑫
  > Description:  编写一个指针函数,返回二维数组中最大元素的地址
  > Created Time: 2024年12月19日 星期四 17时50分21秒
 ************************************************************************/

#include <stdio.h>

int *find(int arr[][3], int row, int col)
{
  int max = arr[0][0];
  int *max_add = &arr[0][0]; // 初始化最大元素地址为数组的第一个元素地址

  for (int i = 0; i < row; i++)
  {
    for (int j = 0; j < col; j++)
    {
      if (arr[i][j] > max)
      {
        max = arr[i][j];
        max_add = &arr[i][j]; // 更新最大元素地址
      }
    }
  }
  return max_add; // 返回最大元素的地址
}

int main(int argc, char *argv[])
{
  int arr_1[3][3] = {
      {1, 2, 3},
      {4, 5, 6},
      {7, 8, 9}};

  // 调用指针函数,获取最大元素的地址
  int *max_ment = find(arr_1, 3, 3);

  // 打印最大元素的值
  printf("这个数组中最大元素为: %d\n", *max_ment);
  printf("这个数组中最大元素的地址为:%p\n",max_ment);

  return 0;
}

运行结果:

在这里插入图片描述

第十题

面试题

1)定义整形变量; // int a;

2)p为指向整形变量的指针变量;int* p = &a;

3)定义整形一维数组p,它有n 个整形元素;// int n = 5;int *p[n];

4)定义一维指针数组p,它有n个指向整形变量的指针元素;// int *p[n];

6)p为返回整形函数值的函数;// int p(){}

7)p为返回一个指针的函数,该指针指向整形数据;// int* p(){}

8)p为指向函数的指针变量,该函数返回一个整形值;// int (*p)(int);

9)p是一个指向整形指针变量的指针变量;// int** p;

第十一题

动态申请⼀个具有10个float类型元素的内存空间,从⼀个已有的数组中拷贝数据,并找出第⼀次出现 12.35 的下标位置,并输出。

代码:

/*************************************************************************
  > File Name:    home11.c
  > Author:       霍巨鑫
  > Description:  动态申请⼀个具有10个float类型元素的内存空间
  > Created Time: 2024年12月22日 星期日 17时55分42秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  float arr[10] = {1.0, 2.1, 3.2, 4.3, 5.4, 12.35, 8.7, 9.8, 10.9};
  int len = sizeof(arr) / sizeof(arr[0]);

  // 动态申请内存空间
  float *mem_arr = (float *)malloc(10 * sizeof(float));

  if (mem_arr == NULL)
  {
    printf("内存分配失败!\n");
    return -1;
  }

  // 从现有数组中拷贝数据
  for (int i = 0; i < 10;i++)
  {
    mem_arr[i] = arr[i];
  }

  // 查找出现12.35的位置
  int temp = -1; // 初始化下标位置,用来接收找到新的下标位置
  for (int i = 0; i < 10; i++)
  {
    if (mem_arr[i] == 12.35)
    {
      temp = i;
      break;
    }
  }

  // 输出结果
  if (temp != -1)
  {
    printf("出现12.35的下标位置是:%d\n", temp);
  }
  else
  {
    printf("数组中没有找到!\n");
  }

  free(mem_arr);

  return 0;
}

运行结果:

在这里插入图片描述

第十二题

动态申请⼀个整型数组,并给每个元素赋值,要求删除第3个元素

代码:

/*************************************************************************
  > File Name:    home11.c
  > Author:       霍巨鑫
  > Description:  动态申请⼀个整型数组,并给每个元素赋值,要求删除第3个元素
  > Created Time: 2024年12月22日 星期日 17时55分42秒
 ************************************************************************/
#include <stdio.h>
#include <stdlib.h>

int main()
{
  int n = 10;                                  
  int *array = (int *)malloc(n * sizeof(int)); 
  if (array == NULL)
  {
    printf("内存分配失败\n");
    return 1;
  }

  for (int i = 0; i < n; i++)
  {
    array[i] = i + 1; 
  }

  printf("源数组为:\n");
  for (int i = 0; i < n; i++)
  {
    printf("%d ", array[i]);
  }
  printf("\n");

  int indexToDelete = 2;
  if (indexToDelete >= 0 && indexToDelete < n - 1)
  {
    // 确保索引有效且不是最后一个元素
    for (int i = indexToDelete; i < n - 1; i++)
    {
      array[i] = array[i + 1]; // 将后续元素向前移动
    }
    n--; // 更新数组的逻辑大小(注意:内存大小仍然是原来的)
  }
  else
  {
    printf("索引无效!\n");
  }

  // 打印修改后的数组
  printf("模拟删除索引处元素后的数组:\n");
  for (int i = 0; i < n; i++)
  {
    printf("%d ", array[i]);
  }
  printf("\n");

  // 释放动态分配的内存
  free(array);

  return 0;
}

在这里插入图片描述

第十三题

动态申请⼀个整型数组,并给每个元素赋值,要求在第4个元素后插⼊100

代码:

/*************************************************************************
  > File Name:    home13.c
  > Author:       霍巨鑫
  > Description:  动态申请⼀个整型数组,并给每个元素赋值,要求在第4个元素后插⼊100
  > Created Time: 2024年12月22日 星期日 19时56分07秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int size = 10;                                // 数组初始大小
  int *arr = (int *)malloc(size * sizeof(int)); // 动态分配内存
  if (arr == NULL)
  {
    printf("内存分配失败\n");
    return 1;
  }

  // 初始化数组元素
  for (int i = 0; i < size; i++)
  {
    arr[i] = i + 1; // 数组元素为1, 2, 3, ..., 10
  }

  // 打印原始数组
  printf("原始数组:\n");
  for (int i = 0; i < size; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");

  // 插入位置(第4个元素后,索引3后)
  int insertIdx = 3;

  // 创建新数组以容纳新元素
  int *newarr = (int *)malloc((size + 1) * sizeof(int)); // 数组大小加1
  if (newarr == NULL)
  {
    printf("新数组内存分配失败\n");
    free(arr); // 释放旧数组内存
    return 1;
  }

  // 复制旧数组元素到新数组,并插入新元素
  for (int i = 0; i < insertIdx; i++)
  {
    newarr[i] = arr[i];
  }
  newarr[insertIdx] = 100; // 插入新元素
  for (int i = insertIdx; i < size; i++)
  {
    newarr[i + 1] = arr[i]; // 移动旧数组剩余元素
  }

  // 更新数组大小和指针
  size++;
  free(arr);    // 释放旧数组内存
  arr = newarr; // 更新指针指向新数组

  // 打印修改后的数组
  printf("在索引3后插入100后的数组:\n");
  for (int i = 0; i < size; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");

  // 释放动态分配的内存
  free(arr);// 运行的时候删除掉

  return 0;
}

运行结果:

在这里插入图片描述

第十四题

控制台输⼊⼀个n,要求创建⼀个n⾏n列的数列,求对⻆线上元素的和,要求使⽤指针实现

代码:

/*************************************************************************
  > File Name:    home14.c
  > Author:       霍巨鑫
  > Description:
  > Created Time: 2024年12月22日 星期日 20时01分11秒
 ************************************************************************/

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int n;
  printf("请输入矩阵的行数(n): ");
  scanf("%d", &n);

  // 动态分配二维数组的内存
  int **matrix = (int **)malloc(n * sizeof(int *));
  for (int i = 0; i < n; i++)
  {
    matrix[i] = (int *)malloc(n * sizeof(int));
  }

  // 初始化二维数组(示例中使用1到n^2的整数进行填充)
  int value = 1;
  for (int i = 0; i < n; i++)
  {
    for (int j = 0; j < n; j++)
    {
      matrix[i][j] = value++;
    }
  }

  // 计算对角线上元素的和(包括主对角线和副对角线)
  int sumMainDiag = 0;
  int sumAntiDiag = 0;
  for (int i = 0; i < n; i++)
  {
    sumMainDiag += matrix[i][i];         // 主对角线元素
    sumAntiDiag += matrix[i][n - 1 - i]; // 副对角线元素
  }

  // 如果n为奇数,则中心元素被重复计算,需从副对角线和中减去
  if (n % 2 == 1)
  {
    int mid = n / 2;
    sumAntiDiag -= matrix[mid][mid];
  }

  // 输出对角线上元素的和
  printf("主对角线上元素的和: %d\n", sumMainDiag);
  printf("副对角线上元素的和: %d\n", sumAntiDiag);

  // 释放动态分配的内存
  for (int i = 0; i < n; i++)
  {
    free(matrix[i]);
  }
  free(matrix);

  return 0;
}

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值