1.值传递
#include<iostream>
using namespace std;
void printNumber(int n)
{
n = 10;
cout << n <<endl;
}
int main()
{
int m = 5;
printNumber(m);
return 0;
}
打印结果:10
打印出的值为函数内部的形参n
的值,即10。而外部的实际参数m
的值仍然是5,因为在值传递中,函数内部对形参的修改不会改变原始变量的值。
2.指针
(1)修改指针指向的值
#include<iostream>
using namespace std;
void printNumber(int* n)
{
*n = 10;
cout << *n << endl;
}
int main()
{
int m = 5;
printNumber(&m);
return 0;
}
打印结果:10
printNumber(&m)把“5”的地址给了指针n,*n = 10修改了这个地址里的数,把它从5变成了10。
(2)修改指针
#include<iostream>
using namespace std;
void printNumber(int* n)
{
int k = 10;
n = &k;
cout << *n << endl;
}
int main()
{
int m = 5;
printNumber(&m);
return 0;
}
打印结果:10
printNumber(&m)把5的地址传给了指针n,n指向5所在的地址;
n = &k 又把k的地址给了n,n指向k的地址,*n为10。
3.指向常量的指针
#include<iostream>
using namespace std;
void printNumber(const int* n)
{
int k = 10;
n = &k;
cout << *n << endl;
}
int main()
{
int m = 5;
printNumber(&m);
return 0;
}
打印结果:10
const int* n 说明n指针指向的数为常量,不可以更改,可以这么看:把int去掉,const (*n),const 修饰*n,*n是数值,前面加上const自然是指向的数值为常量。
但是n指针不是常量,可以修改。
4.指针本身为常量
#include<iostream>
using namespace std;
void printNumber( int* const n)
{
*n = 10;
cout << *n << endl;
}
int main()
{
int m = 5;
printNumber(&m);
return 0;
}
打印结果:10
int* const n 说明指针n本身为常量,这个指针不能改,但是指针指向的地址里的数可以改。
可以这么看:* (const n),const修饰的是指针n。
5.指针本身和指向的数值均为常量
#include<iostream>
using namespace std;
void printNumber( const int* const n)
{
//*n = 10;
cout << *n << endl;
}
int main()
{
int m = 5;
printNumber(&m);
return 0;
}
打印结果:5
这个自然既不能修改指针本身,也不能修改它指向的数值。
6.引用传递
#include <iostream>
using namespace std;
void printNumber(int& n)
{
n = 10;
cout << n << endl;
}
int main()
{
int m = 5;
printNumber(m);
return 0;
}
打印结果:10
引用传递和值传递区别在于:
可以这么理解,值传递是把自己的数值复制了一份,并把复制的那一份传给了printNumber(),所以即使printNumber()对数值进行了修改,也不影响本体;但是引用传递就不一样了,是把自己地址给printNumber(),那printNumber()内修改当然就是修改本体。