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 函数的数组.

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值