c++ 指针(三)
指针
(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.指针分配与释放一个空间
c++ 指针(三)的更多相关文章
- 从汇编看c++成员函数指针(三)
前面的从汇编看c++中成员函数指针(一)和从汇编看c++成员函数指针(二)讨论的要么是单一类,要么是普通的多重继承,没有讨论虚拟继承,下面就来看一看,当引入虚拟继承之后,成员函数指针会有什么变化. 下 ...
- 深入理解C语言-二级指针三种内存模型
二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {&quo ...
- 智能指针(三):unique_ptr使用简介
我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如 ...
- [转] 智能指针(三):unique_ptr使用简介
PS: 1. auto_ptr太不安全,可能多个auto_ptr指向一个对象,出现重复释放的问题 2. unique_ptr解决了这个问题,不允许拷贝构造函数和赋值操作符,但是!它支持移动构造函数,通 ...
- C++ 智能指针三
/* 智能指针shared_ptr注意点 */ #include <iostream> #include <string> #include <memory> // ...
- 【校招面试 之 C/C++】第27题 C++ 智能指针(三)之 unique_ptr
auto_ptr<string> p1(new string ("auto") : //#1 auto_ptr<string> p2; //#2 p2 = ...
- C语言 函数指针三(反向调用)
动态库代码 //简单的动态库开发----报文发送 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib. ...
- 深入学习c++--智能指针(三) unique_ptr
1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 拥有共享对象所有权语义的智能指针 3. unique_ptr: 拥有独有对象所有权语义的智 ...
- [Reprint]C++普通函数指针与成员函数指针实例解析
这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...
- 【c++基础】const、const指针、const引用
一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) ; co ...
随机推荐
- centos7安装kong和kong-dashboard
1.安装Kong yum install -y https://kong.bintray.com/kong-community-edition-rpm/centos/7/kong-community- ...
- angularJs select ng-selected默认选中遇到的坑
本人,程序员妹子一枚,,,,名字中有萌字,简称萌妹子哈,,,首先贴出代码: 同样的方式,用ng-selected用来做回显,但是结果让萌妹我很是诧异,第一个“模板类型”那里的select可正常回显,第 ...
- 更优雅地关闭资源 - try-with-resource
https://www.cnblogs.com/hihtml5/p/6505317.html
- Angular2 父子组件通信方式
https://www.jb51.net/article/133868.htm 这次给大家带来Angular2 父子组件通信方式,使用Angular2 父子组件通信方式的注意事项有哪些,下面就是实战案 ...
- PHP数字处理
援引自博文 https://blog.csdn.net/hongxiaoshuang/article/details/54598757 ceil -- 进一法取整 float ceil ( float ...
- linux 能ping通IP但无法解析域名
vi /etc/nsswitch.conf hosts: files dns networks: files 改成: hosts: files dns wins networks: files 最近碰 ...
- nginx命令和配置
centos 6.8安装的nginx 1.12.2 1.nginx常用的命令 使用nginx命令前,进入到/usr/local/nginx/sbin/目录 1)查看nginx版本 进入到/usr/lo ...
- 在linux 下配置firewalld
查看firewalld 是否开始与运行 以下两种方式都可以 systemctl status firewalld.service firewall-cmd --state 查看所有打开的端口 以下两种 ...
- 暑假集训 #2 div1 I - Lada Priora 精度处理
I - Lada Priora Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- Exchanger 原理
Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法交换数 ...