摘要
本文讲述C++中指针与引用的概念
什么是指针
指针的类型
指针所指向的类型
指针表达式
指针与函数
什么是引用
指针引用区别
指针和引用的相同点和不同点
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 引用传递
- 过程中,被调函数的形式参数也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
原文地址:http://blog.csdn.net/cuiwjava/article/details/46378465