指针的相关案例

指针:存储内存地址的变量

定义格式:数据类型  *  指针名

案例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个字节,随后又解引用直到遍历完数组中所有以元素
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值