指针,数组,引用之间的不同点
Posted xuguoli_beyondboy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针,数组,引用之间的不同点相关的知识,希望对你有一定的参考价值。
指针和数组的区别:
- 数组整数变量加1,其值将增加1,,但将指针变量加1后,增加的量等于它指向的类型的字节数。
- 指针的值可以修改,而数组名是常量不可以修改。
- 对数组应用sizeof运算符得到的是数组的长度,而对指针应用sizeof得到的是指针的长度。
- 对数组取地址时,数组名也不会被解释为其地址,
short tell[10]
的&tell[0]
是一个2字节内存快的地址,而&tell
是一个20字节内存快的地址,因此表达式tell+1
将地址值加为2,而表达式&tell+1
将地址加20.
#include <iostream>
using namespace std;
int main()
double wages[3]=10000.0,20000.0,10000.0;
short stacks[3]=3,2,1;
double *pw=wages;
cout<<"pw= "<<pw<<endl;
double *pe=pw;
//指针加1就增加类型的字节数
pe=pe+1;
//wages=wages+1; 编译错误,数组名是常量不能改变
cout<<"add 1 to the pw pointer"<<endl;
cout<<"pe= "<<pe<<endl;
//相减就不按照类型字节
cout<<"pe-pw= "<<pe-pw<<endl;
//数组和指针的sizeof区别
cout<<sizeof(wages)<<" = size of wages array"<<endl;
cout<<sizeof(pw)<<" = size of pw pointer"<<endl;
//数组取地址时的区别
cout<<"wages= "<<wages<<endl;
cout<<"wages+1= "<<wages+1<<endl;
cout<<"&wages+1= "<<&wages+1<<endl;
return 0;
运行结果:
pw= 0x7ffd58ff01c0
add 1 to the pw pointer
pe= 0x7ffd58ff01c8
pe-pw= 1
24 = size of wages array
8 = size of pw pointer
wages= 0x7ffd58ff01c0
wages+1= 0x7ffd58ff01c8
&wages+1= 0x7ffd58ff01d8
引用和指针的区别:
- 引用是是它引用变量的别名,而指针是指向变量的一个变量,其区别如图所示:
- 引用必须在声明引用时将其初始化,而不能像指针那样,先声明,再赋值。
- 引用接近const指针,一旦与某个变量关联起来,其引用的变量就不可改变,而指针可以改变其指向的变量。
- 引用自增自减是数值上的自增自减,而指针自增自减是地址的自增自减,意义不一样。
- 引用使用时无需解引用(*),指针需要解引用。
#include <iostream>
using namespace std;
int main()
int rats=10;
//int &test; 编译报错,因为引用必须在声明就赋值
int &rodents=rats;
int *ropointer=&rats;
//引用和指针指向的区别
cout<<"address of rat="<<&rats<<endl;
cout<<"address of rodents="<<&rodents<<endl;
cout<<"address of ropointer="<<&ropointer<<endl;
int t=100;
//引用一旦赋值就不可以改变其引用,而指针可以
rodents=t;
cout<<"rodents="<<rodents<<endl;
cout<<"rats="<<rats<<endl;
t=500;
ropointer=&t;
cout<<"ropointer="<<*ropointer<<endl;
cout<<"rats="<<rats<<endl;
//引用和指针自增自减
cout<<"++ropointer="<<++ropointer<<endl;
cout<<"++rodents="<<++rodents<<endl;
return 0;
运行结果:
address of rat=0x29ff18
address of rodents=0x29ff18
address of ropointer=0x29ff14
rodents=100
rats=100
ropointer=500
rats=100
++ropointer=0x29ff14
++rodents=101
下面是一些函数使用指针或引用指导原则:
对于使用传递的值而不作修改的函数:
- 如果数据对象很小,如内置数据类型或小型结构,则按值传递。
- 如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针。
- 如果数组对象是较大的结构,则使用const指针或const引用,以提高程序的效率,这样可以节省复制结构所需的时间和空间。
- 如果数据对象是类对象,则使用const引用。
对于修改调用函数中数据的函数:
- 如果数据对象是数组,则只能使用指针。
- 如果数据对象是结构,则使用引用或指针。
- 如果数据对象是类对象,则使用引用。
- 如果数据对象是内置数据类型,则使用指针。
以上是关于指针,数组,引用之间的不同点的主要内容,如果未能解决你的问题,请参考以下文章