为什么我得到像这样的数组的长度?

时间:2016-03-09 21:28:27

标签: c pointers

如果我有:

var para = document.getElementsByTagName("p");
for(var i=0; i<para.length; i++){
    para[i].className += " myClass";
}

我得到3,我不明白为什么。

他们总是告诉我数组是一个指针,不存储它的长度,而只是指向第一个元素的指针。

有人能以更好的方式向我解释这个吗?

4 个答案:

答案 0 :(得分:4)

在大多数表达式中,数组衰减到指向数组第一个元素的指针。有两种情况没有,因此结果不一样。

int array[5];
int* ptr = array;   // Array decays to a pointer, OK.

// Same
int a = array[0];
int a = ptr[0];

// Same
void foo(int*);
foo(array);
foo(ptr);

// Not same
size_t s = sizeof(array);  // s is 5*sizeof(int)
size_t s = sizeof(ptr);    // s is sizeof(int*)

// Not same
int (*p1)[5] = &array;     // p1 is a pointer to "an array of 5 ints"
int **p1 = &ptr;           // p1 is a pointer to "an int*"

答案 1 :(得分:4)

sizeof a以存储单元(字节)返回整个数组的大小。 sizeof (int)以存储单位返回单个整数的大小。由于a是一个包含3个整数的数组,sizeof a / sizeof (int)会给你3个。

  

他们总是教我一个数组,它是一个指针

&#34;他们&#34;教你错了。除非它是sizeof或一元&运算符的操作数,否则数组表达式将被转换(&#34; decay&#34;)到指针表达式,并且指针表达式的值将是数组的第一个元素的地址,但是数组 object 不是指针。

当您声明a时,您在内存中看到的内容如下所示:

  +---+
a:|   | a[0]
  +---+
  |   | a[1]
  +---+
  |   | a[2]
  +---+

没有对象a与数组元素分开;任何地方都没有指针。

答案 2 :(得分:3)

  

他们总是教我一个数组,它是一个指针

那是你的问题,就在那里。 当您调用函数并将数组作为参数传递时,它将转换为指向第一个元素的指针。否则,它们就不相同了。特别是,数组具有地址,类型和大小,而指针只有地址和类型。

这是第一次学习C的人之间非常普遍的混淆,甚至一些教科书都错了。

编辑:还有一些其他情况,其中数组“衰减”到指针,通常是在表达式中使用它们时。查看更详尽的治疗方法之一。

答案 3 :(得分:1)

数组可以衰减为指针,但这并不意味着数组是指针。有关详细信息,请参阅this SO question

sizeof返回其操作数的数据类型的大小(以字节为单位)。在这种情况下,数据类型是长度为3的int数组。但是,由于int可以在不同平台上以不同方式表示,因此必须除以sizeof(int)才能获得长度。

有关sizeof的详细信息,请参阅here