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. Logstash Reference Getting started with Logstash

    进阶功能_Logstash_数据采集_用户指南_日志服务-阿里云 https://help.aliyun.com/document_detail/49025.html Logstash Referen ...

  2. 阻塞IO、非阻塞IO、同步IO、异步IO等

    https://www.cnblogs.com/zingp/p/6863170.html 阅读目录 1 基础知识回顾 2 I/O模式 3 事件驱动编程模型 4 select/poll/epoll的区别 ...

  3. WebService 入门

    1. 远程调用技术 2. WebService 概述 WebService 是使用 Http 发送 SOAP 协议数据的一种远程调用技术; WebService 需要开发客户端; WebService ...

  4. Linux内核协议栈相关资料链接

    1.Linux内核网络分析(个人博客集合,分析较清晰) http://blog.csdn.net/qy532846454/article/category/1385933/2

  5. 安全技能树简版 正式发布——BY 余弦(知道创宇)

    之前留意到知道创宇发布的<知道创宇研发技能表>,对自己有很大的启发,最近听说知道创宇的余弦大神创业了(题外话),还发布了<安全技能树简版V1>,仔细研读之后总体感觉不那么复杂了 ...

  6. R中apply函数族

    参考于:http://blog.fens.me/r-apply/ 1. apply的家族函数 2. apply函数 apply函数是最常用的代替for循环的函数.apply函数可以对矩阵.数据框.数组 ...

  7. Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索"

    Delphi 正则表达式语法(9): 临界匹配 - 也叫"预搜索"与"反向预搜索" //匹配右边 var   reg: TPerlRegEx; begin   ...

  8. UTC和时间相互转换

    // ToLocalTime() UTC时间转换为本地时间 public static DateTime UtcToDateTime(long number) { , , , , , , ).AddS ...

  9. 杭电1023Train Problem II

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=1023 题目: Train Problem II Time Limit: 2000/1000 MS (Jav ...

  10. poj2250

    #include<string.h> #include<stdio.h> #include<algorithm> #include<vector> #i ...