一般函数的形参传值,
a:如果形参类型为数据而非指针,那么函数内部操作数据不会改变外部的变量值;
b:如果传递的是地址,内部函数操作可分为两种:
b.1:指针指向的数值操作,会改变外部的变量值;
b.2:指针本身的操作,不会改变外部指针的值;相当于只是水缸内部的水胡搅一通,但是不影响外部水井中的指针;这里与a一样;
同理:求址也是这个原理;
以下测试中;外部求取三级指针的地址作为形参传入与函数内部求取三级指针的结果明显不一致,证实了次点;
简单内存关系如下图:
//
// main.c
// 多级指针练习
//
// Created by 陈家将 on 16/4/12.
// Copyright © 2016年 chenjiajiang. All rights reserved.
//
#include <stdio.h>
void changeValue(int *** outsideP);
void changeValue2(int **** outsideP);
int main(int argc, const char * argv[]) {
int a = 10;
int *p1;
int **p2;
int ***p3;//***p3=*
p1 = &a;
p2 = &p1; //&p1==p2==***p3
p3 = &p2; //&p2==p3
//向changeValue函数传递p3作为参数,在函数中把 a 的值修改为110;并打印出来
int ****p4 =&p3;
printf("a的地址为:%p\n",p1);
printf("p1的地址为:%p\n",p2);
printf("p2的地址为:%p\n",p3);
printf("p3的地址为:%p\n",p4);
// ***p3 = 100;//a==*p1==**p2==***p3
//&p1==&(**p2)==&(&***p3==*p3)
//&p2==p3==p3
// printf("a = %i\n",***p3);
printf("--------华丽分隔线--------\n");
changeValue2(&p3);
printf("--------华丽分隔线--------\n");
changeValue(p3);
printf("--------华丽分隔线--------\n");
printf("a = %i\n",a);//测试外部数值是否改变
return 0;
}
void changeValue(int *** outsideP){
// int ****tempP = &outsideP;
***outsideP = 99;
printf("a = %i\n",***outsideP);//a==*p1==**p2==***p3
printf("a的地址为:%p\n",**outsideP);//&a==p1==*p2==**p3
printf("p1的地址为:%p\n",*outsideP);//&p1==&(**p2)==&(&***p3==*p3)
printf("p2的地址为:%p\n",outsideP);//p2的地址就是p3所存储的值
// printf("p3的地址为:%p\n",tempP);//
printf("p3的地址为:%p\n",&outsideP);//取得的是函数内部的 outsideP 的地址
}
void changeValue2(int **** outsideP){
****outsideP = 110;
printf("a = %i\n",****outsideP);
printf("a的地址为:%p\n",***outsideP);
printf("p1的地址为:%p\n",**outsideP);
printf("p2的地址为:%p\n",*outsideP);
printf("p3的地址为:%p\n",outsideP);
}