数组衰减成指针

请帮我理解下面的程序。

#include 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; } 

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

 #include  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; } 

我想知道*a[5]如何在内存中表示。 *a一个指向a[0],a[1],a[2],a[3],a[4]的基指针?

 #include int main() { int v[10]; int **p; int (*a)[10]; a=&v; printf("%d\n",*a); return 0; } 

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

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

 #include 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; } 

编辑:

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

然后声明数组名称不能在两个条件sizeof&变为false的情况下衰减成指针。

&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 ,那么您需要分配数组v的地址(或任何其他具有正确尺寸的数组);

 a = &v; 

这是非常好的,你已经承诺理解的东西,但没有什么比一本好的C书更能帮助你。

希望这可以帮助。

在处理指针时你需要知道的是:

 int *a and int a[] 

是一个数组的声明,唯一的不同之处在于,在[]中你必须声明它的常量大小,* a给你灵活性,它可以指向一个数组大小为1到无穷大

 int *a[] and int **a 

是一个数组数组的声明,有时称为矩阵,唯一的差异在于* a []你必须声明有多少数组a []将包含指针,** a给你灵活性,它可以指向您希望将其分配给的任何数组数组。

概述:在向变量添加&时,在类型定义中添加*:

int a;

&a – >&(int)= int *

将*添加到变量时,从类型定义中删除*

int * a;

* a – > *(int *)= int

 int *a; &a - the Address given to the pointer a by the system(pointer of pointer = **a) &a+1 - the Address to the beginning of the array + 1 byte &a[1] == &(a+1) - the Address to the beginning of the array + 1 size of int int **a; *a == a[0] - the Address of the first Array in the array of arrays a *a[0]==a[0][0] - the first int of first array int *a, b[5]; *a=*b - ERROR because a points at garbage to begin with a=b - a points at array b 

问我还想知道什么,生病编辑这个答案。

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

不是它们不是,第一个引用数组中的第二个整数,称为a,第二个引用从sizeof(int)字节构建的整数,从内存位置开始,位于+ 1个字节。

我想知道* a [5]如何在内存中表示。* a *是指向[0],[1],a [2],a [3],a [4]的基指针。

a现在是指向在大小为5的堆栈上声明的数组中第一个元素的位置的指针。&a指向与&a [0]相同的东西; &a [1]指向&a + sizeof(int)。

A = V; //给出错误原因? 在这里v衰变成* v。

这会给您一个错误,因为a是指向数组的指针,而v是数组。 因此,您必须将v(&v)的地址分配给a。

在这里v衰变成* v

数组永远不会衰落到它的第一个元素。 决不。 v可以衰减到&v[0] (与&*v相同)但从不到v[0] (或*v ,它是相同的)