当我向数组名称添加一些内容并尝试访问其内存位置时会发生什么?

What happens when I add something to Array name and try to access its memory location?

int i, paneerRoll[5]={89,45,35,2,3};
    printf("Element \t Address \t\t Value\n");
    for(i=0; i<5; i++)
    {
        printf("paneerRoll[%d] \t %p \t %d\n",i,&paneerRoll[i],paneerRoll[i]);
    }

    printf("\n\n\npaneerRoll \t %p \t %d\n",&paneerRoll,*paneerRoll);
    printf("(paneerRoll+2) \t %p \t %d",&paneerRoll+2,*(paneerRoll+2));

这部分

printf("(paneerRoll+2) \t %p \t %d",&paneerRoll+2,*(paneerRoll+2));

我的输出是

** (paneerRoll+2) 000000000061FE08 35 **

不等于数组任何元素的内存位置。 那么这是什么地址?

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

3 Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type ‘‘array of type’’ is converted to an expression with type ‘‘pointer to type’’ that points to the initial element of the array object and is not an lvalue. If the array object has register storage class, the behavior is undefined.

所以在这个表达式中

*(paneerRoll+2)

数组指示符 paneerRoll 被转换为指向数组第一个元素的指针。表达式 paneerRoll + 2 指向数组的第三个元素。取消引用表达式 *(paneerRoll+2) 你得到数组第三个元素的左值。

至于这个表达

&paneerRoll+2

则子表达式&paneerRoll的类型为int ( * )[5],值为所占用的内存范围地址(与数组首元素地址相同的地址)按数组。

使用表达式

&paneerRoll+2

你得到的地址是像( char * )paneerRoll + 2 * sizeof( int[5] )这样计算的,它远离分配的数组