关于函数形参

Posted czc1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于函数形参相关的知识,希望对你有一定的参考价值。

之前听过的网课中,记录的随笔:

函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参。

引用形参和指针形参对实参直接操纵。(这句话不妥,后面解释)。


  1. 关于const形参

先来看一个简单的例子:

#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
",i,a[i]);
22         printf("b[%d]:%d
",i,b[i]);
23     }
24     return 0;
25 }

b数组输出,还是没有值的。

 

不论什么作参数,传入函数的都是副本,数组、指针指向的值还有引用,之所以能够修改,因为副本还是那个地址,但是修改这个副本的指向,自然对外面不会有影响。

以上是关于关于函数形参的主要内容,如果未能解决你的问题,请参考以下文章

关于Java中的形参和实参的区别

关于为函数形参赋值和搜索变量标识符的云云

python关于函数形参

关于js函数的形参和实参

关于JS形参是局部变量的问题

js中形参的小练习