一维数组、二维数组与指针的关系以及理解

文章详细探讨了C语言中一维数组和二维数组与指针之间的关系。数组名在C语言中表示数组的首地址,可以等同于首元素的地址。对于一维数组,数组名+1表示指向下一个元素的地址;对于二维数组,数组名+N表示第N行的首地址,数组名[M]+N则指向第M行的第N个元素。此外,文中还阐述了sizeof运算符在不同情况下的应用,以及取数组地址的概念。
摘要由CSDN通过智能技术生成

一维数组、二维数组与指针的关系以及理解


C语言中,关于数组与指针,我们一般理解为:数组名即为该数组首元素地址,也是数组的首地址,但是关于数组名与指针的联系远不止于此。


前言

关于一维数组、二维数组的理解中的数组名以及其各种标识与语句的含义做一个很简单笔记,作为学习总结
使用的环境为Ubuntu18.04,指针变量长度为8字节。


一、一维数组

代码如下(示例):

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{

   int arr[5] = {1,2,3,4,5};
   int *p = arr;

   printf("p            = %p \n",p);
   printf("sizeof(p)    = %ld\n",sizeof(p));
   printf("arr          = %p \n",arr);
   printf("&arr[0]      = %p \n",&arr[0]);
   printf("arr+1        = %p \n",arr+1);
   printf("sizeof(arr)  = %ld \n",sizeof(arr));

   printf("&arr         = %p \n",&arr);
   printf("&arr+1       = %p \n",&arr+1);
   printf("sizeof(&arr) = %ld\n",sizeof(&arr));


   return 0;

}

运行结果为:
在这里插入图片描述
一维数组空间分布方式

在这里插入图片描述

一个int 类型占四个字节空间:
总结:
1.一维数组的数组名可以表示数组首地址(也就是首元素的地址),也可以表示整个数组

2.数组名+N(arr+1),可以理解为给指针加 N, 指针前进“当前指针指向的变量类型的长度 × N,因此, 给指向数组的某个元素的指针加 N 后, 指针会指向 N 个之后的元素

3.&a取得是整个数组的地址!既数组名取地址等价于对数组取地址,.&数组名+N(&arr+1),表示跨越整个数组,直接来到数组末尾元素的下一个地址。

4.sizeof(数组名)与 sizeof(&数组名),前一个所求空间长度是整个数组的长度,后一个所求空间长度是指向整个数组的地址的占用空间长度

二、二维数组

代码如下(示例):

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{

   int arr[2][3] = {1,3,5,7,9,11};

   printf("1   arr          = %p \n",arr);
   printf("2   arr[0]       = %p \n",arr[0]);
   printf("3   arr+1        = %p \n",arr+1);
   printf("4   arr[1]       = %p \n",arr[1]);
   printf("5   arr[1]+1     = %p \n",arr[1]+1);
   

   printf("6   **arr        = %d \n",**arr);
   printf("7   arr[0]       = %d \n",*(arr[0]));

   printf("8   **(arr+1)    = %d \n",**(arr+1));
   printf("9   *(arr[1])    = %d \n",*(arr[1]));
   printf("10  *(arr[1]+1)  = %d \n",*(arr[1]+1));
   printf("11  &arr         = %p \n",&arr);
   printf("12  ***(&arr)    = %d \n",***(&arr));
   printf("13  &arr+1       = %p \n",&arr+1);

   printf("14  sizeof(arr)  = %ld \n",sizeof(arr));
   printf("15  sizeof(&arr) = %ld \n",sizeof(&arr));

   return 0;

}

运行结果:
在这里插入图片描述
先说说一下该二维数组中元素的我们理解排布方式:
在这里插入图片描述
实际的存储方式:
在这里插入图片描述

总结:
1.二维数组的数组名可以表示数组首地址(也就是首元素的地址),也可以表示整个数组

3.数组名[N](arr[N]),理解为第N行的首元素地址,*arr[N] 即对第N行首元素求值。

2.数组名+N(arr+N),可以理解为指针加 N, 指针前进“当前指针指向的变量类型的长度 × N × 每行元素个数,因此, 给指向数组的某个元素的指针加 N后, 指针会指向下行的首元素,**(arr + N)即对第N行首元素求值。

3.数组名[M]+N(arr[M]+N),可以理解为指向从第M行开始的第N个元素,*(arr[M]+N)即对第M行的第N个元素求值

3.&a取得是整个数组的地址!既数组名取地址等价于对数组取地址,.&数组名+N(&arr+1),表示跨越整个数组,直接来到数组末尾元素的下一个地址。

4.sizeof(数组名)与 sizeof(&数组名),前一个所求空间长度是整个数组的长度,后一个所求空间长度是指向整个数组的地址的占用空间长度

总结

‘=’ 表示等效

一维数组a[N]中:
(1)&a = a = &a[0];
(2)a[i] = *(a + i),

二维数组a[M][M]中:
(1)&a = a = a[0] = &a[0][0],
(2)a+1 = a[i] = &a[i][0],
(3)a[i]==&a[i][0] ,a[i] + j= &a[i][j]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值