【C++】指针,数组名,引用的区别

1. 指针

申明一个对象O 的指针p,即在内存中开辟一块空间,这个空间存的内容是这个对象的地址,这个空间的名字是p,  指针不管是指向什么类型的对象,指针本身是int类型。

char  s = 'c' ;

char* ps = &s;

sizeof(s)是1,sizeof(ps)是4

【插】定义多个指针: int *a, *b; (*要在每个变量名前写)


2. 引用

申明一个对象O的引用Y,即对这个对象所占的空间起了个别名Y。操作Y即是操作O。

int  a = 5;

int  &b = a;

cout<<&a<<<<"\t"<<&b;

&a即a的地址和&b即b的地址都是同一个地址。

【插】 定义多个引用: int &a = b, &c =d;

【插】 int &a = 8;这个是错误的,引用要绑定一个对象(一个在程序中已经存在的空间)。


3. 数组

因为数组无法复制,因此使用数组名字时候,数组名自动转化为指向其第一个元素的指针。

1)一维数组:数组名可以看成是数组的第一个元素的地址。

【插】给一个函数function传递一维数组做形参。

function(int *A)

function(int A[] )

function(int A{10]) // 虽然不能直接传递数组,但是函数的形参可以写成数组的形式。这种形式容易让人误解传递的是数组的值,但是其实是数组的指针。编译器会忽略这里指定的数组长度(可以把一个长度为2或者15的数组传给这个函数),因此这三种形式都等价,形参类型都是int*。


funtion(int (&A)[10]) //通过引用传递数组,如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身,这种情况下,数组大小成为形参和实参类型的一部分,即必须只能给这个函数传递一个数组长度为10 的数组。编译器会检查两者的大小是否匹配。(必须把&A括起来)

 





2)二维数组:数组名也是数组第一个元素的地址。int A{10][10] 举例说明,A[0]是第一行的开始地址。等价于A,&A[0][0]。 A[i]是第i行的地址。

int a[10];
int A[10][10];
cout<<&a<<"\t"<<a<<"\t"<<&a[0]<<endl;(输出一样)
cout<<&A<<"\t"<<A<<"\t"<<A[0]<<"\t"<<&A[0][0]<<endl;(输出一样)

【插】多维数组,除了第一维以外的所有维的长度都输元素类型的一部分。

给一个函数传递数组做形参。 function(int   A[][10]) (必须指定除第一维之外的维的长度)

【插】int *A[10] : array of 10 pointers

int (*A) [10] :a pointer to an array of 10 ints

3)数组名(这个指针)的大小


虽然数组名是一个指针,但又不同于一般的指针。静态申请的数组例如int a[10]这个空间在栈区,sizeof(a)为一个指针大小*数组大小。(这个在编译阶段就知道要占多少空间)

动态申请的数组例如int *b = new int[10],这个空间在堆区,sizeof(b)是一个指针的大小。(这个空间是程序运行过程中分配的)

4.指针和引用的区别


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值