摘要

本文介绍C++指针和概念引用

这是一个指针

指针的类型

指针所指向的类型

指针表达式

指针与函数

什么是引用

指针引用差别

指针和引用的同样点和不同点

**什么是指针**

指针就是一个存放地址的变量,

当指针指向某个变量,

这时这个指针里就存放了那个变量的地址 ,

同一时候能够利用指针直接取变量中的值用 ,仅仅要在指针前加 * 就是
取其

真值了(也就是被指向的变量的值)

![指针示意](http://img.blog.csdn.net/20150605232124686)

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

总结:

1.指针的类型

从语法的角度看。指针声明语句里的指针名去掉,剩下部分就是指针的类型。是指针本身所具有的类型

2.指针所指向的类型

通过指针来訪问指针所指向的内存区时,指针所指向的类型决定了编译器将把那块内存区当做什么来看待。

从语法上看,你仅仅须把指针声明语句中的指针名字和名字左边的指针声明符*去掉。剩下的就是指针所指向的类型

**指针表达式**
int a,b;
int array[10];
int *pa;
pa=&a; // &a是一个指针表达式。 int **p=&pa; // &pa也是一个指针表达式。
*p=&b; // *p和&b都是指针表达式。
pa=array;
pa++; // 这也是指针表达式。


char *array[20];
char **parr=array;//假设把arr看作指针的话。arr也是指针表达式
char *str;
str=*parr;//*parr是指针表达式
str=*(parr+1);//*(parr+1)是指针表达式
str=*(parr+2);//*(parr+2)是指针表达式

指针表达式的结果是一个指针。所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占领的内存

指针与数组
int array[5]={0,1,2,3,4},value;
...
value=array[0];// value=*array;
value=array[3];// value=*(array+3);
value=array[4];// value=*(array+4); 指针向后位移了+δ
char *str[3]={
"Hello,nice to meet you!",
"Hi,good night! ",
"Hello world"
};
char s[80];
strcpy(s,str[0]);// or strcpy(s,*str);
strcpy(s,str[1]);//or strcpy(s,*(str+1));
strcpy(s,str[2]);//or 写成strcpy(s,*(str+2));

str是一个三单元数组,该数组的每一个单元都是一个指针。这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char *。

str也是一个指针,类型是char,所指向的类型是char,它指向的地址是字符串”Hello,nice to meet you!”的第一个字符的地址,即’H’的地址。

str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char *

**指针与函数**
int f1(char*,int);
int (*pf1)(char*,int);
pf1=f1;
....
int a=(*pf1)("abcdefg",7); // 通过函数指针调用函数。
什么是引用

引用是一个对象的别名。主要用于函数參数和返回值类型,符号X&表示X类型的引用

**指针引用差别**

指针指向一块内存,它的内容是所指内存的地址。而引用则是某块内存的别名。引用不改变指向

**指针传递与引用传递**

1 指针传递

- 參数本质上是值传递的方式。它所传递的是一个地址值。

值传递过程中,被调函数的形式參数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实參的值,从而成为了实參的一个副本。值传递的特点是被调函数对形式參数的不论什么操作都是作为局部变量进行,不会影响主调函数的实參变量的值。

-

2 引用传递

- 过程中,被调函数的形式參数也作为局部变量在栈中开辟了内存空间。可是这时存放的是由主调函数放进来的实參变量的地址。被调函数对形參的不论什么操作都被处理成间接寻址,即通过栈中存放的地址訪问主调函数中的实參变量。正由于如此,被调函数对形參做的不论什么操作都影响了主调函数中的实參变量。

**指针和引用的同样点和不同点**
  1. 同样点:

    • 都是地址的概念;

指针指向一块内存,它的内容是所指内存的地址。而引用则是某块内存的别名。

  1. 不同点:

    • 指针是一个实体。而引用仅是个别名;
    • 引用仅仅能在定义时被初始化一次,之后不可变;指针可变。引用“从一而终”,指针能够“见异思迁”。
    • 引用没有const。指针有const。const的指针不可变;(详细指没有int& const a这样的形式,而const int& a是有 的, 前者指引用本身即别名不能够改变。这是当然的,所以不须要这样的形式。后者指引用所指的值不能够改变)
    • 引用不能为空,指针能够为空。
    • “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小。
    • 指针和引用的自增(++)运算意义不一样。
    • 引用是类型安全的。而指针不是 (引用比指针多了类型检查

版权声明:本文博主原创文章,博客,未经同意不得转载。

C++指针和引用简介的更多相关文章

  1. C程序设计语言--指针和引用的区别

    在看了一篇文章以后,http://coolshell.cn/articles/7992.html,说的是C和C++之间的缺陷,当然这篇文章说的非常高深了.所以就找了一些资料,分析了这两者的区别 在&l ...

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

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

  3. C++指针参数引用

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 公布windows的&quot;Universal Apps&quot; Unity3D游戏

    转载请注明出处:http://blog.csdn.net/u010019717 更全的内容请看我的游戏蛮牛地址:http://www.unitymanual.com/space-uid-18602.h ...

  2. 2014年辛星解读Javascript之用DOM动态操纵HTML元�

    关于DOM,我们了解了能够用DOM操纵HTML的一些属性和样式,还能够为HTML元素绑定事件等等,那么接下来,我们将涉及到用DOM来动态的创建.删除HTML等一些操作,我的核心思路还是重实战,因此,代 ...

  3. Audio Offload

    Audio Offload 音频分载,是系统将音频分载到声卡硬件进行分载处理的功能.从Windows 8开始,音频的硬件加速和分载处理又回来了.为什么说又回来了呢? 因为声卡自创通公司发明开始,相当长 ...

  4. css中padding中样式的顺序含义

    4种可能的情况.举例说明: padding:10px; 四个内边距都是10px padding:5px 10px; 上下5px 左右10px padding:5px 10px 15px; 上5px 右 ...

  5. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

  6. Apache的Mesos和Google的Kubernetes 有什么区别?

    Apache的Mesos和Google的Kubernetes 有什么区别?本文来自StackOverFlow上的一个问题,主要讨论Mesos和Kubernetes的区别,相信我们很多人也有同意的疑问. ...

  7. as 的妙用

    个人理解:as跟is is 相当于判断里的“==” 是与否 if(e.OriginalSource is Button) as 一般用来转换另一种object e.OriginalSource as ...

  8. 《Javascript高级程序设计》读书笔记之bind函数详解

    为什么需要bind var name = "The Window"; var object = { name: "My Object", getNameFunc ...

  9. UI僵死分析

    原因剖析 UI僵死无非只是因为UI线程因繁忙而无法去接受用户的响应.详细说来内在原因有以下两个: 正常的业务代码写在UI线程中执行,业务代码的任务繁重导致UI线程无法分身去接受用户的界面输入 UI控件 ...

  10. 从PCI上读取数据 线程和定时器效率

    从PCI上读取数据 线程和定时器效率 线程: mythread=AfxBeginThread(StartContinuous,(LPVOID)1,THREAD_PRIORITY_NORMAL,0,CR ...