Пожалуйста, помогите мне понять программы ниже.
#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; // gives error why?
превращает 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;
}
РЕДАКТИРОВАНИЕ:
Я просмотрел некоторые статьи, в которых говорилось, что только две возможныеситуации, когда имя массива не может быть выведено в указатель, это sizeof
и &
.Но в приведенной выше программе sizeof(&carray)
дает размер как 4. и &carray
распадается на (*)[]carray
в качестве значения.
Тогда утверждение, что имя массива не может быть разложено на указатели при двух условиях sizeof
и &
становится здесь ложным.