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;
如果你还不知道&和*的用法和作用,可以参考我这篇:
3、指针如何作为参数
#include <stdio.h> 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> #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 = a[0]; //记录下来最大的值的位置 int maxIndex = 0; for(int i = 1;i<n;i++) { if(*largest < a[i]) { *largest = a[i]; maxIndex = i; } } //2、找第二大的值 //把最大的值变成最小的值 a[maxIndex] = -1; *second_largest = a[0]; for(int i = 1;i<n;i++) { if(*second_largest < a[i]) { *second_largest = a[i]; } "find_tow_larget.c" 54L, 863C 31,2-9 顶端 *largest = a[i]; maxIndex = i; } } //2、找第二大的值 //把最大的值变成最小的值 a[maxIndex] = -1; *second_largest = a[0]; for(int i = 1;i<n;i++) { if(*second_largest < a[i]) { *second_largest = a[i]; } } } int main() { int a[] = {1,5,2,4,7,5,8,234}; int n = ARRAY_SIZE(a); int largest,second_largest; find_tow_largest(a,n,&largest,&second_largest); printf("最大的是:%d,第二大的是:%d\n",largest,second_largest); return 0; }
执行结果:
zhenghui@zhlinux:~/codeProject/11指针$ vim find_tow_larget.c zhenghui@zhlinux:~/codeProject/11指针$ zhenghui@zhlinux:~/codeProject/11指针$ zhenghui@zhlinux:~/codeProject/11指针$ gcc find_tow_larget.c zhenghui@zhlinux:~/codeProject/11指针$ zhenghui@zhlinux:~/codeProject/11指针$ ./a.out 最大的是:234,第二大的是:8 zhenghui@zhlinux:~/codeProject/11指针$
方法2:排序
可以利用数组的排序来做,任何排序都可以。
这里选用插入排序来做。
zhenghui@zhlinux:~/codeProject/11指针$ zhenghui@zhlinux:~/codeProject/11指针$ cat find_tow_larget.c #include <stdio.h> #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 = a[0]; //记录下来最大的值的位置 int maxIndex = 0; for(int i = 1;i<n;i++) { if(*largest < a[i]) { *largest = a[i]; maxIndex = i; } } //2、找第二大的值 //把最大的值变成最小的值 a[maxIndex] = -1; *second_largest = a[0]; for(int i = 1;i<n;i++) { if(*second_largest < a[i]) { *second_largest = a[i]; } } } /* *使用排序查找最大的值和第二大的值 * */ void find_sort_tow_largest(int a[],int n,int *largest,int *second_largest) { //1、初始化 for(int i = 1;i<n;i++) { if(a[i-1] > a[i]) { int j = i - 1; int temp = a[i]; while(j > -1 && temp < a[j]) { a[j+1] = a[j]; j--; } a[j+1] = temp; } } *largest = a[n-1]; *second_largest = a[n-2]; } int main() { int a[] = {1,5,2,4,7,5,8,234}; int n = 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("最大的是:%d,第二大的是:%d\n",largest,second_largest); return 0; }
结果:
zhenghui@zhlinux:~/codeProject/11指针$ ./a.out 最大的是:234,第二大的是:8 zhenghui@zhlinux:~/codeProject/11指针$