В чем разница между a[1] и b[1]?

Я учу с указателями. я узнал, что само имя массива является указателем.

int a[5]={ 1 , 2 , 3 , 4 , 5 };
int *b = &a;

Мое понимание:

    a [5] -> a содержит базовый адрес 
рассмотрим a в местоположении 0x100, поэтому a[5] = 0x100 + ( 5 * size_of_integer) = 0x100 + ( 5 * 4) = 0x100 + ( 20) = 0x120

b = &a; // b = 0x100 b[0] = 0x100 b[1] = 0x104

есть ли разница между a [0] и b[0]? (я новичок, я могу ошибаться)

3 ответа

a является int a[5] массив. a указывает на первое (a[0]) элемент. b это указатель на a, Вы можете проверить это, используя код ниже:

#include <stdio.h>

int main()
{

    int a[5] = {1, 2, 3, 4, 5};
    int *b = &a;
    printf("a %p\n", a);         // (1) address of a array.
    printf("a[0] %p\n", &a[0]);  // (2) address of first element of a array
    printf("b %p\n", b);         // (3) address of b

    printf("b[2] %p\n", &b[2]);    // (4) means [address of b] + 2 * sizeof(int)
    printf("a[2] %p\n", &a[2]);    // (5) third element of array

    return 0;
}

(1) = (2) = (3) и (4) = (5)

Также b[0] = 1 не обращаться (0x100 как в вашем примере) и b[1] = 2,

printf("b[0] %d\n", &b[0]);
printf("b[1] %d\n", &b[1]);

msgstr " я узнал, что само имя массива является пуантом ". Никакое имя массива само по себе не является указателем, если оно было указателем того, как оно содержит 5 или более целых чисел. " имя массива" само по себе является константным указателем. поэтому мы не можем выполнить ++. если это был указатель, как вы написали, вы можете выполнить ++, что невозможно.

int a [5] = {1, 2, 3, 4, 5}; int * b = & a;

давайте сравним [2] и b [2], сначала расширим [2].

  as   a[i] = *(a + i)
       a[2] = *(0x100 +2 * 4)
            = *(0x108) 
            = 3

Теперь рассмотрим b [2], давайте расширим его.

b[2] = *(b + 2)
       = *(0x100 +2 * 4) = *(0x108)
       = 3

выходной здесь то же самое, но оба отличаются как

 a++ ; // not possible
 b++ ; // possible

a содержит базовый адрес и &a содержит адрес местоположения, где хранится этот базовый адрес.

Я имею в виду Значение дает вам базовый адрес. если вы используете b = &a (это назначит адрес местоположения, в котором хранится базовый адрес) и b=a (присвойте значение a (которое является базовым адресом массива) в b), так что если вы используете b = a, то b[0] = a[0] в противном случае оба они различны.

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

Другие вопросы по тегам