指针,数组,引用之间的不同点

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引用。

对于修改调用函数中数据的函数:

  • 如果数据对象是数组,则只能使用指针。
  • 如果数据对象是结构,则使用引用或指针。
  • 如果数据对象是类对象,则使用引用。
  • 如果数据对象是内置数据类型,则使用指针。

以上是关于指针,数组,引用之间的不同点的主要内容,如果未能解决你的问题,请参考以下文章

指针和一维数组之间的关系数组的引用方法指针的运算

指针和一维数组之间的关系数组的引用方法指针的运算

指针和一维数组之间的关系数组的引用方法指针的运算

指针引用不同的值

指针/引用数组?

字符串指针引用数组基础