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

来源:互联网 发布:淘宝网试用中心在哪里 编辑:程序博客网 时间:2024/05/01 16:10

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
原创粉丝点击