函数形参传值_外部求(值)址与内部求(值)址的差别
来源:互联网 发布:姓氏笔画排列软件 编辑:程序博客网 时间:2024/06/06 06:40
一般函数的形参传值,
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);
}
- 函数形参传值_外部求(值)址与内部求(值)址的差别
- 软件的内部质量与外部质量的差别
- 求函数的值
- 求函数的值
- 求分段函数的值
- 求分段函数的值
- 求分段函数的值
- 求分段函数的值
- 求Ackerman函数的值
- 求分段函数的值
- python内部函数怎么修改外部函数的值?
- 《循环非递归_递归_求 n! 的值》
- 33_内部和外部函数
- C++_函数的重载求两个数或三个数的最值
- 调用函数求分段函数的值
- 用函数求函数的值
- 函数_习题:用函数求两个正数的最大公约数与最小公倍数
- 求多项式的值与求幂的快速算法
- 含有指针成员时的赋值运算符重载
- nyoj 998
- Spring集成Quartz定时任务例子
- flex学习进度10之对象数据应用
- 三种循环的性能比较
- 函数形参传值_外部求(值)址与内部求(值)址的差别
- JavaCv 高效实现图像的遍历
- 签约和解约业务逻辑
- 递归-阶乘函数和斐波那契数列
- 多项式horner算法学习
- 负载均衡(一)基于接口、方法、参数的路由
- QT 常用快捷键
- android:layout_gravity和android:gravity的使用区别
- SQL_1.认识sql