好的,请考虑C中的以下代码:
int main(int argc, char *argv[])
{
int arr[10];
arr; // This has an address to the first element of arr[10] and is of type int *
&arr; // Has same value as arr but the type is a pointer to an array of [10] ints. Also pointer arithmetic here would be different as compared to arr.
int var; //var is a variable and has an address. &&var --> Doing this would be invalid. If so, then what is arr? Why is &arr allowed?
return 0;
}
我知道这两种表达方式的区别,但我很难理解为什么这两种表达有相同的价值?因此,我有以下两个问题:
arr[0]
有任意位置的0x100
,那么为什么arr
和&arr
具有相同的值呢?编译器究竟如何处理这两个表达式,以及如何在内存中真正实现它们?&arr
的确切用途是什么?既然,arr
已经是一个地址,为什么&
运算符会被允许在上面呢?编辑1:删除了对ptr
& ptr2Array
的引用,因为人们误解了这个问题。
发布于 2015-06-18 19:50:20
ptr
和&arr
的主要区别在于它们是两种不同的指针类型。
考虑到这一点:
*ptr = 10; // Valid
*ptr2Array = 10; // Not valid.
你需要使用:
(*ptr2Array)[0] = 10;
和
ptr + 1 = (void*)ptr + sizeof(int)
ptr2Array + 1 = (void*)ptr2Array + sizeof(arr)
ptr
与ptr+1
之间的数值偏移量为sizeof(int)
。
ptr2Array
与ptr2Array+1
之间的数值偏移量为sizeof(int)*10
。
发布于 2015-06-18 19:51:35
考虑到如果arr的任意位置为0x100,那么为什么arr和&arr具有相同的值?编译器究竟如何处理这两个表达式,以及如何在内存中真正实现它们?
因为数组是一个内存地址。指针是存储另一个对象地址的对象。数组是一个内存地址,在大多数情况下它会退化为指向第一个元素的指针。在这些常见情况之外,使用&
运算符获取其地址。
在3种条件下,数组名称不会衰减为指向其第一个元素的指针:
sizeof
的操作数&
运算符获取。是的,array
和&array
有相同的地址,但正如您所说的,它们有不同的类型。
在C中有&arr的确切用途是什么?既然,arr已经是一个地址,为什么“&”运营商甚至被允许使用它呢?
它和任何其他类型一样都是指针类型。如果要构建指向数组的指针数组,怎么办?它的用法与任何其他指针类型几乎相同。
发布于 2015-06-18 20:33:23
1:
看看排队等什么东西的人。
注意排在第一位的人是如何站在这条线的起点的。
同样的情况也适用于数组的起始位置和第一个元素的位置。
举个例子,下面是一个在内存中布局的4个零char
的数组的草图:
Address: 0x10 0x11 0x12 0x13
Elements: | 0 | 0 | 0 | 0 |
数组的地址0x10与其第一个元素的地址相同。
2:
arr
不是地址,而是值为地址的变量。
&arr
是变量的地址,而不是它的值。
这与int x = 23;
完全一样,&x
不是数字23的地址,而是变量x
的地址。
&&x
是非法的,因为您不能获取值的地址(例如,&(1 + 1)
同样是非法的)。
可以使用数组的地址,例如用于边界安全参数传递:
/* This function only takes pointers to 10-element arrays. */
void foo(int (*x)[10]);
int a[10];
foo(&a); /* OK */
int c[3][10];
foo(&c[1]); /* OK */
int b[11];
foo(&b); /* Doesn't compile */
foo(a); /* Also doesn't compile */
(更正式地说,这个讨论将提到"rvalue“和"lvalue”,而不是"value“和"variable",但我认为这并不能澄清语言之外的任何东西-律师。)
https://stackoverflow.com/questions/30924181
复制相似问题