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天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...
随机推荐
- Logstash Reference Getting started with Logstash
进阶功能_Logstash_数据采集_用户指南_日志服务-阿里云 https://help.aliyun.com/document_detail/49025.html Logstash Referen ...
- 阻塞IO、非阻塞IO、同步IO、异步IO等
https://www.cnblogs.com/zingp/p/6863170.html 阅读目录 1 基础知识回顾 2 I/O模式 3 事件驱动编程模型 4 select/poll/epoll的区别 ...
- WebService 入门
1. 远程调用技术 2. WebService 概述 WebService 是使用 Http 发送 SOAP 协议数据的一种远程调用技术; WebService 需要开发客户端; WebService ...
- Linux内核协议栈相关资料链接
1.Linux内核网络分析(个人博客集合,分析较清晰) http://blog.csdn.net/qy532846454/article/category/1385933/2
- 安全技能树简版 正式发布——BY 余弦(知道创宇)
之前留意到知道创宇发布的<知道创宇研发技能表>,对自己有很大的启发,最近听说知道创宇的余弦大神创业了(题外话),还发布了<安全技能树简版V1>,仔细研读之后总体感觉不那么复杂了 ...
- R中apply函数族
参考于:http://blog.fens.me/r-apply/ 1. apply的家族函数 2. apply函数 apply函数是最常用的代替for循环的函数.apply函数可以对矩阵.数据框.数组 ...
- Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索"
Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索" //匹配右边 var reg: TPerlRegEx; begin ...
- UTC和时间相互转换
// ToLocalTime() UTC时间转换为本地时间 public static DateTime UtcToDateTime(long number) { , , , , , , ).AddS ...
- 杭电1023Train Problem II
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1023 题目: Train Problem II Time Limit: 2000/1000 MS (Jav ...
- poj2250
#include<string.h> #include<stdio.h> #include<algorithm> #include<vector> #i ...