C++(二十二) — 指针变量、函数指针、void指针
1、指针变量
(1)指针变量必须在初始化后才可以正常使用,初始化就是给他分配一个有效的数据地址。
先初始化,后使用。
(2)指针可以进行加减运算,++ 或者 --:将指针的位置向前或者向后移动一个数据单元(char是一个格,int 是4个格子)。
(3)指针之间直接相加没有意义,但相减是求出:两个指针间能存放几个指定类型的数据,不是地址值的具体差值。
(4)不同类型指针之间,不可以相互赋值。
(5)动态内存的申请和释放
// 申请一个内存空间地址给一个指针
int *pi = 0;
pi = new int(10);
cout << *pi << endl;
delete pi; // 申请动态的整型数组,
int *piarray = 0;
piarray = new int[10];
delete[] piarray;
2、函数指针
函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。很多c++泛型算法以及linux库函数经常见到函数指针的使用。
// 声明一个函数类型
typedef void (myTypeFunc)(int a, int b);
// myTypeFunc *myfuncp = nullptr; // 定义一个函数指针,指向函数入口地址 // 声明一个函数指针类型
typedef void (*myPTypeFunc)(int a, int b);
// myPTypeFunc myfuncp = nullptr; // 通过 函数指针类型 定义了一个函数指针 // 定义一个函数指针变量
void(*myVarPFunc)(int a, int b);
函数重载和函数指针,一起使用时,定义的函数指针会根据定义的参数类型,选择正确的重载函数。
typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
//对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。
int *(*a[])(int, char*);
//pFun是我们建的一个类型别名
typedef int *(*pFun)(int, char*);
//使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*);
pFun a[]; void(*b[]) (void(*)());
//首先为上面表达式加粗部分声明一个新类型
typedef void(*pFunParam)();
//整体声明一个新类型
typedef void(*pFun)(pFunParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
pFun b[];
3、void 类型指针
(1)无类型指针:void *pi,也指向内存地址,但不指定这个地址单元内的数据类型。
不可以直接赋值给其他类型的指针;访问内存数据时,必须进行强制转换,才可以间接访问内存数据。
不会单独使用,只是作为指针类型转换的中介。比如:通过内存区域的复制函数:memcpy()。原理:将某种类型数据的地址转换 void 指针,进行复制后,再强制转换为原理的地址类型。
//memcpy()函数的原型,参数:源地址指针、目标地址指针、复制字节数
// 接受的参数是:任意类型的实参地址指针,void 类型;
// 返回的也是 void 类型目的地址指针,可以赋值给任何类型的指针。
void *memcpy(void *dest, const void *src, size_t count);
(2) memcpy()通用复制函数的使用,实例:
#include <iostream>
using namespace std;
#include <string.h> void main()
{
// memcpy()通用复制函数的使用
char src[] = "";
char dest[];
char* pc = (char*)memcpy(dest, src, ); //复制字节数据
cout << pc << endl; int s1[] = { ,, };
int d1[];
int *pi = (int*)memcpy(d1, s1, );
cout << *pi << " " << *(pi + ) << " " << *(pi + ) << endl; system("pause");
}
(3)显示字符指针的内容
使用 cout 输出字符指针的地址值,而不是内容。
char *pch = "hello c++";
cout << pch << endl; // hello c++
cout << *pch << endl; // h
cout << (void*)pch << endl;// 输出的内存地址
对于单个字符的处理:
char a = 'h';
char *pch1 = &a;
cout << &pch1 << endl; // 输出 pch1 的地址
cout << *pch1 << endl; // h
cout << (void*)pch1 << endl;// 输出的内存地址,即 pch1 中保存的地址的值
C++(二十二) — 指针变量、函数指针、void指针的更多相关文章
- (C/C++学习笔记) 二十二. 标准模板库
二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- Alink漫谈(二十二) :源码分析之聚类评估
Alink漫谈(二十二) :源码分析之聚类评估 目录 Alink漫谈(二十二) :源码分析之聚类评估 0x00 摘要 0x01 背景概念 1.1 什么是聚类 1.2 聚类分析的方法 1.3 聚类评估 ...
- 二十二、OGNL的一些其他操作
二十二.OGNL的一些其他操作 投影 ?判断满足条件 动作类代码: ^ $ public class Demo2Action extends ActionSupport { public ...
- 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)
备忘录模式 Memento 沿着脚印,走过你来时的路,回到原点. 苦海翻起爱恨 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 一首<一生所爱>触动了多少 ...
- 二十二. Python基础(22)--继承
二十二. Python基础(22)--继承 ● 知识框架 ● 继承关系中self的指向 当一个对象调用一个方法时,这个方法的self形参会指向这个对象 class A: def get(s ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
- 学习笔记:CentOS7学习之二十二: 结构化命令case和for、while循环
目录 学习笔记:CentOS7学习之二十二: 结构化命令case和for.while循环 22.1 流程控制语句:case 22.2 循环语句 22.1.2 for-do-done 22.3 whil ...
- [分享] IT天空的二十二条军规
Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...
随机推荐
- 第17章—前端分页(Bootstrap-Table)
spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...
- .tomcat 管理 给tomcat设置用户名和密码登录
如果点击红色框框 出现403以下错误 看这个帖子可以解决 tomcat访问管理页面出现:403 Access Denied 解决方法 tomca管理 测试功能,生产环境不要用. Tomcat管理功能用 ...
- 吴超老师课程--Hbase介绍和伪分布式安装
1.HBase(NoSQL)的数据模型1.1 表(table),是存储管理数据的.1.2 行键(row key),类似于MySQL中的主键. 行键是HBase表天然自带的.1.3 列族(col ...
- MySQL ——索引原理与慢查询优化(Day45)
阅读目录 一 介绍 二 索引的原理 三 索引的数据结构 三 MySQL索引管理 四 测试索引 五 正确使用索引 六 查询优化神器-explain 七 慢查询优化的基本步骤 八 慢日志管理 ====== ...
- PAT 天梯赛 L1-045. 宇宙无敌大招呼 【水】
题目链接 https://www.patest.cn/contests/gplt/L1-045 AC代码 #include <iostream> #include <cstdio&g ...
- 对Java的接口和抽象类 的一些了解
学习并转载自: https://mp.weixin.qq.com/s?__biz=MzAxMzQ3NzQ3Nw==&mid=2654251476&idx=4&sn=e66ec4 ...
- bind方法代替闭包
<a href="JavaScript:">a</a> <a href="JavaScript:">b</a> ...
- OpenGL中的Shader
http://blog.csdn.net/huangcanjun187/article/details/52474365 学习总结自:http://learnopengl.com/#!Getting- ...
- zoj2432
/* 首先,dp的最开始是定义状态 dp[i][j] 表示A串的前i个,与B串的前j个,并以B[j]为结尾的LCIS 的长度. 状态转移方程: if(A[i]==B[j]) dp[i][j]=max( ...
- 【HTML5校企公益课】第四天
1.上午考试没去.. 2.下午跟不上.. 变色.html <!DOCTYPE html> <html> <head> <meta charset=" ...