指针练习题15道【C语言】

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

声明:

void work1(int *, int); // 声明反向遍历
void work1_1(int *, int); // 声明正向遍历

实现:

// 利用指针变量将一个数组中的数据反向输出,反向遍历
void work1( int *p,int len)
{p += (len - 1);for(int i = 0; i < len; i++){if(i%4 == 0 && i != 0)  printf("\n");printf("arr[%d]=%d \t", len - i, *(p-i));}printf("\n");
}
// 利用指针变量将一个数组中的数据正向输出,正向遍历
void work1_1( int *p,int len)
{   for(int i = 0; i < len; i++){if(i%4 == 0 && i != 0)  printf("\n");printf("arr[%d]=%d \t", i, *(p+i));}printf("\n");
}

调用:

// 定义并初始化一个一维数组int arr[10] = {90,98,87,76,65,54,43,32,21,10};int len = sizeof(arr)/sizeof(arr[0]);printf("正向输出:\n");work1_1(arr, len);printf("反向输出:\n");work1(arr,len);

运行截图
在这里插入图片描述

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

声明

int work2(int *,int); // 声明下标奇数之和

实现

// 下标奇数之和
int work2(int *p, int len)
{int sum = 0;for(int i = 0; i < len; i++){if(i%2 != 0 && i != 0)sum += *(p + i);}return sum;
}

调用

// 定义并初始化一个一维数组int arr[10] = {90,98,87,76,65,54,43,32,21,10};int len = sizeof(arr)/sizeof(arr[0]);printf("数组下标是奇数的和:%d\n", work2(arr,len));

运行截图

在这里插入图片描述

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

int *a;float *b;char c;printf("整型:%ld,浮点型:%ld,字符型:%ld\n", sizeof(a), sizeof(b), sizeof(c));

运行截图:

在这里插入图片描述

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

函数实现:

void work4(char *p, int len)
{for(int i = 0; i < len; i++){if(*(p + i) == '\0') break;printf("%c", p[i]);}printf("\n");
}

函数调用

char crr[20] = "iaofgaeuu932578";int len4 = sizeof(crr)/sizeof(crr[0]);work4(crr,len4);

运行截图
在这里插入图片描述

5.浮点型数组的平均值

实现

// 求浮点型数组元素的平均值
double work5(double *p, int len)
{double sum = 0.0;for(int i = 0; i < len; i++){sum += *(p + i);}return sum/len;
}

调用

double drr[5] = {12.3,1.2,5.5,3.3,6.6};int len5 = sizeof(drr)/sizeof(drr[0]);printf("%lf\n", work5(drr,len5));

运行截图

在这里插入图片描述

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

(1)求一个字符串长度

实现

// 求字符串长度
int work6_1(char *p,int len)
{int i = 0;while(i < len ){if(p[i] != '\0'){i++;}else{break;}}return i;
}

调用

char crr[40] = "iaofgaKUDu932578";int len4 = sizeof(crr)/sizeof(crr[0]);printf("字符串的长度是:%d\n", work6_1(crr,len4));

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

实现

// 统计大写字母个数
int work6_2(char *p,int len)
{int n = 0, i = 0;while(i < work6_1(p,len) ){if(*(p+i) >= 'A' && *(p+i) <= 'Z') n++;i++;}return n;
}

调用

char crr[40] = "iaofgaKUDu932578";
int len4 = sizeof(crr)/sizeof(crr[0]);
printf("字符串大写字母个数是:%d\n", work6_2(crr,len4));

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

实现

// 统计数字字符
int work6_3(char *p, int len)
{int n = 0,i = 0;while(i < work6_1(p,len)){if(*(p+i) >= 48 && p[i] <= '9' ) n++;i++;}return n;
}

调用

char crr[40] = "iaofgaKUDu932578";
int len4 = sizeof(crr)/sizeof(crr[0]);
printf("字符串数字字符个数是:%d\n", work6_3(crr,len4));

运行截图

在这里插入图片描述

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

函数实现:

// 行列转置(行列相同)
void work7(int (*p)[3], int len)
{int a[len][len];for(int i = 0; i < len; i++){for(int j = 0; j < len; j++ ){a[j][i] = p[i][j];}printf("\n");}for(int i = 0; i < len; i++ ){for(int j = 0; j < len; j++){p[i][j] = a[i][j];}}printf("数组已转置\n");
}

函数调用

int arr7[3][3] = {11,12,13,21,22,23,31,32,33};int len7 = sizeof(arr7)/sizeof(arr7[0]);int (*p)[len7] = arr7;work7(p,len7);for(int i = 0; i < len7*len7; i++){if(i != 0 && i%3 == 0) printf("\n");printf("%d  ",*(*arr7 + i));}printf("\n");

运行截图

在这里插入图片描述

8.上三角0的个数

实现

// 指针做形参,实现统计二维数组上三角中的0的数量
int work8(int* p,int row, int col)
{int n = 0;for(int i = 0; i < row; i++){for(int j = 0; j < col - i; j++){if(!*(p + j + i*col)) n++;}}return n;
}

调用

int arr8[4][4] = {1,1,1,0,0,0,1,1,0,1,0,1,0,1,1,0};int row = sizeof(arr8)/sizeof(arr8[0]), col = sizeof(arr8[0])/sizeof(arr8[0][0]);printf("遍历数组:\n");for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){printf("%3d\t", arr8[i][j]);}printf("\n");}printf("\n上半角0的个数是:%d\n", work8(&arr8[0][0], row, col));

运行截图

在这里插入图片描述

9.返回二维数组的最大值元素的地址。

实现

// 返回最大值地址
int* work9(int* p, int len)
{int *max = p;for(int i = 0; i < len; i++){if(*max < *(p+i)) max = p+i;}return max;
}

调用

int arr9[4][4] = {1,2,3,4,5,6,7,999,8,9,11,23,44,55,66,77};int row = sizeof(arr9)/sizeof(arr9[0]), col = sizeof(arr9[0])/sizeof(arr9[0][0]);int *max = &arr9[0][0];printf("遍历数组:\n");for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(*max < arr9[i][j]) max = &arr9[i][j];printf("%3d\t", arr9[i][j]);}printf("\n");}printf("\n最大值的地址是%p,%p\n", work9(&arr9[0][0], row * col), max);

运行截图
在这里插入图片描述

10.面试题

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

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

3)定义整形一维数组p,它有n 个整形元素; // int n = 10, 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;

11.找出第一次出现 12.35 的下标位置,并输出。

实现

// 查找12.35的下标
int work11(float* p, int len, float n)
{int i = 0;for(;i < len; i++){if(*(p+i) - n == 0) return i;}return -1;
}

调用

float a11[10] = {1.1,2.2,3.3,4.4,5.5,12.35,6.6,7.7,8.8,9.9};float* p11 = (float*)calloc(10,sizeof(float));if(!p11){perror("内存申请失败!");return 0;}memcpy(p11,a11, 10 * sizeof(float));printf("遍历复制数据后的数组:");for(int i = 0; i < 10; i++ ){printf("%.2f  ", *(p11+i));}printf("\n");printf("12.35的下标位置是:a11[%d]\n", work11(p11,10,12.35));free(p11);p11 = NULL;

运行截图

在这里插入图片描述

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

代码:

int a12[5] = {1,2,3,4,5};int* p12 = (int*)calloc(5,sizeof(int));if(!p12){perror("内存申请失败!");return -1;}// 对申请的堆内存进行初始化memcpy(p12, a12, 5*4);// 遍历申请的堆内存for(int i = 0; i < 5; i++){printf("%d ", *(p12+i));}printf("\n");memset(p12+2, 0, 1*4);// 再次遍历for(int i = 0; i < 5; i++){printf("%d ", *(p12+i));}printf("\n");free(p12);p12 = NULL;

运行截图:

在这里插入图片描述

13.动态申请一个整型数组,并给每个元素赋值,要求在第4个元素后插入100;

代码:

int* p13 = (int*)malloc(40);if(!p13){perror("内存申请失败!");return -1;}memset(p13, 0, 40);// 遍历for(int i = 0; i < 10; i++){printf("%d ", *(p13 + i));}printf("\n");// 再次遍历for(int i = 0; i < 10;  i++){if(i > 3) p13[i] = 100;printf("%d ", *(p13+i));}printf("\n");free(p13);p13 = NULL;

运行截图

在这里插入图片描述

14.控制台输入一个n,要求创建一个n行n列的数列,求对角线上元素的和,要求使用指针实现

代码:

int n;printf("请输入行列的大小:\n");scanf("%d", &n);int *p = (int*)calloc(n*n,sizeof(int));if(!p){perror("内存申请失败!");return -1;}// 给数组赋值printf("请输入数组元素\n");for(int i = 0; i < n*n; i++ ){scanf("%d", p+i);}// 遍历数组printf("赋值后的数组:\n");for(int i = 0; i < n*n; i++){if(i != 0 && i % n == 0) printf("\n");printf("%d\t", *(p+i));}printf("\n");int sum = 0, sum2 = 0;for(int i = 0; i < n; i++){//printf("%d ", *(p + i*n + i));sum += *(p+i*n + i);sum2 += *(p + n*i + n - 1 - i);}printf("主对角线之和是:%d\n", sum);printf("辅对角线之和是:%d\n", sum2);free(p); // 释放堆内存p = NULL; // 指针悬空

运行截图

在这里插入图片描述

15.附加题【选做】: 编写一个函数,实现 memmove 的功能。

实现

// 实现memmove的功能
void* work15(void* to, const void* from, unsigned long count)
{for(int i = 0; i < count; i++){*(char*)(to + i) = *(char*)(from + i);}return to;
}

调用

char a15_1[10] = "123456789";char a15_2[5];work15(a15_2,a15_1+2, 5 );printf("原数组:%s\n", a15_1);printf("目标数组:%s\n", a15_2);

运行截图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单节点calico性能优化

在单节点上部署calicov3273后&#xff0c;发现资源占用 修改calico以下配置是资源消耗降低 1、因为是单节点&#xff0c;没有跨节点pod网段组网需要&#xff0c;禁用overlay方式网络(ipip&#xff0c;vxlan),使用route方式网络 配置calico-node的环境变量 CALICO_IPV4POOL_I…

openjdk17 从C++视角看 String的intern的jni方法JVM_InternString方法被gcc编译器连接

symbols-unix 文件部分内容 JVM_IHashCode JVM_InitClassName JVM_InitStackTraceElement JVM_InitStackTraceElementArray JVM_InitializeFromArchive JVM_InternString 要理解在 symbols-unix 文件中包含 JVM_InternString 方法的原因&#xff0c;我们需要从构建过程、符号…

在 Spring Boot 3 中实现基于角色的访问控制

基于角色的访问控制 (RBAC) 是一种有价值的访问控制模型,可增强安全性、简化访问管理并提高效率。它在管理资源访问对安全和运营至关重要的复杂环境中尤其有益。 我们将做什么 我们有一个包含公共路由和受限路由的 Web API。受限路由需要数据库中用户的有效 JWT。 现在用户…

K8s HPA的常用功能介绍

Kubernetes 的 Horizontal Pod Autoscaler (HPA) 是一种自动扩展功能&#xff0c;用于根据资源使用情况&#xff08;如 CPU、内存等&#xff09;或自定义指标&#xff0c;动态调整 Pod 的副本数量&#xff0c;从而保证应用的性能和资源利用率。 以下是 HPA 的常用功能介绍&…

电子系统中用于降噪的接地

当接地系统中存在EMI、RFI 或由焊机、变速驱动器、电器等引起的电脉冲等干扰时&#xff0c;它们会在中性线和接地之间产生共模噪声&#xff0c;可能会影响电子设备。 国家电气规范 (NEC) 允许安装隔离接地插座 (IG)&#xff0c;即磁轭和接地端子之间没有连接。轭是插座后面的金…

SmartX分享:SMTX ZBS 中 RDMA 技术简介

目录 背景如何实现存储网络是什么TCP/IPRDMARDMA 工作原理RDMA 的实现方案 ZBS 支持 RDMA 的要求 参考 背景 我们清楚&#xff0c;分布式存储将利用网络作不同设备的互联。最基础的如TCP/IP的IP SAN&#xff0c;进阶的有FC SAN、IB等等。 SmartX 支持 10G以上的TCP/IP网络作为…

【人工智能数学基础】——深入详解贝叶斯理论:掌握贝叶斯定理及其在分类和预测中的应用

深入详解贝叶斯理论&#xff1a;掌握贝叶斯定理及其在分类和预测中的应用 贝叶斯理论&#xff08;Bayesian Theory&#xff09;是概率论和统计学中的一个重要分支&#xff0c;它以托马斯贝叶斯&#xff08;Thomas Bayes&#xff09;命名&#xff0c;主要关注如何根据新的证据更…

使用JustAuth实现gittee登录

使用JustAuth实现gittee登录 登录流程&#xff1a; 点击 Github 图标时&#xff0c;调用 handleGiteeLogin获取 Gitee 登录地址并跳转Gitee 授权后&#xff0c;后端进行相关的验证登录等成功后回调到gitee填的回调地址 1.添加依赖 <dependency><groupId>me.zhy…

矩阵的基本知识

例题1&#xff1a;求矩阵最小值&#xff0c;和其所在的行和列 #include<stdio.h> int main() { int arr[10][10]; int g; scanf("%d",&g); int m,n,i,r c; for(i0;i<g;i) { scanf("%d %d",&m,&…

《Vue3实战教程》5:响应式基础

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 响应式基础​ API 参考 本页和后面很多页面中都分别包含了选项式 API 和组合式 API 的示例代码。现在你选择的是 组合式 API。你可以使用左侧侧边栏顶部的“API 风格偏好”开关在 API 风格之间切换。 声明响应式状态…

【后端面试总结】深入解析进程和线程的区别

在操作系统和并发编程中&#xff0c;进程和线程是两个核心概念。它们各自承担着不同的职责&#xff0c;并在多任务处理中发挥着关键作用。本文将从定义、特性、应用场景以及优缺点等多个方面对进程和线程进行详细对比&#xff0c;帮助读者深入理解它们之间的区别。 一、进程和…

QT网络(二):TCP通信

传输层概念 传输控制协议&#xff08;transmission control protocol&#xff0c;TCP&#xff09;是一种被大多数 Internet 网络协议用于数据传输的底层网络协议&#xff0c;它是可靠的、面向流和连接的传输协议&#xff0c;特别适合用于连续数据传输。 应用层在网络模型中的…

【记录50】uniapp安装uview插件,样式引入失败分析及解决

SassError: Undefined variable: "$u-border-color". 表示样式变量$u-border-color没定义&#xff0c;实际是定义的 首先确保安装了scss/sass 其次&#xff0c;根目录下 app.vue中是否全局引入 <style lang"scss">import /uni_modules/uview-ui/in…

std::async 和 std::packaged_task

0、背景 在现代 C 中&#xff0c;std::async 和 std::packaged_task 是两个非常重要的工具&#xff0c;能够帮助我们更好地处理并发和异步操作。它们分别代表了异步执行任务的两种不同的方式&#xff0c;但都可以有效地将任务的执行从主线程或调用线程中分离出来&#xff0c;以…

windows上安装Redis

下载&#xff1a;https://github.com/tporadowski/redis&#xff08;官方不提供windows版&#xff09; 配置文件里设置密码&#xff1a;requirepass 123456 添加服务的命令&#xff1a; redis-server --service-install redis.windows-service.conf --loglevel verbose (--serv…

TypeScript 与 JavaScript

文章目录 一、为 JavaScript 库添加类型定义(一)什么是类型定义文件(.d.ts 文件)(二)手动编写类型定义和使用现有类型定义(如 DefinitelyTyped)手动编写类型定义使用现有类型定义(如 DefinitelyTyped)二、在 TypeScript 项目中使用流行的 JavaScript 库(如 jQuery、…

从源码构建安装Landoop kafka-connect-ui

背景 部署Landoop kafka-connect-ui最简单的办法还是通过docker来部署&#xff0c;我们之前的kafka-connect-ui就是通过docker部署的&#xff0c;但是&#xff0c;最近发现个问题&#xff1a;当使用docker部署且防火墙使用的是firewalld的情况下&#xff0c;就会出现端口冲突。…

算法—动态规划

一、简介 动态规划&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种通过将原问题分解为若干个子问题来求解最优化问题的算法思想。动态规划常常用于解决那些可以被分解为更小的重叠子问题的场景。 与分治法的区别在于&#xff0c;分治法会将问题分解成独…

Android GO 版本锁屏声音无效问题

问题描述 Android go版本 在设置中打开锁屏音开关&#xff0c;息屏灭屏还是无声音 排查 vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\keyguard\KeyguardViewMediator.java private void setupLocked() {...String soundPath Settings.G…

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…