热门标签 | 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指针$

推荐阅读
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社区 版权所有