标签:col iostream str style 通过 ons return 实参 mil
之前听过的网课中,记录的随笔:
函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参。
引用形参和指针形参对实参直接操纵。(这句话不妥,后面解释)。
先来看一个简单的例子:
#include <iostream> #include <string> using namespace std; void print_str(const string s) { cout << s << endl; } int main() { print_str("hello world"); return 0; }
正确调用函数,如果将形参中的const去掉,也能得到正确的结果。
那么换成引用或指针:
#include <iostream> #include <string> using namespace std; void print_str(string & s) { cout << s << endl; } int main() { print_str("hello world"); return 0; }
编译不通过,加上一个const,就会通过编译。
普通形参,const限定符没有影响,因为即使改了也只是副本。
引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响。
函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参,有无const无影响。引用形参和指针形参,函数是对实参直接操纵,没有const的形参时实参的值是可以改变的。
简单点来说,这样是报错的:
#include <stdio.h> void f1(int *a) { *a = 100; } int main() { const int i = 1; f1(&i); printf("%d", i); return 0; }
这样是不会报错的,但是值是自然无法修改的:
#include <stdio.h> void f1(int a) { a = 100; } int main() { const int i = 1; f1(i); printf("%d", i); return 0; }
2018-10-05
关于上面问题,新的想法:
1 #include <stdio.h> 2 #include <malloc.h> 3 void f1(int *a, int *b) { 4 //b[0]=1; 5 b = a; 6 } 7 8 int main() 9 { 10 int *a = (int *)malloc(sizeof(int)*10); 11 int *b = (int *)malloc(sizeof(int)*10); 12 int i = 0; 13 for (; i < 10; i++)15 a[i] = i;17 f1(a, b); 18 19 for (i=0; i < 10; i++) 20 { 21 printf("a[%d]:%d\n",i,a[i]); 22 printf("b[%d]:%d\n",i,b[i]); 23 } 24 return 0; 25 }
b数组输出,还是没有值的。
不论什么作参数,传入函数的都是副本,数组、指针指向的值还有引用,之所以能够修改,因为副本还是那个地址,但是修改这个副本的指向,自然对外面不会有影响。
标签:col iostream str style 通过 ons return 实参 mil
原文地址:https://www.cnblogs.com/czc1999/p/9744238.html