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 ...
随机推荐
- java 观察这模式(发布订阅模式)
观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息. 抽象 ...
- spring+mybatis 多数据源的配置
方式一: 参见博客https://www.cnblogs.com/AmbitiousMice/p/6027674.html 此种方式每次需要在调用dao的时候设置对应的数据源. 方式二: 直接在myb ...
- 实践:Linux用户、组和密码相关文件被破坏如何恢复系统
我们先看一下用户用户组和密码相关文件: 1 2 3 4 5 6 7 8 9 [root❄centos7 ~]☭ ll /etc/passwd* /etc/shadow* /etc/group* /et ...
- sed基础语法
sed 太强大了 参考博客如下:https://www.cnblogs.com/ctaixw/p/5860221.html sed: Stream Editor文本流编辑,sed是一个“非交互式的”面 ...
- 线程异步更新UI
winform程序一般是不允许非主线程操作ui,单可以通过线程与委托的方式并结合Control类提供的BeginInvoke机制进行ui更改 如下,这是更新ui的方法 private void upU ...
- 输出1~n中1的个数
//输出1~n中1的个数,如f(1)=1,f(13)=6.通过测试,bymyself public class FindOnes{ public static void main(String arg ...
- echarts 添加自定义label标签
1.echarts 自定义标签 注:当设置visualMap的后,给覆盖regions单独定义的值(如果data 中没有regions的地区 则无妨,我这个是从data中删除'青岛',但是lable ...
- Tushare基础调用及处理
创建索引: db.daily.createIndex({code:1,date:1,'index':1}) mongodb查看表有几列: map = function() { for (var key ...
- 总结JavaScript中浏览器的兼容问题
浅析JavaScript中浏览器的兼容问题 浏览器兼容性问题是在实际开发中容易忽略而又最重要的一部分.我们在讲老版本浏览器兼容问题之前,首先要了解什么是能力检测,它是来检测浏览器有没有这种能力,即判断 ...
- 四图3d旋转轮播
<!DOCTYPE html><html><head><meta charset="utf-8" /><title>3d ...