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

文章目录

  • 案例1 - 传地址或指针给指针变量
  • 案例 2-传数组给指针变量
  • 思路题

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

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

代码展示

#include  

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

void main() { 
	int num=90; 
	int *p = # //将 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

结果:

C语言,传递指针(地址)给函数_第1张图片

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

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

代码演示

#include  

/* 函数声明 */ 
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函数结果:
C语言,传递指针(地址)给函数_第2张图片
getAverage2函数结果:
C语言,传递指针(地址)给函数_第3张图片

思路题

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

你可能感兴趣的:(C语言,c语言,数据结构,算法)