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指针的更多相关文章

  1. (C/C++学习笔记) 二十二. 标准模板库

    二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...

  2. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  3. Alink漫谈(二十二) :源码分析之聚类评估

    Alink漫谈(二十二) :源码分析之聚类评估 目录 Alink漫谈(二十二) :源码分析之聚类评估 0x00 摘要 0x01 背景概念 1.1 什么是聚类 1.2 聚类分析的方法 1.3 聚类评估 ...

  4. 二十二、OGNL的一些其他操作

    二十二.OGNL的一些其他操作 投影 ?判断满足条件 动作类代码: ^ $   public class Demo2Action extends ActionSupport {     public ...

  5. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

  6. 二十二. Python基础(22)--继承

    二十二. Python基础(22)--继承 ● 知识框架   ● 继承关系中self的指向 当一个对象调用一个方法时,这个方法的self形参会指向这个对象 class A:     def get(s ...

  7. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  8. 学习笔记:CentOS7学习之二十二: 结构化命令case和for、while循环

    目录 学习笔记:CentOS7学习之二十二: 结构化命令case和for.while循环 22.1 流程控制语句:case 22.2 循环语句 22.1.2 for-do-done 22.3 whil ...

  9. [分享] IT天空的二十二条军规

    Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...

随机推荐

  1. Commit message 的写法规范。本文介绍Angular 规范(

    Commit message 的写法规范.本文介绍Angular 规范( http://www.ruanyifeng.com/blog/2016/01/commit_message_change_lo ...

  2. Qt隐式共享与显式共享

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/69945878Qt中的很多C++类都使用了隐式数据共 ...

  3. Python获取指定目录下所有子目录、所有文件名

    需求 给出制定目录,通过Python获取指定目录下的所有子目录,所有(子目录下)文件名: 实现 import os def file_name(file_dir): for root, dirs, f ...

  4. Ubuntu系统Python3相关环境或模块安装

    前提:一般用户安装都命令前都需要sudo ,或者在root用户下 1.Ubuntu 16.04 安装PyCharm Ubuntu 16.04 安装PyCharm 本文通过第三方源安装PyCharm,好 ...

  5. 升级系统到ubuntun到18.04后apt-get执行失败

    系统升级到18.04后执行apt-get install的时候报错 root@zhf-maple:/home/zhf/桌面# apt-get install vim-sciptsE: 无法获得锁 /v ...

  6. windows下的Mysql安装与基本使用(zip)

    一.安装过程 Mysql社区版下载地址:http://dev.mysql.com/downloads/mysql/ --注意,已管理员身份运行cmd.exe,很重要!!目录在,c:\windows\s ...

  7. 使用Xcode改动iOS项目project名和路径名

    对,好.错.改正. ------ 前言 系统 10.9 开发平台 xcode 5.0 旧project名 MyProject-iPad 改动之后 新project名 FjSk-iPad 点击项目,进入 ...

  8. LeetCode:路径总和II【113】

    LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...

  9. 微信小程序学习笔记(7)--------布局基础

    ui布局基础 一.flex布局 1.flex的容器和元素 2.flex容器属性详解     1>flex-direction不仅设置元素的排列方向,还设置主轴和交叉轴如下图主轴是由上到下 2&g ...

  10. 微信小程序学习笔记(4)--------框架之逻辑层

    逻辑层 逻辑层(App Service):小程序框架的逻辑层是由JavaScript编写的,逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈. App进行程序注册,Page进行页面注册 g ...