【问题标题】:Finding length of array and length of array with pointer pointing to it使用指向它的指针查找数组的长度和数组的长度
【发布时间】:2023-03-09 08:04:02
【问题描述】:
int a[17];
size_t n = sizeof(a) / sizeof(int);

在 C 中,最常见的是找到这样的数组长度,这很清楚。但我的问题是以下内容不起作用:

int days[] = {1,2,3,4,5};
int *ptr = days;
size_t n = sizeof(ptr) / sizeof(int);

我想这里发生的是 ptr 只是一个普通的 8 字节地址,指向数组的第一个元素,所以它不会给我们数组的实际长度。但在第一个例子中,sizeof(a), a 也只是一个指向数组第一个元素的指针。那么这里有什么区别,为什么一个有效而另一个无效?

【问题讨论】:

  • 与某些人所说的相反,数组不是指针。
  • "...a 也只是一个指向数组第一个元素的指针" 不,不,不... a 不是 指针-这是一个数组。 ptr 是一个指针,但 days 是一个数组
  • aint[17] 类型,编译器静态知道;这种类型在许多情况下衰变int*,但不是全部,sizeof 是非衰变情况之一。编译器一般不知道ptr 指向什么。 (在这个例子中,优化编译器可能会推断它指向长度为 5 的数组 days,但想象一下,如果 ptr 在初始赋值和 sizeof ptr 之间以各种复杂的方式发生变化。)

标签: arrays c pointers implicit-conversion


【解决方案1】:

我想这里发生的是 ptr 只是一个普通的 8 字节 地址指向数组的第一个元素,所以它不会给出 我们是数组的实际长度

你是对的。:)

但是在第一个例子中,sizeof(a),a也只是一个指向的指针 到数组的第一个元素。那么这里和有什么区别 为什么一个有效而另一个无效?

除了将它们用作运算符sizeof 或运算符& 的操作数之外,数组指示符将转换为指向它们在表达式中的第一个元素的指针。

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

3 除非它是 sizeof 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有“类型数组”类型的表达式被转换为 类型为“类型指针”的表达式,指向初始 数组对象的元素并且不是左值。如果数组对象 有注册存储类,行为未定义。

所以在这个表达式中

sizeof(a)

数组a 未转换为指针。

如果你会写例如

sizeof( a + 0 )

然后你会得到一个指针的大小。

【讨论】:

    【解决方案2】:

    在第一种情况下,您有一个数组。 sizeof(a) 给出存储它所需的字节数。

    在第二种情况下,您有一个指针。 sizeof(ptr) 给出存储指针所需的字节数(取决于架构,通常为 4 或 8)。

    编译器知道数组的大小,但不知道一个指针指向了多少个元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      相关资源
      最近更新 更多