一维数组、二维数组与指针的关系以及理解
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]