首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果arr是T类型的数组,那么&arr的用途是什么?

如果arr是T类型的数组,那么&arr的用途是什么?
EN

Stack Overflow用户
提问于 2015-06-18 19:31:48
回答 4查看 390关注 0票数 1

好的,请考虑C中的以下代码:

代码语言:javascript
运行
复制
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;
}

我知道这两种表达方式的区别,但我很难理解为什么这两种表达有相同的价值?因此,我有以下两个问题:

  1. 考虑到如果arr[0]有任意位置的0x100,那么为什么arr&arr具有相同的值呢?编译器究竟如何处理这两个表达式,以及如何在内存中真正实现它们?
  2. 在C中拥有&arr的确切用途是什么?既然,arr已经是一个地址,为什么&运算符会被允许在上面呢?

编辑1:删除了对ptr & ptr2Array的引用,因为人们误解了这个问题。

EN

回答 4

Stack Overflow用户

发布于 2015-06-18 19:50:20

ptr&arr的主要区别在于它们是两种不同的指针类型。

考虑到这一点:

代码语言:javascript
运行
复制
*ptr = 10; // Valid
*ptr2Array = 10; // Not valid.

你需要使用:

代码语言:javascript
运行
复制
(*ptr2Array)[0] = 10; 

代码语言:javascript
运行
复制
ptr + 1 = (void*)ptr + sizeof(int)
ptr2Array + 1 = (void*)ptr2Array + sizeof(arr)

ptrptr+1之间的数值偏移量为sizeof(int)

ptr2Arrayptr2Array+1之间的数值偏移量为sizeof(int)*10

票数 1
EN

Stack Overflow用户

发布于 2015-06-18 19:51:35

考虑到如果arr的任意位置为0x100,那么为什么arr和&arr具有相同的值?编译器究竟如何处理这两个表达式,以及如何在内存中真正实现它们?

因为数组是一个内存地址。指针是存储另一个对象地址的对象。数组是一个内存地址,在大多数情况下它会退化为指向第一个元素的指针。在这些常见情况之外,使用&运算符获取其地址。

在3种条件下,数组名称不会衰减为指向其第一个元素的指针:

  1. 它是sizeof的操作数
  2. 它的地址由&运算符获取。
  3. 它是一个字符串文本。

是的,array&array有相同的地址,但正如您所说的,它们有不同的类型。

在C中有&arr的确切用途是什么?既然,arr已经是一个地址,为什么“&”运营商甚至被允许使用它呢?

它和任何其他类型一样都是指针类型。如果要构建指向数组的指针数组,怎么办?它的用法与任何其他指针类型几乎相同。

票数 0
EN

Stack Overflow用户

发布于 2015-06-18 20:33:23

1:

看看排队等什么东西的人。

注意排在第一位的人是如何站在这条线的起点的。

同样的情况也适用于数组的起始位置和第一个元素的位置。

举个例子,下面是一个在内存中布局的4个零char的数组的草图:

代码语言:javascript
运行
复制
Address:   0x10 0x11 0x12 0x13
Elements: | 0  | 0  | 0  | 0  |

数组的地址0x10与其第一个元素的地址相同。

2:

arr不是地址,而是值为地址的变量。

&arr是变量的地址,而不是它的值。

这与int x = 23;完全一样,&x不是数字23的地址,而是变量x的地址。

&&x是非法的,因为您不能获取值的地址(例如,&(1 + 1)同样是非法的)。

可以使用数组的地址,例如用于边界安全参数传递:

代码语言:javascript
运行
复制
/* 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",但我认为这并不能澄清语言之外的任何东西-律师。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30924181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档