1

所以我在这样的头文件中有这个数组:

// header.h
static const unsigned int array1[]={0x00,0x01,0x02,0x03};

和:

// file.c
main()
{
     unsigned int *ptrToArray;

     ptrArray = &array1[0];
 }

如果我错了,请纠正我。我假设:找到数组元素的字节数,而不是sizeof(array1)等价的sizeof(*ptrArray),对吧?

并且要访问数组的元素,而不是array[i],现在将是:

  • *(ptrArray)对于第一个元素,
  • *(ptrArray+1)对于第二个元素,对吗?
4

4 回答 4

4

的类型*ptrToArrayint,因此sizeof(*ptrToArray)与 相同sizeof(int)。所以它不会告诉你任何关于array1.

虽然你可以写*(ptrArray+1),等等,但你应该写ptrToArray[1]

于 2012-07-17T18:16:41.367 回答
2

指针不是数组,数组也不是指针。数组可以在方便的时候衰减为指针,但它仍然是一个完整的类型。

因此, 的类型*someIntPointerint,而不是数组,即使该指针恰好指向数组中的第一个元素。 sizeof(someArray)正如你所期望的那样工作,因为它知道类型实际上是一个数组。

于 2012-07-17T18:20:38.117 回答
0

sizeof 指针的行为方式不同:您的示例将为您提供数据类型的大小: unsigned int

虽然您可以使用指针算法通过 引用元素ptrArray,但您也可以使用标准数组解引用:ptrArray[0], ptrArrray[1], ... 在大多数情况下,您最好这样做。

于 2012-07-17T18:18:50.707 回答
-2

Sizeof 将返回常规指针类型的指针大小。如果您对取消引用的指针类型进行 sizeof,您将获得元素的大小(即 sizeof(unsigned int))。您需要自己跟踪数组中的元素数量,或者在数组声明中使用 sizeof。

至于访问,您可以这样做,但您可以像使用普通数组一样使用括号表示法。

数组是一类特殊的指针。编译器知道何时将数组视为数组以及何时将其视为指针:这就是它知道数组有多大的方式,但您仍然可以将它传递给期望数组的函数(当您这样做时,您会得到指向第一个元素的指针)。然而,这同样不能反过来工作:编译器永远不会将声明为指针的指针视为数组。

顺便说一句,[]只是简化为指针算术。您可以将指针添加到 int,但也可以将 int 添加到指针。因此,您可以(但可能不应该)做一些奇怪的事情,例如1[ptrArray]

于 2012-07-17T18:17:58.210 回答