变量的值传递,地址引用(和对象成员变量、局部变量创建和初始化的内存机制)

变量的值传递,地址引用:

搞懂=含义,=即指向,看指向的内存块是否发生改变,还有是否是新内存块,

通过指向可以控制内存块的值。

普通变量 =,就是值的赋值(简单这么记住,其实是变量指向存放数字的内存块,但是数字不存在就创建数字的内存块)

指针变量 =,就是地址指向,通过指针操作空间内部值

例如 int i = 1;就是i=1;

例如 int b = 1;int * a = &b;

最后记住局部变量的作用域就彻底搞懂了。

一、引用(指向):

boy and girl 先看一个特别特别简单的例子哈:

int a = 1;

int b = 1;

b = 2;

打印a、b结果是1、2.

我们来讲一讲最基本最重要的一个小小知识点:(首先int a = 1; 首先它会在栈中创建一个变量a的引用,然后查找栈中是否有1这个值,如果没找到,就将1存放进来,然后将a指向1。同理,int b = 1;b = 2;)

ps:规定变量定义需要初始化。

是不是经常遇到The local variable 某个变量 may not have been initialized;

例如这样:主函数中intm;调用某个函数(m);这时候开始报错啦!!!

当然你可能会直接在主函数中写int a; 然后问没有报错,其实是编译器“被调教了”,帮你默认初始化为int a= 0;

(注意,这里的引用二字没有任何问题,理解一下,对于指针的地址引用就一通百通了)

int a = 1; 理解是a 指向 1

int b = 1; 理解是b 指向 1(已经存在)

b = 2;     理解是b  指向 2 (只要记住1和2是两块空间中的不同小内存)

指针情况举例:

int a = 1;int * p1 =&a;  //指针p1指向aint * p2 =&a; //指针p2也指向a*p2 = 3;     //修改指向a的内部值

打印printf("%d\t%d",*p1,*p2);结果会是3,3。

此刻适合讲java中的new对象:

String str1 =new String ("abc");

String str2 =new String ("abc");

System.out.println(str1==str2); // false

每次new,都在堆某个位置new了一个对象,指向,即存放了对象的地址

(ps:数字的话是在栈内,

a = 1;b = 1;因为栈内1,出现过了没有在创建另外一个1的地址,so 其实a存放1的地址,b存放1

的地址。)

(只要记住p1和p2指向是同一块空间内存a,通过p2修改了a内部情况,p1还指向a,当a内部情况变了,p1打印内部就改变)

举个结构体例子更容易明白点:

#include #include

structStu{intid;char name[20];

};intmain()

{

Stu student= {1, "小明"};

Stu*stu1 = &student;

Stu*stu2 = &student;

stu1->id = 2;

strcpy(stu2->name,"小小明");

printf("%d\t%s\n",student.id,student.name);

printf("%d\t%s\n",stu1->id,stu1->name);

printf("%d\t%s",stu2->id,stu2->name);return 0;

}

结果:2  小小明

2  小小明

2  小小明

二、值传递,地址引用

利用前面的搞懂引用+理解局部变量作用域就一通百通

局部变量:形参,方法中定义的变量,代码块中定义的变量

局部变量作用域:从出现到遇到 }

代码举例:

值传递+局部变量作用域:

void main(String[] args) {

int a = 1;

add(a);

printf("%d",a);

}

void add(int i) {

i++;

printf("%d",i);

}

结果:1

2

过程分析:首先值传递-- add(a);相当于函数add(int i = a),i 指向 a (a = 1),进入函数内部,这时值传递后 i = 1; 然后结合局部变量作用域,遇到方法的 },i 就被销毁了

要想拿到方法处理的结果,利用可以返回值,例如函数改写:

public static int add(int i){

i++;

return i;

}

然后主函数修改一下:

int a = 1;

a = add(a);

System.out.println(a);

引用传递(也叫地址传递):

#include

void add(int *i);

int main(){

int b = 1;

int * a = &b;    //a指向b

add(a);

printf("%d\n",*a);

}

void add(int *i) {    //相当于int *i = &b;

(*i)++;       //修改了b

printf("%d\n",*i);

}

对象成员变量、局部变量创建和初始化的内存机制:

下次有空再整理一点自己的笔记

java include 传递对象_变量的值传递,地址引用(和对象成员变量、局部变量创建和初始化的内存机制)...相关推荐

  1. Java中的参数传递,到底是值传递还是引用传递?

    文章内容为转载,转载自公众号Hollis关于我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 原文链接:我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 知乎回答链接:Java 到 ...

  2. Java中两数交换引发的值传递问题及解决方案

    Java中两数交换引发的值传递问题及解决方案 今天导师分享了一个有趣的代码,记录一下,让我们一起看看~ //交换两个整数 private static void swap(int i, int j) ...

  3. 深拷贝与浅拷贝、值语义与引用语义对象语义 ——以C++和Python为例

    深拷贝与浅拷贝.值语义与引用语义/对象语义 --以C++和Python为例 值语义与引用语义(对象语义) 本小节参考自:https://www.cnblogs.com/Solstice/archive ...

  4. python是值传递还是引用传递_Python里参数是值传递还是引用传递?

    Python就是把一些参数从一个函数传递到另一个函数,从而使其执行相应的任务.但是你有没有想过,参数传递的底层是如何工作的,原理又是怎样的呢? 实际工作中,很多人会遇到这样的场景:写完了代码,一测试, ...

  5. 【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )

    文章目录 一.直接修改 和 间接修改 指针变量 的值 二.在函数中 间接修改 指针变量 的值 三.在函数中 间接修改 外部变量 的原理 一.直接修改 和 间接修改 指针变量 的值 直接修改 指针变量 ...

  6. c语言值传递 地址传递 引用传递参数,C++参数传递(值传递,引用传递)

    值传递 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 在函数结束返回后,形参被丢弃释放,实参的内容不会被改变 数据值传递和地址值传递 数 ...

  7. 交换两个变量的值,不使用第三个变量的四种法方

    交换两个变量的值,不使用第三个变量的四种法方 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码如下: int a,b; a=10; b=15; int t; t=a; a= ...

  8. 结构体之引用结构体成员变量

    引用结构体成员变量 一个结构体包含一个或者多个成员变量,在实际使用中,就需要对其成员变量进行引用,对于一个已经定义了的结构体变量和一个指向该结构体的指针变量. 可以用一下三种情况引用结构体 成员变量. ...

  9. java什么会引用传递_在java中为什么很多人说有值传递和引用传递?引用传递的本质...

    首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的"一切传引用其实本质上是传值"这种并不能解决问题无意义论战 ...

最新文章

  1. 从Date类型转为中文字符串
  2. oracle列名无效字符,案例学习Oracle错误:ORA-00904 invalid column name
  3. 螃蟹不能吃的四个部位,爱吃螃蟹的一定要进来看看。
  4. 【JZOJ1637】【ZJOI2009】狼和羊的故事
  5. PHPCMS 学习
  6. php curl安装检查,如何判断php的curl是否已安装
  7. selenium 验证码——万能码的使用
  8. 减少访问量_Nginx服务器高性能优化轻松实现10万并发访问量
  9. 如何在VS2013中隐藏引用计数?
  10. Access、CorelDRAW总结
  11. 部分关键字--this/extends/super/static/final/abstract/访问权限总结
  12. 开箱即用——用模板快速上线一个HR 服务中心
  13. python 背单词_背单词方法大全
  14. c语言程序设计实验总结范文,《c语言程序设计》课程实验报告模板.doc
  15. AI人工智能ml5.js在线实现图片变卡通图像,照片变卡通图像
  16. Java面向对象实验 8 ——图形用户界面设计
  17. 自定义组合键进入u-boot
  18. 【oracle】oracle创建表、创建索引、创建自增id
  19. Mac终端使用Linux
  20. 企业月结快递管理教程

热门文章

  1. php redis support,PHP 使用 Redis
  2. python构造icmp数据包_如何在python中构造ICMP数据包
  3. java堆算法,Java 基本功04-JVM-Java堆详解和GC算法
  4. 使用FirefoxDriver时报错Make sure firefox is installed问题
  5. loadrunner脚本编写,对nginx进行压测
  6. Linux下使用stat命令所显示出来的三个时间
  7. linux class device
  8. 服务器收集错误信息0不动,win10系统提示“我们只收集某些错误信息”的解决方案...
  9. 计算机主键盘的布局,计算机键盘的布局,结构和布置
  10. mysql jdbc 创建存储过程_mysql JDBC 调用存储过程