C语言,传递指针(地址)给函数

当函数的形参类型是指针类型时,是使用该函数时,需要传递指针,或者地址,或者数组给该形参,举例说明:

案例1 - 传地址或指针给指针变量

代码展示

#include <stdio.h> 

void test2(int *p); //函数声明,接收 int *

void main() { 
	int num=90; 
	int *p = &num; //将 num 的地址赋给 p 
	test2(&num); //传地址 

	printf("\nmain() 中的 num=%d", num); // num = 91 

	test2(p); //传指针 
	printf("\nmain() 中的 num=%d", num);// num = 92 
}


void test2(int *p) { 
	*p += 1; //*p 就访问 num 的值 
}

第一次传递时:传递了&num,但是&num也是指针类型,故成立,第二次传递时,传递了p ,p也是指针类型,还是成立,所以第一个结果为91,第二个结果为92

结果:

在这里插入图片描述

案例 2-传数组给指针变量

数组名本身就代表该数组首地址,因此传数组的本质就是传地址。

代码演示

#include <stdio.h> 

/* 函数声明 */ 
double getAverage(int *arr, int size); //函数声明 
double getAverage2(int *arr, int size); //函数声明 

int main (){ 
	/* 带有 5 个元素的整型数组 */ 
	int balance[5] = {1000, 2, 3, 17, 50}; 
	
	double avg; /* 传递一个指向数组的指针作为参数 */ 
	
	avg = getAverage( balance, 5 ) ; 
	/* 输出返回值 */ 
	printf("Average value is: %f\n", avg ); 
	
	return 0; 
}

//说明 
//1. arr 是一个指针, 
double getAverage(int *arr, int size) { 
	int i, sum = 0; 
	double avg; 
	
	for (i = 0; i < size; ++i) { 
	
		// arr[0] = arr + 0 
		// arr[1] = arr + 1 个 int 字节(4) 
		// arr[2] = arr + 2 个 int 字节(8) 
		//... sum += arr[i];
		// arr[0] =>数组第一个元素的地址 arr[1] 
		sum += arr[i];// arr[0] =>数组第一个元素的地址 arr[1]
		printf("arr 存放的地址=%p\n", arr); //存放的是数组的首个数的地址值,并没有进行arr的自增操作,只会存放首地址值。 
		
	}
	avg = (double)sum / size; 
	return avg; 
}

//arr存放数组, size,存放个数 
double getAverage2(int *arr, int size) { 
	int i, sum = 0; 
	double avg; 
	
	for (i = 0; i < size; i++) { 
		sum += *arr; 
		printf("arr 存放的地址=%p\n", arr); 
		
		arr++; // 指针的++运算, 会对 arr 存放的地址做修改 (每次自增,增加了4个字节) 
	}
	avg = (double)sum / size;  //总和除以个数 
	return avg; 
}

getAverage函数结果:
在这里插入图片描述
getAverage2函数结果:
在这里插入图片描述

思路题

如果在 getAverage()函数中,通过指针修改了数组的值,那么 main 函数的 balance 数组的值是否会相应变化?
会的 因为 getVerage 函数中的指针,指向的就是 main 函数的数组.

微信扫码订阅
UP更新不错过~
关注
  • 1
    点赞
  • 9
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论

打赏作者

Alienware^

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值