1.指针(变量)的类型

把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。

(1)int*ptr; //指针的类型是 int*

(2) char*ptr;//指针的类型是 char*

(3) int**ptr;//指针的类型是 int**

(4) int(*ptr)[3];//指针的类型是 int(*)[3]

(5) int*(*ptr)[4];//指针的类型是 int*(*)[4]

2.指针所指向的类型

把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:

(1)int*ptr; //指针所指向的类型是int

(2)char*ptr; //指针所指向的的类型是 char

(3)int**ptr; //指针所指向的的类型是 int*

(4)int(*ptr)[3]; //指针所指向的的类型是 int()[3]

(5)int*(*ptr)[4]; //指针所指向的的类型是 int*()[4]

3.指针的值(指针所指向的内存地址)

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。说一个指针指向了某块内存区域,则该指针的值就是这块内存区域的首地址

每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里

4.指针本身所占据的内存区

指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在 32 位平台里,指针本身占据了 4 个字节的长度。

指针本身占据的内存这个概念在判断一个指针表达式(后面会解释)是否是左值时很有用。

5.分析(理解)指针

完全理解一个复杂类型其实也不难,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以:从变量名处起,根据运算符优先级结合,一步一步分析。

int *p;  // 一个返回整型数据的指针。P先与*结合,说明P是一个指针;再与int结合,说明指针所指向的内容为int型。

int p[3]; // 一个由整型数据组成的数组。P先与[]结合,说明P是一个数组;与int结合,说明数组里的元素是整型的。

int *p[3]; // 一个由返回整型数据的指针所组成的数组。P先与[]结合,所以P是一个数组;再与*结合,说明数组里的元素是指针类型;与int结合,说明指针所指向的内容类型是整型的。

int (*p)[3]; // 一个指向由整型数据组成的数组的指针。P先与*结合,说明P是一个指针;再与[]结合("()"只是为了改变优先级),说明指针所指向的内容是一个数组;与int结合,说明数组里的元素是整型。

int **p; // P是一个指针(它指向一个指向int数据的指针)。

int p(int); // 一个函数申明。P先与()结合,说明P是一个函数;然后进入()里分析,说明该函数有一个整型变量的参数;然后再与外面的int结合,说明函数的返回值是一个整型数据。

int (*p)(int); // 一个指向有一个整型参数且返回类型为整型的函数的指针。P先与*结合,说明P是一个指针;与()结合,说明指针指向的是一个函数;……

int *(*p(int))[3]; // 一个参数为一个整数且返回一个指向由整型指针变量组成的数组的指针变量的函数。P先与()结合,说明P是一个函数;然后进入()里面,与int结合,说明函数有一个整型变量参数;然后再与外面的*结合,说明函数返回的是一个指针;然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,再与int结合,说明指针指向的内容是整型数据。

C/C++指针知识整理(一)的更多相关文章

  1. Linux进程管理知识整理

    Linux进程管理知识整理 1.进程有哪些状态?什么是进程的可中断等待状态?进程退出后为什么要等待调度器删除其task_struct结构?进程的退出状态有哪些? TASK_RUNNING(可运行状态) ...

  2. C++复习15.指针知识

      C++复习15.指针知识 4.指针知识      在Tencent 笔试和面试中都考到了 C/C++中的指针知识,因为自己很不喜欢使用指针,所以才开始学习 Java的,但是现在看来还是躲不掉的,所 ...

  3. C++进阶4.C++知识整理

    C++知识整理(多益笔试) 20131012 前言: 还是关于笔试知识的整理,主要是面向对象的知识还有一些常见的语法知识. 1.还是C++内存管理的知识 C++中程序的内存分布如下: 栈:向下增长,可 ...

  4. MySQL 索引知识整理(创建高性能的索引)

    前言: 索引优化应该是对查询性能优化的最有效的手段了.索引能够轻易将查询性能提高几个数量级. // 固态硬盘驱动器有和机械硬盘启动器,有着完全不同的性能特性: 然而即使是固态硬盘,索引的原则依然成立, ...

  5. js事件(Event)知识整理

    事件(Event)知识整理,本文由网上资料整理而来,需要的朋友可以参考下   鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemo ...

  6. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  7. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

  8. wifi基础知识整理

    转自 :http://blog.chinaunix.net/uid-9525959-id-3326047.html WIFI基本知识整理 这里对wifi的802.11协议中比较常见的知识做一个基本的总 ...

  9. 数据库知识整理<一>

    关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...

随机推荐

  1. C#DataTable学习心得

    C#DataTable学习心得 一.DataSet.DataTable.DataRow.DataColumn 1] 在DataSet中添加DataTable DataSet.Tables.Add(Da ...

  2. 对List对象按照某个成员变量进行排序

    /** * 对List对象按照某个成员变量进行排序 * @param list List对象 * @param sortField 排序的属性名称 * @param sortMode 排序方式:ASC ...

  3. 获取iOS设备属性

    通过使用UIDevice: [[UIDevice currentDevice] systemName]; [[UIDevice currentDevice] systemVersion];//os v ...

  4. Linux网络管理——子网掩码

    1. 网络基础 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB",&q ...

  5. javascript自定义日期函数

    1.格式化日期(YYYY-MM-DD) 代码: var DateFormat = function (date) { if (!(date instanceof Date)) { date = dat ...

  6. Android GreenDao with Android Studio IDE

    转:http://blog.surecase.eu/using-greendao-with-android-studio-ide/ In this tutorial we will show you ...

  7. 对于一些css样式的巧妙方法进行总结。

    针对之前遇到过的一些特殊样式的实现,我今天做个总结,目的有二:一是将这些方法记录下来,以便将来需要用到时查找使用.二为将这些大神们智慧的结晶发扬光大,让广大前端程序猿们能够少走弯路.此贴为更新帖,以后 ...

  8. Scala单例对象、伴生对象实战详解

    1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...

  9. J2SE知识点摘记(十三)

    1.        字节流 InputStream(输入字节流)是一个定义了java流式字节流输入模式的抽象类.该类的所有方法在出错时都会引发一个IOExcepiton异常. Void close() ...

  10. ANDROID SHAPE画圆形背景_ANDROID实现角标布局

    ANDROID SHAPE画圆形背景_ANDROID实现角标布局 <?xml version="1.0" encoding="UTF-8"?> &l ...