Доступ к значениям массива с помощью указателей

avatar
Ashu
8 апреля 2018 в 03:51
40
1
0

Я знаю, что *(ptr + 1) передаст мне значение, хранящееся по адресу +1, в ptr. Но я не могу понять, как при использовании его в массиве я получу значение, хранящееся в следующем месте индекса. Например:

int main() {
    int arr1[5] = {1,2,3,4,5};
    char arr2[5] = {'a','b','c','d','e'};
    int i;
    for(i = 0; i < 5; i++)
        cout<<*(arr1 + i);
    cout<<endl;
    for(i = 0; i < 5; i++)
        cout<<*(arr2 + i);
    return(0);
}

Я понимаю, что sizeof(char) равно 1, поэтому arr1+1 должно указывать на следующий индекс. Но как насчет arr2+1, как он будет указывать на следующее значение индекса? Я думаю, что следующий индекс arr2 должен быть +4 начального адреса arr2. Я где-то ошибся?

Источник
xskxzr
8 апреля 2018 в 14:19
1

Возможный дубликат C++ - добавление указателя и размер элемента

Ответы (1)

avatar
Abhishek Chakravarti
8 апреля 2018 в 04:38
-1

Если вы попробуете этот пример программы, возможно, вы получите ответ на свой вопрос:

#include <stdio.h>

int main(void)
{
        int arr1[5]  = { 1, 2, 3, 4, 5 };
        char arr2[5] = { 'a','b','c','d','e' };

        printf("Size of arr1: %d\n", sizeof arr1);
        printf("Size of arr2: %d\n", sizeof arr2);

        printf("Size of (int*): %d\n", sizeof (int*));
        printf("Size of (char*): %d\n", sizeof (char*));
}

Вы заметите, что в первом случае вы получите разные размеры arr1 и arr2. Этого и следовало ожидать, поскольку два массива указывают на разные типы данных.

Однако во втором случае вы заметите, что размеры (int*) и (char*) совпадают. Вот в чем заключается ответ на ваш вопрос: и arr1, и arr2 являются последовательностями указателей на отдельные элементы данных.

Несмотря на то, что arr1 и arr2 указывают на элементы разных типов, они оба представляют собой последовательности указателей одинакового размера. Вот почему увеличение обоих arr1 и arr2 на 1 пункт к соответствующему следующему элементу.

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

eesiraed
8 апреля 2018 в 16:50
1

Это совершенно неправильно, так как массивы не являются последовательностями указателей, если вы специально не объявили их как массивы указателей. Вместо этого они представляют собой последовательности самих объектов. Арифметика указателя просто автоматически масштабируется до размера объекта, на который указывает указатель.