指针参数和返回值指针相关问题
一、前言
我们知道普通变量作为参数传入函数是无法修改变量的值,如下示例就是典型的
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();
}
}
运行结果:
标签:function,变量,int,修改,参数,printf,返回值,指针 From: https://www.cnblogs.com/caojun97/p/17030568.html