Массивы распадаются на указатели - PullRequest
5 голосов
/ 11 сентября 2011

Пожалуйста, помогите мне понять программы ниже.

#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 и & становится здесь ложным.

Ответы [ 3 ]

5 голосов
/ 11 сентября 2011

&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 th в вашем массиве.*a в этом случае совпадает с a[0], который является первым элементом в вашем массиве (который является указателем).

a=v //why this gives error

Поскольку a (в вашем последнем примере) является указателем на массив.Вы хотите присвоить a, затем вам нужно назначить адрес массива v (или любого другого массива с правильными размерами);

a = &v;

Это очень хорошо, что вы зафиксировалик пониманию вещей, но ничто не поможет вам лучше, чем хорошая книга C .

Надеюсь, это поможет.

0 голосов
/ 11 сентября 2011

Вещи, которые вам нужно знать при работе с указателями:

int *a and int a[]

- это объявление массива, единственная разница в том, что в [] вам нужно будет объявить его постоянный размер, * a дает вам гибкость, он может указывать на размер массива от 1 до бесконечности

int *a[] and int **a

является объявлением Array of Array, иногда называемым Matrix, единственная разница в том, что в * 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

спросите меня, что еще вы хотите знать, и плохо отредактируйте этот ответ.

0 голосов
/ 11 сентября 2011

& a [1] и & a + 1.Являются ли они одинаковыми или разными?

Не так ли, первое относится ко второму целому числу в массиве, называемому a, второе относится к целому числу, построенному из байтов sizeof (int), начинающихся срасположение памяти в байте + 1.

Я хотел бы знать, как * a [5] представляется в памяти. Does * a является базовым указателем, который указывает на [0], a [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, что совпадает)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...