c++指针和引用

/ 0评 / 0

在c++中变量前加*标识符用于申明一个指针变量,特别要注意的是指针变量申明是必须要初始化(vs中会有提示),不然就会成为所谓的野指针,可能会引起内存泄漏等一些未知问题。老版本c++中使用NULL初始化指针变量,在c++11中使用nullptr初始化指针变量。

//指针变量申明与初始化 
//默认值除了使用nullptr外还可以使用NULL以及整数0
int *p = nullptr;

指针变量是用来存放其他变量地址的变量,使用标识符&可以将某个变量的地址赋值给指针变量,此时指针变量指向某变量的地址,修改指针变量的值也会影响原变量。

//申明变量v和指针变量*p
int v =5, *p=nullptr;
//将指针p指向v的地址
*p=&v
//给指针的变量重新复制值,此时变量v的值也会变为5
*p=10

在Java中对象作为参数传递的时候是引用传递(String类型和一般数据类型除外,它们都是值传递),和c++的指针变量一样,修改参数对象的值会影响原对象。

//Java 对象引用传递
public class Test {

	public void e(Test1 c){
		c.v=999;
	}

	public static void main(String[] args){
		Test test= new Test();
		Test1 c = new Test1();
                //此处输出10 
		System.out.println(c.v);
		test.e(c);
                //此处输出999
		System.out.println(c.v);
	}
	
	public static class Test1 {
		public int v=10;
	}
	
}

c++实现上面Java的功能就需要使用到指针和引用,c++中参数传递方式分为三种类型,分别是值传递,指针传递引用引用传递。

值传递

值传递就是就是在内存栈中复制一份当前传递参数的副本
void testPoint1(int c) {
        //输出变量c的地址,此处变量c的地址和mian函数里的地址不一致
	cout << "testPoint1 c point addr =" << &c << endl;
	c=100;
         //输出变量c的值还是100
	cout << "testPoint1 c value =" << c << endl;
}
int main(){
	int c = 10;
        //输出变量c的地址
  	cout << "c point addr" << &c << endl;
         //输出变量c的值 5
  	cout << "c value" << c << endl; 
        testPoint1(c);
        //输出变量c的值还是5
        cout << "c value" << c << endl; 
}

指针传递

与值传递不同的是 指针传递 copy的是内存地址
void testPoint2(int *c) {
        //输出变量c的地址,此处变量c的地址和mian函数里的地址一致
	cout << "testPoint2 c point addr =" << &c << endl;
	c=100;
         //输出变量c的值为100
	cout << "testPoint2 c value =" << c << endl;
}
int main(){
	int c = 10;
        //输出变量c的地址
  	cout << "c point addr" << &c << endl;
         //输出变量c的值 5
  	cout << "c value" << c << endl; 
        testPoint2(&c);
        //输出变量c的值 100
        cout << "c value" << c << endl; 
}

引用传递

引用传递和上述传递方式类似,引用相当于给变量所在的地址起了个别名
void testPoint3(int &c) {
        //输出变量c的地址,此处变量c的地址和mian函数里的地址一致
	cout << "testPoint3 c point addr =" << &c << endl;
	c=100;
         //输出变量c的值为100
	cout << "testPoint3 c value =" << c << endl;
}
int main(){
	int c = 10;
        //输出变量c的地址
  	cout << "c point addr" << &c << endl;
         //输出变量c的值 5
  	cout << "c value" << c << endl; 
        testPoint2(c);
        //输出变量c的值 100
        cout << "c value" << c << endl; 
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注