请帮助我理解下面的程序。
#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;
}
&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;
}
我想知道 *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;
}
a=v;//给出错误原因?
此处的 v
是否衰减为 *v
。那么 &v
是否会退化为 (*)[]v
? & 表示常量指针。在这里,如何在不进行类型转换的情况下将 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;
}
已编辑:
我看过一些文章,其中指出数组名称不能被解码为指针的唯一两种可能情况是 sizeof
和 &
。但在上面的程序中,sizeof(&carray)
给出的大小为 4。&carray
衰减为 (*)[]carray
作为其右值.
那么在 sizeof
和 &
这两个条件下数组名不能衰减为指针的声明在这里变为假。
最佳答案
&a[1]
and&a+1
. Are they same or different?
不同。 &a[1]
等同于(a+1)
。一般来说,x[y]
根据定义等同于 *(x+y)
。
I wanted to know how
*a[5]
is represented in memory. Does*a
is a base pointer that points toa[0],a[1],a[2],a[3],a[4]
.
在您的第二个示例中,a
是一个指针数组。 *a[i]
是对象的值,其地址存储为数组中的第 ith 元素。 *a
在这种情况下与 a[0]
相同,它是数组中的第一个元素(它是一个指针)。
a=v //why this gives error
因为 a
(在你的最后一个例子中)是一个指向数组的指针。你想赋值给a
,那么你需要赋值数组v
(或任何其他具有正确维数的数组)的地址;
a = &v;
这很好,您致力于理解事物,但没有什么比 a good C book 更能帮助您了.
希望这对您有所帮助。
关于c - 数组退化为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7378555/