如果我有:
var para = document.getElementsByTagName("p");
for(var i=0; i<para.length; i++){
para[i].className += " myClass";
}
我得到3,我不明白为什么。
他们总是告诉我数组是一个指针,不存储它的长度,而只是指向第一个元素的指针。
有人能以更好的方式向我解释这个吗?
答案 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。