#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
?&表示常量指针。在这里,如何将一个常量指针设置为非常量指针而不需要类型转换?
数组存储在内存中的哪里?它是存储在数据段中吗?
#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;
}
EDITED:
我看了一些文章,它们指出数组名只有在sizeof
和&
两种情况下才不能被解析为指针。但在上面的程序中,sizeof(&carray)
的大小为4。&carray
衰减为(*)[]carray
,因为它是一个右值。
因此,数组名不能在sizeof
和&
两个条件下衰减为指针的说法在这里不成立。
size_t
类型的值,比如sizeof
的结果,要么使用%zu
(如果编译器支持),要么将该值转换为其他类型并使用适合该类型的格式。%d
需要int
类型的参数,如果给它一个size_t
类型的参数,可能会导致严重错误。要打印指针值,必须将该值转换为(void*)
并使用%p
;不同的指针类型通常不兼容。例如:printf("obj has size %lu and address %p\n", sizeof obj, (void*)&obj);
- Keith Thompsonsizeof(&carray)
的大小为4,并且&carray
会衰减为(*)[]carray
,因为它是一个右值。不,它没有衰减。取地址运算符的结果始终是一个地址。也就是说,虽然carray
是一个数组,但&carray
是它的地址。在您的计算机上,地址可能仅有4个字节长,这可能令人失望。因此,sizeof(&carray)
产生地址大小为4。没有涉及到衰减。我相当确定sizeof(*&carray)
产生20,显示数组大小通过前后传递得到了完好保留。 - Peter - Reinstate Monica