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

指针和数组的区别:

  • 数组整数变量加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引用。

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

  • 如果数据对象是数组,则只能使用指针。
  • 如果数据对象是结构,则使用引用或指针。
  • 如果数据对象是类对象,则使用引用。
  • 如果数据对象是内置数据类型,则使用指针。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值