【C&C++】 函数参数详解(含指针) |
您所在的位置:网站首页 › 点点四川长牌官网手机版 › 【C&C++】 函数参数详解(含指针) |
【C&C++】 函数参数详解(含指针)
一、C语言函数声明函数声明的格式
二、指针指针常见初始化
三、常用的传参方式1. 值传递2. 地址传递3. 引用传递引用传递与地址传递的本质区别指针和引用的相同点和不同点:
四、函数参数为数组函数参数为一维数组指针与数组
函数参数为二维数组(三种方法)二维数组:方法1:在参数声明中指定二维数组的列数方法2:把参数声明为一个指向数组的指针方法3:把参数声明为指向指针的指针
C++字符串变量(string)作为函数形参传递(引用方式)
一、C语言函数声明
C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。 所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。 函数声明的格式函数声明的格式非常简单,相当于去掉函数定义中的函数体,并在最后加上分号;,如下所示: dataType functionName( dataType1 param1, dataType2 param2 ... );也可以不写形参,只写数据类型: dataType functionName( dataType1, dataType2 ... ); #include //函数声明 int sum(int m, int n); //也可以写作int sum(int, int); int main(){ int begin = 5, end = 86; int result = sum(begin, end); printf("The sum from %d to %d is %d\n", begin, end, result); return 0; } //函数定义 int sum(int m, int n){ int i, sum=0; for(i=m; i int t; t=*i; *i=*j; *j=t; } void Swap2( int i, int j) { int t; t=i; i=j; j=t; } void Swap3( int *i, int *j) { int *t; t=i; i=j; j=t; } int main() { int a = 3,b = 4; point_1 = &a; point_2 = &b; Swap1(point_1,point_2); }其中, 只有 Swap1 能确实的改变a和b的值; Swap2 交换的是形参i,j的值,a和b的值不受影响; Swap3 虽然得到了a和b的地址,但是只是将形参i,j存放的地址进行了交换,a和b的值不受影响; 总结:变量本身的地址是不可以改变的,只能通过指针变量得到实参的地址,然后通过实参的地址去改变实参的值; 根据上述情况,C++ 中出现了 引用 方式。 1. 值传递将变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。 2. 地址传递将变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,能改变函数外的变量的值。 3. 引用传递众所周知,函数的参数是作为局部变量,对局部变量的操作不会影响外部的变量,如果想要修改传入的参数,只能使用指针。 在 C++ 中,存在“引用”可以不使用指针,从而达到修改传入参数的目的。 对引用变量对的操作就是对原变量的操作 形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。 #include using namespace std; //值传递 void change1(int n){ cout cout int i = 1; int j = 1; printf("a[%d][%d]=%d\n", i, j, a[i][j]); } int main() { int a[2][3] = { {1,2,3}, {4,5,6} }; foo(a, 2, 3); }函数的参数声明改成了: int (*a)[3]这个声明的含义是: 声明(*a)是一个数组,等价于int b[3]时,b是一个数组。 推出a是一个指针,指向一个数组,类似a是指针,指向b的。 方法3:把参数声明为指向指针的指针 #include void foo(int **a, int m, int n) { int i = 1; int j = 1; printf("a[%d][%d]=%d\n", i, j, a[i][j]); } int main() { int a[2][3] = { {1,2,3}, {4,5,6} }; int * p[3]; p[0] = a[0]; p[1] = a[1]; p[2] = a[2]; foo(p, 2, 3); }这里要注意的是指针的指针,和二维数组的差异;二维数组的地址是连续的,所有成员按顺序排序;而指针的指针只要求指针地址连续,而不要求指针的指针地址连续。 然后作为实参传递时,也不能直接使用a传递,因为类型不匹配,必须定义新的变量 p,然后把 a 的值赋给 p,再传递给 foo() 函数。 C++字符串变量(string)作为函数形参传递(引用方式) #include #include #include #include using namespace std; void loadpfont1(string &filename) { filename = filename + "\\now"; cout string path = "E:\\data\\TEST"; // loadpfont1(path); const char *str = path.c_str();//c_str()函数返回一个指向正规C字符串的指针常量 loadpfont2(str); return 0; }输出结果: E:\data\TEST\now E:\data\TEST\now参考博客: https://www.jianshu.com/p/d7f2afe08f41 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |