должен ли & A [1] быть тем же адресом, что и сам A? - PullRequest
0 голосов
/ 11 октября 2018

для следующего кода

//gcc 5.4.0

#include  <stdio.h>
#include  <string.h>
#include  <assert.h>

struct a{
    int a;
};

void change(struct a * a) {
    a->a = 5;
}

int main(void)
{
    struct a * a = malloc(4*sizeof(struct a));
    a[3].a = 2;
    assert(a[3].a == 2);
    change(&a[3]);
    assert(a[3].a == 5);
    printf("Hello, world!\n");
    return 0;
}

почему change(&a[3]); не передает сам адрес change(&a); или change(a);, поскольку не является адресом [3] просто самого себя?

например

a = указатель

3 = индекс 3 указателя

a [3] = структура с индексом 3

& a [3]= адрес структуры> адрес a, в соответствии со структурой a * a, указывает на структуру a, а так как [3] является указателем от a на 3-ю структуру, родительский объект третьей структуры сам по себе

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы должны использовать хорошие методы программирования, как подсказывает @ Rishikesh , взгляните на эту статью в Википедии.

Но, в любом случае, как @ aschelper говорит, что &a[3] - это адрес четвертого элемента массива.

Это так из-за приоритета операторов .Оператор [] имеет больший приоритет, чем оператор &, поэтому C сначала получает четвертый (индекс 3) элемент массива, а затем возвращает его адрес.

0 голосов
/ 11 октября 2018

В вашем коде много a.

  1. A Тип структуры a
  2. Элемент этой структуры, который является целым числом a
  3. Указатель на эту структуру a в основном,Имя указателя также a

Это действительно не очень хороший способ, но вот объяснение каждой строки.

struct a * a = malloc(4*sizeof(struct a));  // Allocate memory to a (no 3) (pointer) of 4 structures . (i.e. 4 structures)
a[3].a = 2;                  //the third structure's element (a) has value 2.
assert(a[3].a == 2);         // Check
change(&a[3]);               // Pass the address of a[3] (third element of structure array to function
                            // Function will change the element a of a[3] to 5
assert(a[3].a == 5);        // verify that a[3].a == 5 
printf("Hello, world!\n");
return 0;
...