指针

(6)传递指针给函数

只需要简单地声明函数参数为指针类型即可

  1. #include <iostream>
  2. #include <ctime>
  3.  
  4. using namespace std;
  5. void getSeconds(unsigned long *par);
  6.  
  7. int main ()
  8. {
  9. unsigned long sec;
  10.  
  11. getSeconds( &sec );
  12.  
  13. // 输出实际值
  14. cout << "Number of seconds :" << sec << endl;
  15.  
  16. return ;
  17. }
  18.  
  19. void getSeconds(unsigned long *par)
  20. {
  21. // 获取当前的秒数
  22. *par = time( NULL );
  23. return;
  24. }

结果:Number of seconds :1294450468

能接受指针作为参数的函数,也能接受数组作为参数

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // 函数声明
  5. double getAverage(int *arr, int size);
  6.  
  7. int main ()
  8. {
  9. // 带有 5 个元素的整型数组
  10. int balance[] = {, , , , };
  11. double avg;
  12.  
  13. // 传递一个指向数组的指针作为参数
  14. avg = getAverage( balance, ) ;
  15.  
  16. // 输出返回值
  17. cout << "Average value is: " << avg << endl;
  18.  
  19. return ;
  20. }
  21.  
  22. double getAverage(int *arr, int size)
  23. {
  24. int i, sum = ;
  25. double avg;
  26.  
  27. for (i = ; i < size; ++i)
  28. {
  29. sum += arr[i];
  30. }
  31.  
  32. avg = double(sum) / size;
  33.  
  34. return avg;
  35. }

结果:Average value is: 214.4

传递指针给函数的过程补充:

  1. #include <iostream>
  2. #include <ctime>
  3.  
  4. void getSeconds(unsigned long *par);
  5.  
  6. int main()
  7. {
  8. unsigned long sec = ;
  9.  
  10. cout << "Value of sec = :" << sec << endl;
  11. cout << "Value of &sec = :" << &sec << endl;
  12. cout << endl;
  13. getSeconds(&sec);
  14.  
  15. // 输出实际值
  16. cout << "Number of seconds :" << sec << endl;
  17.  
  18. return ;
  19. }
  20.  
  21. void getSeconds(unsigned long *par)
  22. {
  23. cout << "Value of *par = :" << *par << endl;
  24. cout << "Value of par = :" << par << endl;
  25. cout << "Value of &par = :" << &par << endl;
  26. cout << endl;
  27. // 获取当前的秒数
  28. *par = time(NULL);
  29. cout << "Value of *par = :" << *par << endl;
  30. cout << endl;
  31. return;
  32. }

(7)从函数返回指针

必须声明一个返回指针的函数

  1. int * myFunction()
  2. {
  3. ....
  4. }

C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量

下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址)来返回它们:

  1. #include <iostream>
  2. #include <ctime>
  3. #include <cstdlib>
  4.  
  5. using namespace std;
  6.  
  7. // 要生成和返回随机数的函数
  8. int * getRandom( )
  9. {
  10. static int r[];
  11.  
  12. // 设置种子
  13. srand( (unsigned)time( NULL ) );
  14. for (int i = ; i < ; ++i)
  15. {
  16. r[i] = rand();
  17. cout << r[i] << endl;
  18. }
  19.  
  20. return r;
  21. }
  22.  
  23. // 要调用上面定义函数的主函数
  24. int main ()
  25. {
  26. // 一个指向整数的指针
  27. int *p;
  28.  
  29. p = getRandom();
  30. for ( int i = ; i < ; i++ )
  31. {
  32. cout << "*(p + " << i << ") : ";
  33. cout << *(p + i) << endl;
  34. }
  35.  
  36. return ;
  37. }

结果:

  1.  
  2. *(p + ) :
  3. *(p + ) :
  4. *(p + ) :
  5. *(p + ) :
  6. *(p + ) :
  7. *(p + ) :
  8. *(p + ) :
  9. *(p + ) :
  10. *(p + ) :
  11. *(p + ) :

补充:

1.指针的本质是变量,可以是各种数据类型,定义一个指针 "*ip",其中 "ip" 需要赋于一个地址(可以用 & 符号获取其他变量的地址再赋值给 ip),而 "*ip" 是一个具体的值,即读取地址后获得的值;

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. int var = ;
  7. int *ip;
  8. ip = &var;
  9.  
  10. cout << "var的值:";
  11. cout << var << endl;
  12.  
  13. cout << "变量 ip 的储存地址:";
  14. cout << ip << endl;
  15.  
  16. cout << "指针 *ip 的值:";
  17. cout << *ip << endl;
  18. return ;
  19. }

结果:

  1. var的值:
  2. 变量 ip 的储存地址:0x7fff5e7deae8
  3. 指针 *ip 的值:

2.

C++ 中常量引用、指向常量的指针、常量指针的区别

3.

4.

5. 关于值传递,指针传递,引用传递

值传递:

形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

指针传递:

形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

引用传递:

形参相当于是实参的"别名",对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

  1. #include<iostream>
  2. using namespace std;
  3. //值传递 4 void change1(int n){
  4. cout<<"值传递--函数操作地址"<<&n<<endl; //显示的是拷贝的地址而不是源地址 6 n++;
  5. }
  6.  
  7. //引用传递10 void change2(int & n){
  8. cout<<"引用传递--函数操作地址"<<&n<<endl;
  9. n++;
  10. }
  11. //指针传递15 void change3(int *n){
  12. cout<<"指针传递--函数操作地址 "<<n<<endl;
  13. *n=*n+;
  14. }
  15. int main(){
  16. int n=;
  17. cout<<"实参的地址"<<&n<<endl;
  18. change1(n);
  19. cout<<"after change1() n="<<n<<endl;
  20. change2(n);
  21. cout<<"after change2() n="<<n<<endl;
  22. change3(&n);
  23. cout<<"after change3() n="<<n<<endl;
  24. return true;
  25. }

6.

C++ 函数指针 & 类成员函数指针

7.

8.指针分配与释放一个空间

c++ 指针(三)的更多相关文章

  1. 从汇编看c++成员函数指针(三)

    前面的从汇编看c++中成员函数指针(一)和从汇编看c++成员函数指针(二)讨论的要么是单一类,要么是普通的多重继承,没有讨论虚拟继承,下面就来看一看,当引入虚拟继承之后,成员函数指针会有什么变化. 下 ...

  2. 深入理解C语言-二级指针三种内存模型

    二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {&quo ...

  3. 智能指针(三):unique_ptr使用简介

    我们知道auto_ptr通过复制构造或者通过=赋值后,原来的auto_ptr对象就报废了.所有权转移到新的对象中去了.而通过shared_ptr可以让多个智能指针对象同时拥有某一块内存的访问权.但假如 ...

  4. [转] 智能指针(三):unique_ptr使用简介

    PS: 1. auto_ptr太不安全,可能多个auto_ptr指向一个对象,出现重复释放的问题 2. unique_ptr解决了这个问题,不允许拷贝构造函数和赋值操作符,但是!它支持移动构造函数,通 ...

  5. C++ 智能指针三

    /* 智能指针shared_ptr注意点 */ #include <iostream> #include <string> #include <memory> // ...

  6. 【校招面试 之 C/C++】第27题 C++ 智能指针(三)之 unique_ptr

    auto_ptr<string> p1(new string ("auto") : //#1 auto_ptr<string> p2; //#2 p2 = ...

  7. C语言 函数指针三(反向调用)

    动态库代码 //简单的动态库开发----报文发送 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib. ...

  8. 深入学习c++--智能指针(三) unique_ptr

    1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 拥有共享对象所有权语义的智能指针 3. unique_ptr: 拥有独有对象所有权语义的智 ...

  9. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  10. 【c++基础】const、const指针、const引用

    一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) ; co ...

随机推荐

  1. 第二章 Vue快速入门-- 23 品牌案例-根据关键字实现数组的过滤

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  2. Java GUI :Hello World

    public class Demo01 extends Frame{ public Demo01(){ super("Demo01");//标题 this.setSize(450, ...

  3. 【每日一包0008】arr-diff

    [github地址:https://github.com/ABCDdouyae...] arr-diff 多个数组比较,过滤出第一个数组独有的内容 用法:arr-diff(arr1, arr2, ar ...

  4. HDU6739 2019CCPC秦皇岛赛区 I. Invoker

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6739思路:暴力dp           一个special skill最多有6种排列组合          ...

  5. Iview 在Table组件中添加图片

    要先简单了解render函数的使用. 直接上代码: { title: "商品图片", key: "commodityPhoto", align: 'center ...

  6. idea中使用JRebel插件

    首先 等待下载 点击Restart idea (重启idea) 然后等待idea 进行激活 记得勾选下面的那个复选框 激活url:http://139.199.89.239:1008/88414687 ...

  7. 43 java中的异常处理机制的简单原理和应用

  8. 插入排序,选择排序,冒泡排序等常用排序算法(java实现)

    package org.webdriver.autotest.Study; import java.util.*; public class sort_examp{ public static voi ...

  9. python web Tornado框架

    1.Tornado Tornado:python编写的web服务器兼web应用框架 1.1.Tornado的优势 轻量级web框架异步非阻塞IO处理方式出色的抗负载能力优异的处理性能,不依赖多进程/多 ...

  10. 智能指针之shared_ptr基本概述

    1.shared_ptr允许有多个指针指向同一个对象,unique_ptr独占所指向的对象. 2.类似于vector,智能指针也是模板.创建智能指针: shared_ptr<string> ...