c语言(8.10)

#include<stdio.h>

int main()

{

int arr1[3] = { 1,2,3 };

int arr2[5] = { 1,2,3,4,5 };

int arr3[9] = { 1,2,3,4,5,6,7,8,9 };

int* arr[3] = { arr1,arr2,arr3 };定义指针数组的时候已经退化了,通过arr[i]只能取到三个退化后的指针

for (int i = 0; i < 3; i++)

{

int len = sizeof(*arr[i]) / sizeof(int);

for (int j = 0; j < len; j++)

{

printf("%d\n", arr[i][j]);

}

}

return 0;

}

确实,我之前的解释中关于 sizeof(*arr[i]) 的部分有些误导。让我澄清一下。

在 C 语言中,当你有一个指向数组的指针(如 int* arr[3] 中的 arr[i]),这个指针实际上存储的是数组首元素的地址,而不是整个数组本身。因此,*arr[i] 解引用后得到的是数组 arr1、arr2 或 arr3 的第一个元素,它是一个 int 类型的值,而不是一个数组。

然而,这里的关键点是 sizeof(*arr[i]) 实际上计算的是 int 类型的大小,而不是 arr[i] 所指向的数组的总大小或长度。这是因为 *arr[i] 的类型是 int,而不是数组类型。在 C 语言中,数组名在表达式中通常会被转换为指向其首元素的指针,但这并不意味着你可以通过指针来直接获取数组的大小。

因此,sizeof(*arr[i]) / sizeof(int) 总是等于 1,因为它实际上是在计算一个 int 类型的大小除以另一个 int 类型的大小,这自然得到 1。

为了获取数组的长度,你通常需要以某种方式显式地传递或存储这个信息,就像我之前提到的那样,使用一个额外的数组来存储每个数组的长度。

总结一下,sizeof(*arr[i]) 计算的是 int 类型的大小,而不是 arr[i] 所指向的数组的总大小或长度。在 C 语言中,一旦数组名被用作指针(例如在表达式中),它就失去了其原始数组类型的信息,只保留了指向其首元素的指针类型的信息。

arr[1]到底指向的是第一个数组,还是指向第一个数组的第一个元素?

arr[1] 在这个上下文中并不指向"第一个数组"或"第一个数组的第一个元素"。实际上,arr 是一个指向 int 类型的指针数组,即 arr 的每个元素都是一个指向 int 的指针。在这个例子中,arr 被初始化为包含三个指针,分别指向 arr1、arr2 和 arr3 这三个数组的首元素。

具体来说:

  • arr[0] 指向 arr1 数组的首元素(即值为 1 的那个 int)。
  • arr[1] 指向 arr2 数组的首元素(即值为 1 的那个 int)。
  • arr[2] 指向 arr3 数组的首元素(即值为 1 的那个 int)。

这里的关键是理解指针和数组之间的关系。在 C 语言中,数组名(如 arr1、arr2、arr3)在大多数情况下会被当作指向其首元素的指针。但是,当数组名作为数组声明的一部分时(如在定义数组时),或者作为 sizeof 运算符的操作数时,或者作为 & 运算符的操作数时,它表示整个数组。

然而,在 arr 数组的上下文中,arr1、arr2 和 arr3 被用作初始化指针数组 arr 的元素的值,因此它们被当作指向各自数组首元素的指针。

所以,arr[1] 指向的是 arr2 数组的首元素,而不是整个 arr2 数组或 arr2 数组的第一个数组(后者在逻辑上是不成立的,因为 arr2 本身就是一个数组,而不是包含数组的数组)。

在指针数组中(一维数组),指针指向的是数组中第一个元素的地址,

例如:

int* p=arr

arr[3]={1,2,3}

p指向元素1

同理,在二维指针数组中,指针指向的是第一个数组的地址,&arr,而不是第一个数组的第一个元素的地址,其实第一个数组的地址和第一个数组的第一个元素的地址是一样的,只不过步长不一样

就是说p是二级指针,*p是一级指针指向一维数组里面的元素,即*p=arr1,再解引用,**p才是一维数组里面的具体值

p的类型是int[5]所以p+1就直接到第二行了(11),*p的类型是int,*p+1指向2,p和*p的步长不一样

相关推荐
半盏茶香几秒前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
忘梓.1 小时前
解锁动态规划的奥秘:从零到精通的创新思维解析(3)
算法·动态规划
️南城丶北离1 小时前
[数据结构]图——C++描述
数据结构··最小生成树·最短路径·aov网络·aoe网络
✿ ༺ ོIT技术༻1 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++
suweijie7682 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿3 小时前
List深拷贝后,数据还是被串改
java
tinker在coding3 小时前
Coding Caprice - Linked-List 1
算法·leetcode
xlsw_6 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹7 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭7 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员