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 ...
随机推荐
- 基于SDN4.2.4的neo4j实例
首先添加maven依赖 (1)SND的声明 <dependency> <groupId>org.springframework.data</groupId> < ...
- h5手机页面注册处理(短信验证)
//获取验证码 var wait = 60; function time(o) { if(wait == 0) { o.removeAttribute("disabled"); o ...
- Linux内核编译完整过程
Linux内核编译完整过程 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过 ...
- qt5--定时器
定时器方式一:----定时器事件 需要 #include <QTimerEvent> #include "win.h" #include <QDebug& ...
- dockerfile:python-cuda-nvidia-cudnn
centos7 FROM centos:7 MAINTAINER yon@DataExa.com RUN yum -y install make wget \ && wget -O / ...
- head first 设计模式笔记6-命令模式
命令模式:将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作.这个模式允许我们将动作封装成命令对象,然后可以传递和调用. 1)命令模式将发出请求的对象和 ...
- jquery的checked
目前使用的jQuery版本为 v1.11.2 jquery判断checked的三种方法: .attr('checked'): //看版本1.6+返回:"checked"或&qu ...
- 暑假集训 #2 div1 I - Lada Priora 精度处理
I - Lada Priora Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- sh_02_del关键字
sh_02_del关键字 name_list = ["张三", "李四", "王五"] # (知道)使用 del 关键字(delete)删除 ...
- python学习之路(8)
定义函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_ ...