1.首先我们用两数交换值举例:
第一种解答:
#include<stdio.h>
int main() {
void swap(int a, int b);
printf("请输入两个值:");
int a, b;
scanf_s("%d %d", &a, &b);
swap(a, b);
return 0;
}
void swap(int a, int b) {
printf("%d %d", b, a);
}
我们仔细观察这个这个程序,它交换两个数并不是把a和b两个变量放入函数,从而交换a和b的值,而是直接交换a和b的值,中间不涉及这两个变量,仅仅是将值在不同位置打印出来
*他们的传递的只是参数副本,而不是原始变量的地址。
第二种解答:
#include<stdio.h>
void swap(int* a, int* b);
int main() {
printf("请输入两个值:");
int a, b;
scanf_s("%d %d",&a,&b);
swap(&a,&b);
return 0;
}
void swap(int* a,int* b) {
int temp = *a;
*a = *b;
*b = temp;
printf("%d %d\n", *a, *b);
return 0;
}
而这个程序,借用指针完成了接受两个整数作为输入,并交换他们的值
指针是一种变量,其值为另一个变量的地址,通过指针可以直接访问和操作内存中的数据
在使用指针的时候用&将变量的地址传递给函数,这样函数内部就能通过指针来改变变量的值。
2.下面是指针的一个初步运用,利用指针解决问题
输出一组数,从中找出最大数和最小数
#include<stdio.h>
void minmax(int num[], int len, int* min, int* max);
int main() {
int num[] = {1,12,34,5,454,64,74,24,52,546,2436,2,62345,451436};
int min, max;
minmax(num, sizeof(num) / sizeof(num[0]), &min, &max);
printf("最大值为%d,最小值为%d\n", max, min);
return 0;
}
void minmax(int num[],int len, int* min, int* max) {
*max = num[0];
*min = num[0];
for (int i = 0; i < len; i++) {
if (num[i]>*max) {
*max = num[i];
}
if (num[i] < *min) {
min = num[i];
}
}
}
注意:在主函数写自己的建的函数的时候不需要给其说明类型;
引用函数的时候,注意类型和自己的创建的函数一样(尤其在出现bug修改的时候)
注意这个操作:if(num[i]>*max){*max=num[i];}和冒泡排序的区别,在这里因为只要找出最大值,所以不需要排序,所以操作略有不同。
3利用指针写一个做除法的题(这道程序和的有不一样的地方)
#include<stdio.h>
int divide(int a, int b, int* c);
int main() {
int a, b;
int c;
printf("请输入被除数和除数:");
scanf_s("%d %d",&a,&b);
if (divide(a, b, &c)) {
printf("结果为%d\n", c);
}
return 0;
}
int divide(int a, int b, int* c) {
if (b == 0) {
return 0;
}
else {
*c = a / b;
return 1;
}
}
上面提示了不一样的,那有哪些不一样了呢?比如我们设立了函数,那个函数用的是int 而没用像以往一样用 void开头,为什么呢?因为这次我们需要做一个判断,有判断就肯定有返值,我们知道在一个程序中1表示这个程序执行成功,可以进行下一步操作;而0则表示失败,无法进行下一步操作,这个程序就是利用了这一点,用其返回值做了一个判断,而在哪里接受这个判断呢?if就登场了,它作为这个程序继不继续往下运行的屏障。
注意:本次只是使用了c的指针(所以主程序有&符号而我们写的函数中有*的符号),变量a和b只是引用了值,并没有对其造成改变。