作者:路啦Nantale | 来源:互联网 | 2024-10-30 13:50
本文介绍了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)
{*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;}}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;}}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)
{*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;}}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)
{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_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指针$