#include <stdio.h>
void func1(int temp)
{
printf("进入函数使用 int temp的变量传参数:\n");
printf("进入函数变量传参数的 变量空间在%x,变量值是%x\n", &temp, temp);
temp = 2;
printf("改变函数中变量的值,现在 变量空间在%x,变量值是%x\n", &temp, temp);
}
void func2(int *temp)
{
printf("进入函数使用 int *temp的变量传参数:\n");
printf("进入函数变量传参数的 变量空间在%x,变量值是%x,指向地址的值是%x\n", &temp, temp, *temp);
*temp = 2;
printf("改变函数中变量的值,现在 变量空间在%x,变量值是%x,指向地址的值是%x\n", &temp, temp, *temp);
}
void func3(int *temp)
{
int *flash;
printf("进入函数使用 int *temp的变量传参数:\n");
printf("进入函数变量传参数的 变量空间在%x,指针值是%x,指向地址的值是%x\n", &temp, temp, *temp);
flash = (int *)malloc(sizeof(int));
*flash = 3;
printf("进入函数申请一个变量空间flash, 变量空间在%x,指针值是%x,指向地址的值是%x\n", &flash, flash, *flash);
temp = flash;
printf("改变函数中一级指针的指针值,现在 变量空间在%x,指针值是%x,指向地址的值是%x\n", &temp, temp, *temp);
}
void func4(int** temp)
{
int* flash;
printf("进入函数使用 int **temp的变量传参数:\n");
printf("进入函数变量传参数的 二级指针地址%x,一级指针地址在%x,指针地址是%x,指向地址的值是%x\n", &temp, temp, *temp, **temp);
flash = (int*)malloc(sizeof(int));
*flash = 3;
printf("进入函数申请一个一级指正flash, 变量空间在%x,指针值是%x,指向地址的值是%x\n", &flash, flash, *flash);
*temp = flash;
printf("改变函数中变量的值,现在 二级指针地址%x,一级指针地址在%x,指针地址是%x,指向地址的值是%x\n", &temp, temp, *temp, **temp);
}
//#define no_this
#if defined(no_this)
int pointer_main()
#else
int main()
#endif
{
int var = 8;
int *pt = &var;
int **pt2 = &(pt);
printf("这个窗口是让你理解二级指针,一级指针和变量,在调用函数的时候的关系:\n\n");
printf("1)一级指针和变量在函数调用的关系如下:\n");
printf("申请变量var的 变量空间在%x,变量值是%x\n\n", &var, var);
func1(var);
printf("返回函数后,变量var的 变量空间在%x,变量值是%x\n\n", &var, var);
func2(&var);
printf("返回函数后,变量var的 变量空间在%x,变量值是%x\n\n\n", &var, var);
printf("2)二级指针和一级指针在函数调用的关系如下:\n");
printf("申请一级指针*pt的 变量空间在%x,指针值是%x,指向地址的值是%x\n\n", &pt, pt, *pt);
func3(pt);
printf("返回函数后,一级指针*pt的 变量空间在%x,指针值是%x,指向地址的值是%x\n\n", &pt, pt, *pt);
printf("申请二级指针**pt的 二级指针地址%x,一级指针的地址在%x,指针地址是%x,指向地址的值是%x\n\n", &pt2, pt2, *pt2, **pt2);
func4(pt2);
printf("返回函数后,二级指针**pt的 二级指针地址%x,一级指针的地址%x,指针地址是%x,指向地址的值是%x\n\n", &pt2, pt2, *pt2, **pt2);
while (1);
}
这样就可以很清楚的看到,在调用函数的时候,如果你想改变变量,你就要传一级指针。如果要改一级指针,你就要传二级指针进去。
原因是调用函数的时候,他会创建一个空间把对应值拷贝过来,就出现了值相同,地址不同的情况。
备注)橙色是进入函数会变的地址,蓝色表示拷贝过来不变的值,绿色通过访问内存地址后我们操作的操作数。
1)在传入变量的时候,函数会拷贝值到另一个地址,那么这时候你修改值,就都是那个函数拷贝后地址的值。
2)在传入一级指针,虽然一级指针地址变了,但是一级指针的值不变,还是指向同一个变量,这样我们通过这个不变的值来访问这个地址,就可以修改这个变量了。
3)传入二级指针,主要是在一级指针上操作,比如malloc的申请的函数;传入二级指针,二级指针的的地址肯定变了,二级指针的值不变,通过范围二级指针的值,来修改一级指针的值;
总结,需要在函数里面操作什么,就需要加高一级的指针传入,然后通过高一级指针值不变,访问我们要操作的地址进行操作。