赞
踩
值传递包括实实在在的值传递和指针传递,指针传递参数本质上是值传递的方式,它所传递的是一个地址值,传递的都是实参的一个拷贝。
#include <iostream> #include <vector> using namespace std; void function(int num){ //改变num的值 num = 100; } int main() { int number; number = 1; function(number); cout << number << endl; return 0; }
这样的值传递只能把一个函数中的值传递给另一个函数,当该值在被调函数中发生改变时,在原来的函数中并不会发生改变。因为被调函数的型参只有函数被调用的时候才会临时分配单元,一旦调用结束,占用的内存便会释放,所以调用的函数中存储number的地址跟被调函数中number的地址不一样。
如果想让number通过被调函数改变该怎么做?第一种是使用指针形式的值传递,第二种是使用引用传递。
指针传递是通过地址间接的改变了实参的值。
#include <iostream> #include <vector> using namespace std; void function(int* num){ //通过改变num对应地址的值来实现值的改变: //形参num是一个指针,传递过来的是一个地址值,解引用即可访问到这个地址值映射的值 *num = 100; } int main() { int number; number = 1; function(&number); cout << number << endl; return 0; }
对引用的操作等于是对其指定的对象进行操作,当将实参传递给形参时,形参就指向了实参(形参与实参同义,是实参的一个别名)。
#include <iostream> #include <vector> using namespace std; void function(int& num){ //通过引用改变num的值 num = 100; } int main() { int number; number = 1; function(number); cout << number << endl; system("pause"); return 0; }
重点: 要想用指针传递,通过函数改变主函数中字符串指针变量的值,必须使用char**的二级指针。
先举个例子
#include <stdio.h> #include <stdlib.h> #include <string.h> void func(char* dst) { char* buf = (char*)malloc(20); memset(buf, 0, 20); strcpy(buf, "hello world!"); dst = buf; puts(dst); } int main() { char* s = "123456"; func(s); puts(s); return 0; } /* 本来想通过func函数改变s的值,结果并没有改变,还是输出123456 */
因为以前值传递和指针传递时用的例子是整型变量,指针传递时用一级指针就可以通过函数改变主函数中的变量的值。
换成字符串变量,咋一看也是一级指针。
但是你要明白: 字符串指针的定义是什么? char* s; char* 本来就仅仅是一个字符串指针变量的类型! s存的是一个字符串的首地址值,所以你要通过函数改变字符串指针变量的值,就得用char**二级指针!
#include <stdio.h> #include <stdlib.h> #include <string.h> void func(char **dst) { char *buf = (char *) malloc(20); memset(buf, 0, 20); strcpy(buf, "hello world!"); *dst = buf; //puts(dst); } int main() { char *s = "123456"; func(&s); puts(s); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。