热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言中指针的基本概念与应用入门

本文介绍了C语言中指针的基础知识及其初步应用。首先,文章详细解释了如何定义变量和指针,例如通过`inti,j,k;`定义整型变量,以及使用`int*pi,*pj,*pk;`来声明指向整型数据的指针。接着,探讨了变量和指针的初始化方法,强调了正确的初始化对于避免程序错误的重要性。此外,还简要介绍了指针在数组、函数参数传递等场景中的基本应用,为初学者提供了全面的入门指导。

1、指针和变量的定义

//变量定义
int i,j,k;//指针的定义
int *pi,*pj,*pk;

2、指针和变量的初始化

//变量定义
int i,j,k;//指针的定义
int *pi,*pj,*pk;//变量的初始化
i = 10;
j = 100;
k = 1000;//指针的初始化
pi = &i;
pj = &j;
pk = &k;

如果你还不知道&和*的用法和作用,可以参考我这篇:
《C语言中的&和*》


3、指针如何作为参数

#include void maxV(int a,int b,int *max)
{if( a > b){*max = a; }else{*max = b;}
}int main()
{//变量定义int i,j,k;//指针的定义int *pi,*pj,*pk;//变量的初始化i = 10;j = 100;k = 1000;//指针的初始化pi = &i;pj = &j;pk = &k;int max;maxV(i,j,&max);printf("最大的数是:%d\n",max);return 0;
}

结果:

最大的数是:100

4、指针如何作为返回值

#include void maxV(int a,int b,int *max)
{if( a > b){*max = a;}else{*max = b;}
}int *maxV2(int *a,int *b)
{return *a > *b ? a : b;
}int main()
{//变量定义int i,j,k;//指针的定义int *pi,*pj,*pk;//变量的初始化i = 10;j = 100;k = 1000;//指针的初始化pi = &i;pj = &j;pk = &k;int max;maxV(i,j,&max);printf("最大的数是:%d\n",max);printf("最大的数是:%d\n",*maxV2(&j,&k));return 0;
}

结果:

最大的数是:100
最大的数是:1000

5、案例1:完成swap函数,完成两个参数交换的功能

zhenghui@zhlinux:~/codeProject/11指针$
zhenghui@zhlinux:~/codeProject/11指针$ cat swap.c
#include void swap(int *p,int *q)
{int temp = *p;*p = *q;*q = temp;
}int main()
{int a=10;int b=20;swap(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;
}
zhenghui@zhlinux:~/codeProject/11指针$
zhenghui@zhlinux:~/codeProject/11指针$
zhenghui@zhlinux:~/codeProject/11指针$ ./a.out
a=20,b=10
zhenghui@zhlinux:~/codeProject/11指针$

6、案例2:找到最大和第二大的值

题目如下:
在这里插入图片描述
方法一:两次循环

第一次:找出最大的值,然后记录下来最大值的位置;
第二次查找的时候把最大值的位置的数据给清空,继续寻找最大的值,那么这一次的最大的值就是第二大的。

#include
#define ARRAY_SIZE(array) ((int) (sizeof(array) / sizeof(array[0]) ))/**查找最大的值和第二大的值* */
void find_tow_largest(int a[],int n,int *largest,int *second_largest)
{//1、找到最大的值*largest &#61; a[0];//记录下来最大的值的位置int maxIndex &#61; 0;for(int i &#61; 1;i<n;i&#43;&#43;){if(*largest < a[i]){*largest &#61; a[i];maxIndex &#61; i;}}//2、找第二大的值//把最大的值变成最小的值a[maxIndex] &#61; -1;*second_largest &#61; a[0];for(int i &#61; 1;i<n;i&#43;&#43;){if(*second_largest < a[i]){*second_largest &#61; a[i];}
"find_tow_larget.c" 54L, 863C 31,2-9 顶端*largest &#61; a[i];maxIndex &#61; i;}}//2、找第二大的值//把最大的值变成最小的值a[maxIndex] &#61; -1;*second_largest &#61; a[0];for(int i &#61; 1;i<n;i&#43;&#43;){if(*second_largest < a[i]){*second_largest &#61; a[i];}}}int main()
{int a[] &#61; {1,5,2,4,7,5,8,234};int n &#61; ARRAY_SIZE(a);int largest,second_largest;find_tow_largest(a,n,&largest,&second_largest);printf("最大的是&#xff1a;%d,第二大的是&#xff1a;%d\n",largest,second_largest);return 0;
}

执行结果&#xff1a;

zhenghui&#64;zhlinux:~/codeProject/11指针$ vim find_tow_larget.c
zhenghui&#64;zhlinux:~/codeProject/11指针$
zhenghui&#64;zhlinux:~/codeProject/11指针$
zhenghui&#64;zhlinux:~/codeProject/11指针$ gcc find_tow_larget.c
zhenghui&#64;zhlinux:~/codeProject/11指针$
zhenghui&#64;zhlinux:~/codeProject/11指针$ ./a.out
最大的是&#xff1a;234,第二大的是&#xff1a;8
zhenghui&#64;zhlinux:~/codeProject/11指针$

方法2&#xff1a;排序

可以利用数组的排序来做&#xff0c;任何排序都可以。

这里选用插入排序来做。

zhenghui&#64;zhlinux:~/codeProject/11指针$
zhenghui&#64;zhlinux:~/codeProject/11指针$ cat find_tow_larget.c
#include
#define ARRAY_SIZE(array) ((int) (sizeof(array) / sizeof(array[0]) ))/**查找最大的值和第二大的值* */
void find_tow_largest(int a[],int n,int *largest,int *second_largest)
{//1、找到最大的值*largest &#61; a[0];//记录下来最大的值的位置int maxIndex &#61; 0;for(int i &#61; 1;i<n;i&#43;&#43;){if(*largest < a[i]){*largest &#61; a[i];maxIndex &#61; i;}}//2、找第二大的值//把最大的值变成最小的值a[maxIndex] &#61; -1;*second_largest &#61; a[0];for(int i &#61; 1;i<n;i&#43;&#43;){if(*second_largest < a[i]){*second_largest &#61; a[i];}}}/**使用排序查找最大的值和第二大的值* */
void find_sort_tow_largest(int a[],int n,int *largest,int *second_largest)
{//1、初始化for(int i &#61; 1;i<n;i&#43;&#43;){if(a[i-1] > a[i]){int j &#61; i - 1;int temp &#61; a[i];while(j > -1 && temp < a[j]){a[j&#43;1] &#61; a[j];j--;}a[j&#43;1] &#61; temp;}}*largest &#61; a[n-1];*second_largest &#61; a[n-2];}int main()
{int a[] &#61; {1,5,2,4,7,5,8,234};int n &#61; ARRAY_SIZE(a);int largest,second_largest;//find_tow_largest(a,n,&largest,&second_largest);find_sort_tow_largest(a,n,&largest,&second_largest);printf("最大的是&#xff1a;%d,第二大的是&#xff1a;%d\n",largest,second_largest);return 0;
}

结果&#xff1a;

zhenghui&#64;zhlinux:~/codeProject/11指针$ ./a.out
最大的是&#xff1a;234,第二大的是&#xff1a;8
zhenghui&#64;zhlinux:~/codeProject/11指针$

推荐阅读
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • 如何判断一个度序列能否构成简单图——哈维尔-哈基米算法的应用与解析 ... [详细]
  • 本研究基于状态空间方法,通过动态可视化技术实现了汉诺塔问题的求解过程,即将n个盘子从A柱移动到C柱。本文提供了一个使用C语言在控制台进行动画绘制的示例,并详细注释了程序逻辑,以帮助读者更好地理解和学习该算法。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 如何利用C语言进行高效的商品管理程序设计与开发
    本文详细探讨了使用C语言高效开发商品管理系统的技巧与方法。通过简洁明了的代码示例,文章逐步引导读者掌握商品管理程序的设计与实现,适合初学者及有一定基础的开发者参考学习。 ... [详细]
  • Android数组截取技巧及JNI数组交互在仓库构建中的应用分析
    在Android开发中,数组截取技巧和JNI数组交互在仓库构建中的应用具有重要意义。JNI提供了两种主要的数组处理方法:一是生成原生层数组的副本,二是直接通过数组指针进行操作。在进行字符串处理时,如果需要执行其他复杂操作,可以结合这两种方法以提高效率和灵活性。此外,合理利用这些技术可以显著提升应用程序的性能和稳定性。 ... [详细]
  • 深入分析 Linux 内核链表转
    引用地址:http:www.ibm.comdeveloperworkscnlinuxkernell-chainindex.html一、链表数据结构简介链表是一种常用的 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • 在Linux系统中,原本已安装了多个版本的Python 2,并且还安装了Anaconda,其中包含了Python 3。本文详细介绍了如何通过配置环境变量,使系统默认使用指定版本的Python,以便在不同版本之间轻松切换。此外,文章还提供了具体的实践步骤和注意事项,帮助用户高效地管理和使用不同版本的Python环境。 ... [详细]
  • C++20 引入了指定初始化器(Designated Initializers),这一特性借鉴了 C# 的对象初始化器和 Kotlin 的 apply 范围函数。指定初始化器允许开发者在初始化结构体或类时,直接指定成员变量的值,提高了代码的可读性和简洁性。此外,该特性还支持嵌套初始化,使得复杂对象的初始化更加直观和灵活。本文将详细解析指定初始化器的语法、应用场景及其实现细节,并通过具体示例展示其在实际开发中的优势。 ... [详细]
  • CCCCGPLT L2005: 集合相似度计算的双指针算法优化 ... [详细]
  • 在幼儿园中,有 \( n \) 个小朋友需要通过投票来决定是否午睡。尽管这个问题对每个孩子来说并不是特别重要,但他们仍然希望通过谦让的方式达成一致。每个人都有自己的偏好,但为了集体和谐,他们决定采用一种最小割的方法来解决这一问题。这种方法不仅能够确保每个人的意愿得到尽可能多的尊重,还能找到一个最优的解决方案,使整体满意度最大化。 ... [详细]
author-avatar
路啦Nantale
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有