C++指向函数的指针实例解析
通常来说C++函数指针是指指向函数的指针,而非指向对象的指针。就像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关。
定义:
char (*fP)(char,int);
赋值:
char function(char i,int j) { }
fp=function;
调用
(*fp)(10,100);
type char (*FUN)(char,int);//类型定义 FUN fp ;//定义fp为指向函数的指针
volatile的用法和作用:
const与volatile相反,
volatile表示该内存中的数值可能随时会改变。
uchar a,b,c a=5; b=a; //b=5 c=a; //c=5 volatile uchar a,b,c a=5; b=a; //b不确定 c=a; //c不确定
例如单片机的P0口初始化为:
P0=0x0000 0001 a=p0; //如果人为使P0口外部都接高电平,则a=0x1111 1111,而不是0x0000 0001。与硬件相关
在定义寄存器相应的地址时常用到volatile:
#define rGPCCON (*(volatile unsigned *)0x56000020) #define rGPCDAT (*(volatile unsigned *)0x56000024)
在项目里文件比较多时,尽量少用全局变量,而应直接利用函数调用形式
单个文件: static char i; 定义静态变量,防止别的文件对变量值的意外修改。
char fun(void) { return(i); }
直接使用外部调用全局变量形式:extern int i; 这样的缺点是存在隐患,当文件较多时很可能出现全局的变量重名的问题,这时候要修改的话可能较麻烦。
相关推荐
-
C++智能指针实例详解
本文通过实例详细阐述了C++关于智能指针的概念及用法,有助于读者加深对智能指针的理解.详情如下: 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法.包括:std::auto_ptr.boost::scoped_ptr.boost::shared_p
-
C++指向函数的指针用法详解
本文以实例形式展示了C++指向函数的指针用法,是深入学习C++所必须掌握的关键知识点.分享给大家供大家参考之用.具体方法如下: 函数指针 现来看看以下声明语句,看看其含义: float (*h(int, void (*)(int)))(int); 以下是一个变量指针的定义语句: float* pf; 以下是一个普通函数的声明语句: float f(); 请看以下声明语句: float* g(); 因为()的优先级高于*, 所以相当于: float* (g()); g是一个函数, 返回值为floa
-
C++中给二维指针分配内存(实现代码)
原理就不写在这里了,毕竟网上的介绍有很多,代码如下所示: 复制代码 代码如下: #include <iostream>using namespace std; #define N 5#define M 10 int main(int argc, char **argv){ int **p; int i,j; p = new int* [N]; for (i = 0; i < N; i++) p[i] = new int [M]; for (i = 0; i < N; i+
-
C++交换指针实例
本文实例讲述了C++交换指针的方法.分享给大家供大家参考.具体分析如下: 通常情况下,我们只是对普通数据进行交换,交换指针的问题很少涉及,这里总结下,也方便我们以后查阅. 首先看下整型两个数据的交换(这个比较简单,就不多介绍了),核心代码如下: void m_swap(int *a,int *b) { int tmp = *a; *a = *b; *b = tmp; } 指针是内存地址,应该也算是整型变量,交换两个指针和交换两个整型变量类似,下面以两种方式进行. 传统C方式: 可以通过传递指向指
-
C++指针数组、数组指针、数组名及二维数组技巧汇总
本文较为详细的分析了关于理解C++指针数组,数组指针,数组名,二维数组的一些技巧.是比较重要的概念,相信对于大家的C++程序设计有一定的帮助作用. 一.关于数组名 假设有数组: int a[3] = {1, 2, 3} 1.数组名代表数组第一个元素的地址,注意,不是数组地址(虽然值相等),是数组第一个元素地址,a 等同于 &a[0]; a+1是第二个元素的地址.比第一个元素地址a(或者&a[0])超出了一个整型指针的大小,在这里是4个字节(byte) cout << a <
-
c++函数指针和回调函数示例
1.函数指针 函数指针是一个指针,只是这个指针它不像普通的指针指向是是一个变量,此时它指向的是一个函数,也就是它存储的是一个函数的地址,如果我们改变它的值,让它所指向的地址由指向funA转变为指向funB,那么这个函数指针的作用就改变了. 2.回调函数 什么是回调函数呢?回调函数其实就是一个通过函数指针调用的函数!假如你把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,这就是回调机制.B函数就是回调函数. 3.函数指针的使用 3.1函数指针声明 typedef
-
C++指针作为函数的参数进行传递时需要注意的一些问题
只有在被调函数中,对指针进行引用操作,才可以达到不需要返回值,就对指针指向的变量做出相应的变化. 下面分析这样两个例子; 要求:定义并初始化两个字符串变量,并执行输出操作:然后调用函数使这两个变量的值交换,并且要求被调函数的传值通过传递指针来实现. 程序1.1 复制代码 代码如下: #include<iostream>#include<string>using namespace std;int main(){ string str1="I love China!&q
-
c++传递函数指针和bind的示例
复制代码 代码如下: #include <algorithm>class TestClass{public: int Sub(int x, int y) { return y - x; } void InitAndTest() { PrintWithClassMemberFunction(&TestClass::Sub); PrintWithClassPointer(this); } // call: PrintWithClassMemberFunction(&TestC
-
C++ 基本算法 冒泡法、交换法、选择法、实现代码集合
1.冒泡法: 这是最原始,也是众所周知的最慢的算法了.他的名字的由来因为它的工作看来象是冒泡: 复制代码 代码如下: #include <iostream.h> void BubbleSort(int* pData,int Count) { int iTemp; for(int i=1;i<Count;i++) { for(int j=Count-1;j>=i;j--) {if(pData[j]<pData[j-1]) { iTemp = pData[j-1]; pData[
-
c++函数指针使用示例分享
需求假设要设计一个名为estimate()的函数,估算编写指定行数的代码所需的时间,并且希望不同的程序员都可以使用该函数. 对于所有的用户来说,estimate()中一部分代码都是相同的,但该函数允许每个程序员提供自己的算法来估算时间. 为实现目标,采用的机制是,将程序员要使用的算法函数的地址传递给estimate(). 实现代码如下 复制代码 代码如下: // funpointer.cpp : 定义控制台应用程序的入口点.//#include "stdafx.h"#include &
-
c++回调之利用函数指针示例
c++回调之利用函数指针示例 复制代码 代码如下: #include <iostream>using namespace std; /************************************************************************//* 下层实现: CALLBACK *//**********************************
-
C++中用指向数组的指针作函数参数
1.一维数组名作为函数参数传递一位数组名,就相当于该数组的首个元素的地址: 复制代码 代码如下: int a[10];int *p;p=a;//p=a与p=&a[0]是等价的 实例代码: 复制代码 代码如下: #include<iostream>using namespace std;int main(){ int a[10]={1,2,3,4,5,6,7,8,9,10}; void Print(int *p ,int n); Print(a,10); cout<<endl
-
C++编程小心指针被delete两次
在C++类中,有时候会使用到传值调用(即使用对象实体做参数),当遇到这种情况,可要小心了!尤其是当你所传值的对象生命周期较长,而非临时对象(生命周期段)的时候.来看看下面的情况: #include <iostream> using namespace std; class Text { private: char * str; public: Text(){str = new char[20]; ::memset(str,0,20); } void SetText(char * str) {
随机推荐
- 编程人员阅读代码的一些小技巧分享
- asp.net mvc 实现文件上传带进度条的思路与方法
- destoon后台网站设置变成空白的解决方法
- ASP和PHP实现生成网站快捷方式并下载到桌面的方法
- Mysql子查询IN中使用LIMIT应用示例
- jquery实现向下滑出的二级导航下滑菜单效果
- JavaScript登录验证基础教程
- Java框架SSH结合Easyui控件实现省市县三级联动示例解析
- Array.prototype.concat不是通用方法反驳[译]
- linux openssl基础介绍
- JS对象转换为Jquery对象示例
- Android 验证码功能实现代码
- Android应用程序“R文件”消失
- PHP获取网站域名和地址的代码
- 在CSS里写复杂的JavaScript脚本
- 两个php日期控制类实例
- 浅谈Android Aidl 通讯机制
- 用node-webkit把web应用打包成桌面应用(windows环境)
- 基于Android中获取资源的id和url方法总结
- Python内置函数reversed()用法分析