所以我在这个头文件中有这个数组:
// 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)
第二个元素对吧? 答案 0 :(得分:4)
*ptrToArray
的类型为int
,因此sizeof(*ptrToArray)
与sizeof(int)
相同。所以它不会告诉你关于array1
中元素数量的任何信息。
虽然你可以写*(ptrArray+1)
等,但你应该写ptrToArray[1]
!
答案 1 :(得分:2)
指针不是数组,数组不是指针。方便时,数组可以衰减到指针中,但它仍然是一个完整的类型。
因此,*someIntPointer
的类型是int
,而不是数组,即使该指针恰好指向数组中的第一个元素。 sizeof(someArray)
正如您所期望的那样工作,因为它知道该类型实际上是一个数组。
答案 2 :(得分:0)
sizeof
不会以相同的方式为您的指针行事:您的示例将为您提供数据类型的大小:unsigned int
虽然您可以使用指针算法通过ptrArray
引用元素,但您也可以使用标准数组解除引用:ptrArray[0]
,ptrArrray[1]
,...在大多数情况下,您这样做会更好。
答案 3 :(得分:-2)
Sizeof将返回常规指针类型的指针大小。如果你指定了一个解除引用的指针类型的大小,你将获得该元素的大小(即sizeof(unsigned int))。您需要自己跟踪数组中元素的数量,或者在数组声明中使用sizeof。
至于访问,您可以这样做,但您可以像使用普通数组一样使用括号表示法。
数组是一个特殊的指针类。编译器知道何时将数组视为数组以及何时将其视为指针:这就是它如何知道数组的大小,但是你仍然可以将它传递给期望数组的函数(当你这样做时,你得到指向第一个元素的指针。但是相反的方法不起作用:编译器永远不会将声明为指针的指针视为数组。
顺便说一下,[]
只是简化了指针算术。您可以添加指向int的指针,但您也可以向指针添加int。因此,你可以(但可能不应该)做一些奇怪的事情,比如1[ptrArray]