函数的值传递
main中初始化整型变量 int a,b;
定义一个函数void swap(int a,int b)
main程序中调用函数swap(a,b)
此时swap函数接收到的是整型a,b而不是变量a,b
当我们在swap中执行赋值时,改变的是函数内a,b变量的值而不是main内变量a,b的值
#include <stdio.h>
#include <stdlib.h>
void swap(int a,int b);
int main(void){
int a=3,b=8;
//a=3,b=8
printf("a=%d,b=%d\n",a,b);
swap(a,b);
//a=3,b=8
printf("a=%d,b=%d",a,b);
return 0;
}
void swap(int a,int b){
int tmp;
tmp=a;
a=b;
b=tmp;
}
函数的指针传递
main中初始化整型变量 int a,b;
定义一个函数void swap(int *a,int *b)
main程序中调用函数swap(a,b)
此时swap函数接收到的是main程序中整型变量a,b的指针
当我们在swap中执行赋值时,可以改变main内变量a,b的值
#include <stdio.h>
#include <stdlib.h>
void swap(int *a,int *b);
int main(void){
int a=3,b=8;
//a=3,b=8
printf("a=%d,b=%d\n",a,b);
swap(&a,&b);
//a=8,b=3
printf("a=%d,b=%d",a,b);
return 0;
}
void swap(int *a,int *b){
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
java中方法内对象的传递
首先定义一个实体类user
public class User implements Serializable {
private String account;
private String pwd;
private static final long serialVersionUID = 1L;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account == null ? null : account.trim();
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd == null ? null : pwd.trim();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", account=").append(account);
sb.append(", pwd=").append(pwd);
sb.append(",serialVersionUID=").append(serialVersionUID);
sb.append("]");
return sb.toString();
}
}
然后在主程序内定义方法change
public static void change(User user){
user.setAccount("root");
}
在主程序中初始化一个user对象,然后打印输出,然后调用方法change,最后打印输出
import bean.User;
public class App {
public static void main(String[] args) {
SpringApplication.run(GlobalApplication.class, args);
User user = new User();
user.setAccount("admin");
user.setPwd("123456");
//User [Hash = 1100004490,account=admin, pwd=123456, serialVersionUID=1]
System.out.println(user.toString());
change(user);
//User [Hash = 1100004490,account=root, pwd=123456, serialVersionUID=1]j
System.out.println(user.toString());
}
public static void change(User usercopy){
usercopy.setAccount("root");
}
}
最后我们看到了user的account发生了改变,那么原因是什么呢?
实际上这也是值传递,当一个实例对象被当做参数传递给方法时,方法内参数的值就是将user指向的内存堆的地址拷贝给了usercopy
也就是说user和usercopy指向了同一个堆地址,但usercopy和user的在栈内存地址不一样