数组 指针 引用 动态数组

因为我本身是学过这些的,这一遍是复习和总结,不会面面俱到,希望和大家一起分享。
1、数组的创建和初始化
1.1、数组是一种完全静态的数据结构,在创建时,数组的维度必须是一个在编译时就可以确定的整形常量表达式(和switch的case后面的表达式那样)。
举个例子:int arr1[2]是合法的,const int cnum=4; int arr2[cnum],
int arr3[cnum+1],都是合法的,const常量在编译时确定了
但是 int num=5;int arr[num],这是不合法的,因为num是个变量,虽然赋值了,但是是可以改变的,在编译时不会确定具体的值。
1.2、初始化方法:一般都用初始化列表,形如:int arr[4]={0,1,2,3},int arr[4]={0,1,2},
int arr[]={1,2,3,4,5,6}.其中列表里面元素个数必须小于等于规定的长度,小于计算机会自动补充值,没有规定长度的话,列表元素个数就是长度。
arr[i]可以获得数组中的元素,这很常见就不多说了。
1.3、 要注意的是,数组不能像vector那样整体赋值vector2=vector1,为什么呢?
因为,我们需要知道,数组是接近底层内存的数据结构,数组名代表了数组第一个元素的内存地址,这是不能作为左值而修改的。

2、指针
首先我们要知道指针也是一种数据类型,和int ,float在某个角度是一样的,只不过它的数据是指向数据的内存地址。
2.1 对于指针来说,最重要就是取地址和解引用:

 int num=3;
 int *ptr=#
 cout<<"指针的值:"<<ptr<<endl;
 cout<<"指针所指的数字是"<<*ptr<<endl

符号&代表取地址操作,赋值给指针,最后一行的*就是解引用,将会得到指针所指的数据。
同样我们可以用指针来遍历数组,只要把数组名赋值给指针,然后遍历数组。

2.2 指针的算术操作:指针可以加减一个数字,但是独特的是,它是与指针类型绑定的,比如,int类型的指针intptr,那么intptr+2,其实就是内存地址加八个字节,因为int的大小是4个字节。
指针还可以相减,得到的结果是该数据类型的个数,也是和数据类型绑定的,但是指针之间不存在加法,因为没有意义,举个例子,门牌号码2,4,相减我们知道他们中间隔着两户人家,但是相加什么都代表不了。

2.3 const指针和指向const对象的指针

const int num =3;
int *ptr=&num//这句是错误的,因为普通指针不能指向const对象
所以我们需要指向const对象的指针:const int *ptr=&num。指向const对象的指针显而易见,他不能修改指向对象的值,但是它本身可以指向其他的地址。

而const指针就是一种不能指向其他地址的指针,比如
int num1=1;
int num2=2;
int *const ptr=&num1;
ptr=&num2;//这句话是错误的,因为已经指向num1不能修改

同时二者可以结合,const int *const ptr,既不能修改值,也不能修改地址

2.4 我们在创建一个指针后,最好初始化让他成为一个空指针,便于调试管理
int *ptr=NULL;如果不初始化,他可能指向未知的地址,可能造成严重后果。

2.5指针的数组和数组的指针
两者看起来相似但是完全不同,指针作为一种变量类型,可以有数组的数据结构,是一种数组;而数组的指针则是一种指向数组的指针。
int arr[3]={0,1,2};
int (*arrptr)[5]=&arr;//数组的指针
int *ptr[3]={&arr[0],&arr[1],&arr[2]};//指针的数组,这里的星号是和int 联系在一起的,代表这个数组存放的是int类型的指针。

3 动态数组
3.1 严格意义上来说不是数组,而是用指针来承载malloc()或new操作符动态分配内存空间,因为c++引入了new delete 比较简洁,就介绍这个了

3.2 动态数组因为是从堆里面随机分配相应的空间,所以就算程序结束,其中占用的空间也不会自动释放,我们必须用delete来释放空间,new和delete是成双成对的。

int *numptr=new int(3)//给3分配一个整形大小的空间
delete numptr;
int *arr=new int[5];
int *ptr=arr//arr相当于数组的名字
delete [] arr;
arr=NULL

3.2 多维数组
我们主要说二维数组,二维数组实质就是一个数组的数组,int arr[3][4]是元素类型为int arr[4],大小是4的数组。并且二维数组在计算机中也是线性排列的,先存第一行,接下来第二行,第三行。。。。
形式如下:int arr[3][4]={ {0,1,2,3},{4,5,6,7},{11,12,13,14}}

4 引用
引用实质就是给变量起了一个别名,必须和某个变量绑定,所以必须初始化,而指针可以为空;
修改这个别名就是修改这个变量本身,而修改指针只是修改它指向的地址。

猜你喜欢

转载自blog.csdn.net/weixin_53344209/article/details/113915813