1、指针与引用的区别:
(1)非空区别。引用不能指向空值。
(2)合法性区别。由于指针可能为空,所以需要测试它以防止它为空。
(3)可修改区别。引用初始化后不可再被修改。
(4)内容区别。指针的内容是内存地址,引用只是某块内存的别名。所以指针的大小永远为4,而引用的大小和原变量相同(char为1,int为4)。
***Why is an array of reference not possible?***
Unlike pointer variables and other variables, references have no storage of their own. A reference is simply an alias for an object that already exists in memory (allowing you to refer to the object by its memory address). Since they have no storage of their own it is impossible to create an array of references. You can of course create an array of objects, each of which can then be referenced. You can also have several references to the same object. But you cannot store those references because there is nothing to physically store other than the object itself, which is already stored. For the same reason you cannot reference references nor can you point to references. You can only refer and point to objects (or point to NULL of course).

2、指定指针的值(指定地址):

struct struc
{
int a;
char b[];
double ccc;
}
(struc*) 0表示把0强制转化成一个struc结构的首地址。这样((struc*) 0)->b表示b在struct中的偏移。
3、指针作为函数参数传递
记住一点,在函数中对参数作任何改变,都不影响该参数在原程序中的值,所以指针,即地址,在原程序中是不会改变的(只是指针作为参数时,指针所指的指可能在函数中会被修改)。如果你要使地址在原程序中也得到改变(如,在函数中用这个指针去申请内存),那么
方法I:传递指向指针的指针,如:
void GetMemory(char **p, int num){
*p = (char *) malloc(sizeof(char) *num);
}
方法II:将指针作为返回值返回
char* GetMemory(char **p, int num){
p = (char *) malloc(sizeof(char) *num);
return p;
}
4、指针作为返回值
如果这个指针是在函数中新创建的,那么指针本身是存在栈中的,随着函数的退出,该指针也被释放。那么要想得到正确的结果,可以:
方法I:申请全局指针。全局变量是存在内存中的全局区域。
方法II:申请为static。这样存储在静态存储空间。如:
const char* strA()
{
static char str[] ="hello world";
return str;
}
5、函数指针
(1)定义函数
int max(int x, int y) {
return x>y?x:y;
}
(2)声明函数
int max(int,int);
(3)声明函数指针并赋值
int (*p)(int,int) = &max;
注意函数指针必须带有括号,否则就变成返回值为int*的函数了。
6、数组指针
如:int (*a)[10];
同函数指针一样,数组指针也必须要有括号,否则就变成元素为int*的数组了
因为sizeof(*a)结果为40,所以a++就是向后移动40个字节。
7、指针与句柄
指针标记某个物理内存地址
句柄指向的空间存放着资料在物理内存中的地址。即句柄是指向指针的指针。Windows内存管理器移动对象在内存中的位置后,把对象新的地址告之这个句柄地址来保存。
8、指针的强制转换
假设类A和类B中都有f()函数。
A* pa = new A();
B* pb = (B*)pa; //把pa的类型强制转换为了pb类型,但是pa的地址仍然是指向类A的f()。多态正式利用了这个原理。

C++指针与引用的更多相关文章

  1. [速记]关于指针,引用和递归和解递归——C++

    在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...

  2. C++指针参数引用

    粘个代码占位置,以后有时间把指针函数,函数指针都补上 #include <iostream> using namespace std; void freePtr1(int* p1){ /* ...

  3. C/C++:提升_指针的指针和指针的引用

    C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.

  4. C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》

    C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...

  5. C++学习笔记 指针与引用

    指针与引用  1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...

  6. 数组类型与sizeof与指针的引用

    以char类型为例: char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char char *p = a;     ...

  7. c++指针与引用问题

    本来是回答问题的,到这里做个笔记 *&L是指针的引用,实参是个指针.所以L是实参指针的别名,对别名L的修改,等于对实参的修改.*L是传值,你无法改变传过来的实参指针变量的值程序代码: #inc ...

  8. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  9. 详解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方 ...

  10. 指针和引用的区别(c/c++)

      http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用 ...

随机推荐

  1. 常用的sql语句(存储过程语法)

    1.存储过程语法 ①package create or replace package PKG_RPT_WAREHOUSE is -- Author : -- Created : 2018/9/28 ...

  2. 第13章 TCP编程(2)_TCP的连接和关闭过程

    4. TCP的连接和关闭过程 4.1 TCP连接的三次握手和四次挥手 (1)三次握手 ①第1次握手:建立连接.客户端发送连接请求报文段(SYN=1,sequence Number=x):然后客户端进入 ...

  3. cmd命令总结

    1.进入d盘 2.命令运行D:\mongodb\bin中的mongod.exe  显示安装成功!(命令行下运行 MongoDB 服务器)

  4. OTL技术应用

    什么是OTL:OTL 是 Oracle, Odbc and DB2-CLI TemplateLibrary 的缩写,是一个操控关系数据库的C++模板库,它目前几乎支持所有的当前各种主流数据库,如下表所 ...

  5. Centos 克隆后端口eth1怎么改回eth0

    复制或克隆后成功并做好后续问题的虚拟机 修改网卡地址vi /etc/udev/rules.d/70-persistent-net.rules 配置ifcfg-eth0脚本,注意HWADDR那行,要和上 ...

  6. mysql监控以及调优

    mysql 优点: 简单易用,成本低,易扩展,复制功能领先 mysql的生命周期: Mysql服务器监听3306端口>验证访问用户>创建mysql线程>检查内存(Qcache)> ...

  7. linux操作系统5 shell编程

    知识内容: 1.shell编程预备知识 2.shell变量 3.表达式与运算符 4.分支循环语句 5.函数 一.shell编程预备知识 1.什么是shell编程 shell是与linux交互的基本工具 ...

  8. multiprocess模块---进程---进程队列

    首先明白几个概念: 同步:做完一件事情,再做另外一件事情 异步:做一件事情的时候,可以再做另外一件事情 阻塞:recv  sleep accept input recvfrom 非阻塞:没有遇见上面这 ...

  9. svn+apache快速安装

    1.[安装基本软件包],  yum -y install httpd subversion mod_dav_svn 2.[验证svn安装是否成功及httpd 的mod_dav模块是否加载] svn - ...

  10. robot framework添加库注意事项

    添加库 假设你的项目结构是这样: 项目 ..myLib(库目录) ..目录1 ..测试用例套件1 此时你需要在“测试用例套件1”中用相对路径添加库myLib,你应该填:../myLib/ 特别注意后面 ...