函数形参传值_外部求(值)址与内部求(值)址的差别

一般函数的形参传值, 

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);

    

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值