c++ 指针(三)
2024-09-05 16:16:54
指针
(6)传递指针给函数
只需要简单地声明函数参数为指针类型即可
#include <iostream>
#include <ctime> using namespace std;
void getSeconds(unsigned long *par); int main ()
{
unsigned long sec; getSeconds( &sec ); // 输出实际值
cout << "Number of seconds :" << sec << endl; return ;
} void getSeconds(unsigned long *par)
{
// 获取当前的秒数
*par = time( NULL );
return;
}
结果:Number of seconds :1294450468
能接受指针作为参数的函数,也能接受数组作为参数
#include <iostream>
using namespace std; // 函数声明
double getAverage(int *arr, int size); int main ()
{
// 带有 5 个元素的整型数组
int balance[] = {, , , , };
double avg; // 传递一个指向数组的指针作为参数
avg = getAverage( balance, ) ; // 输出返回值
cout << "Average value is: " << avg << endl; return ;
} double getAverage(int *arr, int size)
{
int i, sum = ;
double avg; for (i = ; i < size; ++i)
{
sum += arr[i];
} avg = double(sum) / size; return avg;
}
结果:Average value is: 214.4
传递指针给函数的过程补充:
#include <iostream>
#include <ctime> void getSeconds(unsigned long *par); int main()
{
unsigned long sec = ; cout << "Value of sec = :" << sec << endl;
cout << "Value of &sec = :" << &sec << endl;
cout << endl;
getSeconds(&sec); // 输出实际值
cout << "Number of seconds :" << sec << endl; return ;
} void getSeconds(unsigned long *par)
{
cout << "Value of *par = :" << *par << endl;
cout << "Value of par = :" << par << endl;
cout << "Value of &par = :" << &par << endl;
cout << endl;
// 获取当前的秒数
*par = time(NULL);
cout << "Value of *par = :" << *par << endl;
cout << endl;
return;
}
(7)从函数返回指针
必须声明一个返回指针的函数
int * myFunction()
{
....
}
C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量
下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址)来返回它们:
#include <iostream>
#include <ctime>
#include <cstdlib> using namespace std; // 要生成和返回随机数的函数
int * getRandom( )
{
static int r[]; // 设置种子
srand( (unsigned)time( NULL ) );
for (int i = ; i < ; ++i)
{
r[i] = rand();
cout << r[i] << endl;
} return r;
} // 要调用上面定义函数的主函数
int main ()
{
// 一个指向整数的指针
int *p; p = getRandom();
for ( int i = ; i < ; i++ )
{
cout << "*(p + " << i << ") : ";
cout << *(p + i) << endl;
} return ;
}
结果:
*(p + ) :
*(p + ) :
*(p + ) :
*(p + ) :
*(p + ) :
*(p + ) :
*(p + ) :
*(p + ) :
*(p + ) :
*(p + ) :
补充:
1.指针的本质是变量,可以是各种数据类型,定义一个指针 "*ip",其中 "ip" 需要赋于一个地址(可以用 & 符号获取其他变量的地址再赋值给 ip),而 "*ip" 是一个具体的值,即读取地址后获得的值;
#include <iostream>
using namespace std; int main()
{
int var = ;
int *ip;
ip = &var; cout << "var的值:";
cout << var << endl; cout << "变量 ip 的储存地址:";
cout << ip << endl; cout << "指针 *ip 的值:";
cout << *ip << endl;
return ;
}
结果:
var的值:
变量 ip 的储存地址:0x7fff5e7deae8
指针 *ip 的值:
2.
3.
4.
5. 关于值传递,指针传递,引用传递
值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
引用传递:
形参相当于是实参的"别名",对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
#include<iostream>
using namespace std;
//值传递 4 void change1(int n){
cout<<"值传递--函数操作地址"<<&n<<endl; //显示的是拷贝的地址而不是源地址 6 n++;
} //引用传递10 void change2(int & n){
cout<<"引用传递--函数操作地址"<<&n<<endl;
n++;
}
//指针传递15 void change3(int *n){
cout<<"指针传递--函数操作地址 "<<n<<endl;
*n=*n+;
}
int main(){
int n=;
cout<<"实参的地址"<<&n<<endl;
change1(n);
cout<<"after change1() n="<<n<<endl;
change2(n);
cout<<"after change2() n="<<n<<endl;
change3(&n);
cout<<"after change3() n="<<n<<endl;
return true;
}
6.
7.
8.指针分配与释放一个空间
最新文章
- 由用友NC刷新功能得到启示
- SqlHelper c#
- Apache Spark技术实战之7 -- CassandraRDD高并发数据读取实现剖析
- sql查看数据字典(表结构)
- java代码调用oracle存储过程
- Lintcode: Expression Evaluation (Basic Calculator III)
- Qt版helloworld
- hibernate annotation注解 主键ID自增长
- sharedevelop iis express
- android飞机游戏敌机移动路径
- php 5.5 xhprof for windows
- 理解Java String和String Pool
- 让你成功安装vscode中go的相关插件
- 学习EtherCAT的感想
- 其他shell
- SQL SERVER启动步骤
- SonarQube(代码质量管理)环境搭建
- ant常用的内置 task转自https://www.cnblogs.com/baicj/archive/2015/12/21/5063608.html
- node.js中npm包管理工具
- Django:haystack全文检索详细教程
热门文章
- python+openCV实现双目视差图及测距
- CodeForces - 1175E Minimal Segment Cover (倍增优化dp)
- autofs 自动挂载.
- Spring Boot干货系列:(十二)Spring Boot使用单元测试(转)
- 【Layui】当Layui数据表格和Layui下拉框组合时发生的问题
- vue中使用echarts(vue+vue-cli+axios+jsonp+echarts)
- centos7安装dockers
- docker部署jar工程
- hexdump命令
- Spring CommonsMultipartResolver 上传文件