指针:存储内存地址的变量
定义格式:数据类型 * 指针名
案例1:
使用指针交换两个变量的值
#include<stdio.h>
void swap(int* p1, int* p2); //提前声明要调用的函数
int main() {
//先定义两个变量
int a = 10;
int b = 30;
printf("交换前:a=%d b=%d\n", a, b);
swap(&a, &b);
printf("交换后:a=%d b=%d\n", a, b);
}
//定义一个函数用于交换变量
void swap(int* p1, int* p2) { //利用指针将要交换的变量的地址传递进去
int temp = *p1; //再通过*p 、*p2的形式表示地址所代表的变量
*p1 = *p2; //再进行交换,就可以真正的交换a和b的值
*p2 = temp;
}
下面带来一个类似的案例来加深对于指针的理解
#include<stdio.h>
void fun(int num1, int num2) {
int x = num1;
num1 = num2;
num2 = x;
}
int main() {
int a = 10;
int b = 30;
printf("调用前:%d,%d\n", a, b);
fun(a,b);
printf("调用后:%d,%d\n", a, b);
}
从运算结果来看很显然,并没有交换两个变量的值
原因:该函数接收的只是两个数值,所以交换的也只是这两个
数值,实际上这两个数值所代表的变量并没有交换
a依旧等于10,b依旧等于30
这个函数相当于将a和b中的数值复制一份传给该函数
所以交换也仅仅是10和30这两个数字而已
对于a和b并没有影响
案例2:
求一个数组中的最大值和最小值
#include<stdio.h>
//求一个数组中的最大值和最小值
void fun(int arr[], int len, int* max, int* min);
int main() {
int arr[] = { 1,2,3,4,5,6,7,8 };
int len = sizeof(arr) / sizeof(int);
int max = arr[0];
int min = arr[0];
fun(arr, len,&max,&min);
printf("最大值为:%d\n最小值为: %d\n", max, min);
}
void fun(int arr[], int len,int* max,int* min) { //将定义的最大值和最小的地址和数组元素
//和数组长度接收
for (int i = 0; i < len; i++) {
if (*max < arr[i]) {
*max = arr[i];
}
}
for (int i = 0; i < len; i++) {
if (*min > arr[i]) {
*min = arr[i];
}
}
}
案例3:
定义一个函数将两数相除求余数
#include<stdio.h>
int fun(int a, int b, int* p);
int main() {
//先定义两个要相处的变量
int a = 10;
int b = 6;
int p = 0; //用于传递和接收余数
p = fun(a, b, &p);
if (p != 1) {
printf("余数为:%d", p);
}
}
int fun(int a, int b, int* p) {
if (b == 0) {
return 1;
}
*p = a % b;
return *p;
}
案例4:
使用void指针交换两个变量
#include<stdio.h>
void swap(void* a, void* b, int len);
int main() {
int p1 = 30;
int p2 = 80;
printf("交换前:p1=%d p2=%d\n", p1, p2);
swap(&p1, &p2, 4);
printf("交换后:p1=%d p2=%d\n", p1, p2);
}
//创建函数形参为void指针
void swap(void* a, void* b, int len) { //len为传入的数据的数据类型的字节大小
//先将无数据类型指针转换成单字节char类型指针
char* a1 = a;
char* b1 = b;
//再利用for循环将变量的每个字节所对应的数据逐个交换
char temp = 0;
for (int i = 0; i < len; i++) {
temp = *a1;
*a1 = *b1;
*b1 = temp;
a1++;
b1++;
}
}
案例5:
使用指针遍历数组
#include<stdio.h>
int main() {
//先定义一个数组
int arr[] = { 1,2,3,4,5,6,7,8 };
int len = sizeof(arr) / sizeof(int); //求数组的长度便于后面循环使用
int* p = &arr[0]; //将数组的首地址传递给指针
for (int i = 0; i < len; i++) {
printf("%d\n", *p); //循环遍历数组中的元素
p++; //遍历过程是:指针p从数组首地址开始解引用求出其所代表的值
} //随后指针往后移1*(数据类型所代表的字节数),这里是int
return 0; //所以每次移4个字节,随后又解引用直到遍历完数组中所有以元素
}