码迷,mamicode.com
首页 > 其他好文 > 详细

关于函数形参

时间:2018-10-05 12:28:08      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:col   iostream   str   style   通过   ons   return   实参   mil   

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

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

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


  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\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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!