这里对于一维数组就不从下标开始讲起了,直接讲他要注意的点:一维数组的类型为 int [10]
一维数组
int arr[10]={1,2,3,4,5,6,7,8,9,10};
arr //代表数组 首元素 的 地址
&arr //代表 整个数组 的 地址
&arr[0] //代表数组 首元素 的地址
以这个为例子: 一维数组的类型为 int [10] 类型
注意:
虽然 &arr 与 arr 代表的意义不同 但是 他们在内存中的地址是一样的 (很关键,在二维数组中会发现的)
下面我们来验证一下:
因为数组中的 数据保存是在一块连续的空间中的因此我们能看到,这里 int 类型是四个字节 。
arr 为首元素地址 arr + 1 为下一元素的地址 分别对他们 * (解引用) 可以得到他们值
&arr 为整个数组的地址 但是我们能看得出 他与 arr 的 地址 的 值 ,是一样的,但是 &arr + 1 之后跳过的是 40 个字节。由此可见他们的意义完全不同。
二维数组
要知道在计算机中是没有二维这个概念的,二维这个概念是人赋予他的(便于人去理解),计算机实际中他还是一个一维数组 我们可以通过直接打印的方式看出来,他并不会自动去分 行 和 列。
以这个为例子:
(可以看成是 两个元素个数为 3 的一维数组 放在另一个 一维数组里面)
因此 (一维数组){1,2,3} 就是 二维数组 arr 的第一个元素 (一维数组){4,5,6}就是第二个元素。由此我们可以得到要注意的地方与 一维数组 一致。
int arr[2][3]={{1,2,3},{4,5,6}};
arr //二维数组 首元素 的地址
&arr //整个二维数组 的地址
&arr[0] //二维数组 首元素 的地址
下面我们来验证一下
arr 与 &arr 的地址一致,而 arr +1 跳过了12 个字节 ,&arr + 1 跳过了 24 个字节 也就是 跳过了整个 二维数组 ,
那么加入现在我要取 3 这个数应该是这样的 *(*arr+2)
解释:
arr 是二维数组 首元素 的 地址,而 首元素 是一个 (一维数组) ,那么这个首元素的 地址 就是整个 ( 一维数组的地址)所以要对其进行 解引用 操作 拿到这个 一维数组 的 首元素 的 地址 (类似于 *&arr=arr )再加二就可以拿到 2 这个数的地址,对其 解引用 可以 得到 2 这个值了。
从类型上看 arr 的类型是 int (*) [3] 类型 (是一个指针变量),而 *arr 的类型是 int [3] 类型
最后希望这篇文章能帮助到刚学C语言的同学们,如果有错漏的地方也欢迎指出哦!