Loading

指针参数和返回值指针相关问题

一、前言

我们知道普通变量作为参数传入函数是无法修改变量的值,如下示例就是典型的

void swap(int x, int y)
{
  int temp = x;
  x = y;
  y = temp;
}

解决方案:传入变量的指针(即地址),指针间接访问修改变量的值

void swap(int *x, int *y)
{
  int temp = *x;
  *x = *y;
  *y = temp;
}

那么问题来了,指针变量的值变化了吗,换句话说指针变量x,y的值变了吗?

二、指针参数和返回值指针

问题:请问如下示例中的函数function()能修改指针p_a的值吗?

示例:

#include <stdio.h>

int* function(int *x)
{
	*x = 10;
	x = NULL;
	return x;
}

int main(int argc, const char *argv[])
{
	{
		int a = 3;
		int *p_a = &a;
		printf("a=%d\n", *p_a);
		printf("p_a=%p\n", p_a);

		int *p = function(p_a);
		printf("a=%d\n", *p_a);
		printf("p_a=%p\n", p_a);
		printf("p=%p\n", p);
		
		getchar();
	}
}

运行结果:

由运行结果分析:函数function()可以通过指针p_a间接访问修改a的值,但无法修改指针p_a的值。

进一步分析:int 类型变量a 存放的是一个整数,而int * 类型变量p_a 存放的是一个地址。函数function()中形参int *x 只是实参int *p_a的拷贝,只能是形参 int *x 间接访问修改变量a的值,而无法修改实参 int *p_a的值。

若想修改实参int *p_a的值,可以传入指针变量p_a的地址(即地址的地址,两级指针),如下示例:

#include <stdio.h>

int* function(int **x)
{
	**x = 10;
	*x = NULL;
	return *x;
}

int main(int argc, const char *argv[])
{
	{
		int a = 3;
		int *p_a = &a;
		printf("a=%d\n", *p_a);
		printf("p_a=%p\n", p_a);

		int *p = function(&p_a);
		printf("p_a=%p\n", p_a);
		if (p_a != NULL)
		{
			printf("a=%d\n", *p_a);
		}
		printf("a=%d\n", a);
		printf("p=%p\n", p);
		
		getchar();
	}
}

运行结果:

posted @ 2023-01-06 15:14  eiSouthBoy  阅读(50)  评论(0)    收藏  举报