数组衰减成指针

Ang*_*gus 5 c

请帮我理解下面的程序.

#include<stdio.h>
int main()
{
    int a[7];
    a[0] = 1976;
    a[1] = 1984;
    printf("memory location of a: %p", a); 
    printf("value at memory location %p is %d", a, *a); 
    printf("value at memory location %p is %d", &a[1], a[1]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

&a[1]&a+1.它们是相同还是不同?

#include <stdio.h> 
int main() 
{
    int v[10];
    int **p; 
    int *a[5];
    v[0] = 1234;
    v[1] = 5678;
    a[0] = v; 
    a[1] = v+1;
    printf("%d\t%d\t%d\t%d\n", *a[0],*a[1],a[0][0],**a);
    printf("%d\n", sizeof(v));
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

我想知道*a[5]在记忆中是如何表现的.是*a指向的基指针a[0],a[1],a[2],a[3],a[4]吗?

#include<stdio.h>

int main()
{
    int v[10];
    int **p;
    int (*a)[10];
    a=&v;
    printf("%d\n",*a);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

a=v; // gives error why?确实v在这里腐烂成*v.那&v会腐烂(*)[]v吗?&表示const指针.在这里,如何在没有类型转换的情况下将const指针设置为非const指针?

数组在哪里存储在内存中.它是否存储在内存的数据段中.

#include<stdio.h>

int main()
{
    int carray[5]={1,2,3,4,5};
    printf("%d\n",carray[0]);
    printf("%d\t%d\t%d\n",sizeof(carray),sizeof(&carray),sizeof(&carray[0]));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我已经阅读了一些文章,其中说明了数组名称不能被指定为指针的唯一两种可能情况是sizeof&.但是在上面的程序中sizeof(&carray),大小为4.并且&carray衰减为(*)[]carrayrvalue.

然后声明数组名称不能在两个条件下衰减为指针sizeof&在此处变为false.

Arm*_*yan 5

&a[1]&a+1.它们是相同还是不同?

不同.&a[1]是一样的(a+1).一般来说,x[y]按定义相当于*(x+y).

我想知道*a[5]在记忆中是如何表现的.确实*a是基类指针指向a[0],a[1],a[2],a[3],a[4].

在第二个示例中,a是一个指针数组.*a[i]是对象的值,其地址存储为数组中的 i 元素.*a在这种情况下a[0],它是相同的,它是数组中的第一个元素(它是一个指针).

a=v //why this gives error

因为a(在上一个例子中)是一个指向数组的指针.您想要分配a,然后您需要分配数组的地址v(或任何其他具有正确尺寸的数组);

a = &v;
Run Code Online (Sandbox Code Playgroud)

这是非常好的,你已经致力于理解事物,但没有什么比一本好的C书更能帮助你.

希望这可以帮助.