数组(一维、二维、多维)与指针的关系与区别总结

数组用于同种数据类型的存储,常规的数组选取的是一块连续内存空间来存储同种类型的数据。

1、  静态数组

静态数组是在声明时已经确定子数组大小的数组,即数组元素的个数固定不变。在编译期间在栈中分配好内存的数组,在运行期间不能改变存储空间,运行后由系统自动释放

数组的声明

int a[10]; float b[5]={};double c[]={1,2,3};

尤其注意下面这种数组声明是错误的,int num; char a[num]; 即使在前面是int num=5也是错的,无法明确数组的大小,导致编译失败,num必须是常量或常量表达式。

例如const int num=5;或者在前面对num进行宏定义。

修改后:

2、  动态数组

动态数组是指在声明时没有确定数组大小的数组,即忽略圆括号中的下标;当要用它时,可随时用ReDim语句重新指出数组的大小。使用动态数组的优点是可以根据用户需要,有效利用存储空间。最大的特点是在程序运行后才分配内存的数组需要人工手动去创建和释放。

(1)一维数组

C语言:利用malloc()函数来声明数组空间 利用free()函数来释放声明空间

C++语言:利用new()函数来声明数组空间 利用delete()函数来释放声明空间


(2)二维数组

在c中 


在c++中:


3、  数组与指针

(1)一维数组 int a[10]={};

我们需要知道的一点就是一维数组名表示的是存储的首地址其次a[i]=*(a+i),a+i代表的是第i个元素的地址,等于第一个元素的地址+i*sizeof(数组类型)。

(2)二维数组

二维数组可以理解为是一个特殊的一维数组,它的每一个元素也都是一维数组。

例:

二维数组a[3][2]可以理解为一个特殊的一维数组,其中每一个元素都是一个一维数组,如a[0][2]实际包含两个元素a[0][0]和a[0][1]。

如图可得到以下结论:

(1)a+i指向a[i][2]: a为数组a[3][2]的首地址,特殊的一维数组包含3个元素a[0][2],a[1][2],a[2][2]。由一维数组的性质“首地址+i”得到的是第i个元素的地址,所以a+i指向特殊一维数组的第i个元素。

(2)a[i]指向a[i][0]: 特殊的一维数组的每个元素又都是一个数组,如a[0][2]实际包含两个元素a[0][0]和a[0][1]。a[0]相当于一维数组名,指向首元素 a[0][0],所以a[i]指向a[i][0],a[i]+j指向a[i][j]。

从图中看似a+i和a[i]指向的都是a[i][0],其实不然。a+i指向的是a[i],因为a[i]=*(a+i),这个比较难理解的。

a[i]的确指向的是a[i][0],但a+1取值后仍然是一个地址指向a[i][0]。

可以这样理解,a+i指向的是特殊一维数组的第i个元素,第i个元素还是一个一维数组。*(a+i)直面的意思是想取出第i个元素的内容,但a+i所指空间还是个数组,难道*(a+i)直接就能将整个数组取出来?要知道数组都是通过下标一个个进行访问的,不能整体获得。所以*(a+i)只是获得这个数组空间首元素的地址,这样就可以通过下标对内容进行访问。

最后总结一下:

对于二维数组a[3][2],若看成3行2列的形式。

(1)a+i指向第i行,此时还没有获得第i行元素首地址,没有办法访问其中的元素

(2)*(a+i)或a[i]指向第i行首元素,获得第i行元素的首地址。

(3)a[i]+j指向第i行第j个元素,可以通过a[i]第i行元素的首地址访问各个元素。关键是要记住a[i]=*(a+i),   a[i][j]=*(*(a+i)+j)。

 

同理针对三维数组,我们同理可以得到a[i][j][k]=*( (*(*(a+i)+j))+k),甚至可以推广到多维。

(3)一维数组名arr与普通指针ptr的区别

1、  数组名取地址得到的是数组名所指元素的地址,而对指针取地址得到的是指针变量自身的地址。即对于数组名arr而言,arr==&arr==arr[0],对于普通指针ptr,一般ptr!=&ptr;

2、  数组名是常量指针,指针是变量指针。即数组名不能为左值,普通指针则可以。

3、  Sizeof(arr)此时的大小不是4而是4*数组元素的个数

Sizeof(ptr)的结果为4

同时我们需要注意一点就是,指针偏移问题

通过例子我们可以发现&arr+1实际上偏移了16个字节,而&ptr+1只是偏移了4个字节。

(4)二维数组名a与指针

  虽然在数值上表现的相同,但是二维数组名的类型是数组数组,即int (* arr)[3]=a;

故用int * ptr=a则会报错,而int *ptr=a[0]=&a[0]则正确。

参考链接:

https://blog.csdn.net/my_mao/article/details/23795319

https://blog.csdn.net/hyqsong/article/details/51635368

https://blog.csdn.net/findgeneralgirl/article/details/78501734


猜你喜欢

转载自blog.csdn.net/xiaomu_347/article/details/80727499