十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
函数参数和
创新互联公司成都企业网站建设服务,提供成都网站制作、成都网站建设网站开发,网站定制,建网站,网站搭建,网站设计,响应式网站建设,网页设计师打造企业风格网站,提供周到的售前咨询和贴心的售后服务。欢迎咨询做网站需要多少钱:18980820575
返回值
三种传递方式:值传递、指针传递和引用传递
引用与指针的比较
引用是
C++中的概念,初学者容易把引用和指针混淆一起。一下程序中,n
是m
的一个引用(
reference
),m
是被引用物(referent)。
int
m;
int
n
=
m;
n
相当于m
的别名(绰号),对n
的任何操作就是对m
的操作。所以n
既不是m
的拷贝,也不是指向m
的指针,其实n
就是m
它自己。
C++语言
中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。
以下是“值传递”的示例程序。由于Func1
函数体内的x
是
外部变量
n
的一份拷贝,改变x
的值不会影响n,
所以n
的值仍然是0。
void
Func1(int
x)
{
x
=
x
+
10;
}
int
n
=
0;
Func1(n);
cout
“n
=
”
n
endl;
//
n
=
以下是“指针传递”的示例程序。由于Func2
函数体内的x
是指向外部变量n
的指针,改变该指针的内容将导致n的值改变,所以n
的值成为10。
void
Func2(int
*x)
{
(*
x)
=
(*
x)
+
10;
}
int
n
=
0;
Func2(n);
cout
“n
=
”
n
endl;
//
n
=
10
以下是“引用传递”的示例程序。由于Func3
函数体内的x
是外部变量n
的引用,x
和n
是同一个东西,改变x
等于改变n,所以n
的值成为10。
void
Func3(int
x)
{
x
=
x
+
10;
}
int
n
=
0;
Func3(n);
cout
“n
=
”
n
endl;
//
n
=
10
对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?
答案是“用适当的工具做恰如其分的工作”。
//一、由函数参数带回固定的二维数组
void func(int ppout[][2])
{
ppout[0][0] = 1;
ppout[0][1] = 2;
ppout[1][0] = 3;
ppout[1][1] = 4;
}
int _tmain(int argc, _TCHAR* argv[])
{
int pp[2][2];
func(pp);
cout pp[0][0] pp[0][1] endl;
cout pp[1][0] pp[1][1] endl;
system("pause"); //让窗口暂停,便于看结果
return 0;
}
//二、由函数参数带回动态二维数组
void func(int** pp, int rows, int columns)
{
int i, j;
for (i = 0; i rows; i++)
{
for (j = 0; j columns; j++)
{
pp[i][j] = (i + 1) * 10 + j + 1;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int rows = 3, columns = 2;
int** pp;
int i, j;
//申请内存
pp = new int*[rows];
for (j = 0; j rows; j++)
pp[j] = new int[columns];
func(pp, rows, columns);
for (i = 0; i rows; i++)
{
for (j = 0; j columns; j++)
{
cout pp[i][j] " ";
}
cout endl;
}
//释放内存
for (j = 0; j rows; j++)
delete[] pp[j];
delete[] pp;
system("pause"); //让窗口暂停,便于看结果
return 0;
}
//如果非要从函数的返回值中带回二维数组,这是最好的方式
//三、由函数带回动态二维数组
int** func(int rows, int columns)
{
int i, j;
int** pp;
//申请内存
pp = new int*[rows];
for (j = 0; j rows; j++)
pp[j] = new int[columns];
for (i = 0; i rows; i++)
{
for (j = 0; j columns; j++)
{
pp[i][j] = (i + 1) * 10 + j + 1;
}
}
return pp;
}
int _tmain(int argc, _TCHAR* argv[])
{
int rows = 3, columns = 2;
int** pp;
int i, j;
pp = func(rows, columns);
for (i = 0; i rows; i++)
{
for (j = 0; j columns; j++)
{
cout pp[i][j] " ";
}
cout endl;
}
//释放内存
for (j = 0; j rows; j++)
delete[] pp[j];
delete[] pp;
system("pause"); //让窗口暂停,便于看结果
return 0;
}
//四、由函数带回二维数组
//这种方式有问题,程序中已经说明,不要采取此方式
const int rows = 3, columns = 2;
int (*func())[columns]
{
int i, j;
static int pp[rows][columns]; //如果不是静态的,函数退出后其内存就变得无效。
for (i = 0; i rows; i++)
{
for (j = 0; j columns; j++)
{
pp[i][j] = (i + 1) * 10 + j + 1;
}
}
return pp;
}
int _tmain(int argc, _TCHAR* argv[])
{
int (*pp)[columns];
int i, j;
//pp = new (int[columns]*)[rows];
pp = func();
for (i = 0; i rows; i++)
{
for (j = 0; j columns; j++)
{
cout pp[i][j] " ";
}
cout endl;
}
system("pause"); //让窗口暂停,便于看结果
return 0;
}
你调用了a()之后,函数a()会返回一个5,但你没有将其返回值保存起来,所以这个返回值会被抛弃。要么用一个变量将函数a的返回值保存起来:int b=a(),要么将函数的返回值作为另一个函数的参数输入:printf("%d",a())。
首先你是想把字符串number当做返回值返回,这个想法是可以的,但是你需要了解几个知识:
1. 局部变量占用的空间在函数返回之后就销毁了,你如果想返回字符串指针number,需要先malloc动态申请内存,这样number的空间就不会被销毁。
2. 你的函数返回值和函数定义不匹配,定义中是char,而number是char*类型,所以你如果想动态申请内存,然后返回指针,就把函数定义改为char*。
3. 主函数中%c是打印字符,如果打印字符串是%s。
还有一个办法是把number字符串指针作为函数参数传入,在主函数中定义一个number字符串,调用这个函数并传入number,就可以对number字符串修改了,这个办法无需显式的返回值。