C++指针和引用简介

摘要
本文介绍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 指针”得到的是指针本身的大小。
    • 指针和引用的自增(++)运算意义不一样。
    • 引用是类型安全的。而指针不是 (引用比指针多了类型检查

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

原文地址:https://www.cnblogs.com/blfshiye/p/4803294.html