У указателей есть размер? - PullRequest
3 голосов
/ 17 октября 2011

В C ++ при использовании указателя на многомерный массив, например,

int arr[2][5];
int (*p)[5] = arr;

Чем int* отличается от размера с размером, например int (*)[5]?

Ответы [ 7 ]

5 голосов
/ 17 октября 2011

Указатели всегда имеют одинаковый размер для любой конкретной машины (виртуальной или другой). На 32-битной машине указатели имеют ширину 32 бита. На 64-битной машине они имеют ширину 64 бита. Аналогичные правила применяются для более экзотических (по сегодняшним меркам) архитектур.

3 голосов
/ 17 октября 2011

Разница в том, что они бывают разных типов.

int* - указатель на int; int (*)[5] - указатель на массив из 5-ти дюймов. (Программа cdecl полезна для интерпретации объявлений, подобных этим.)

Вполне вероятно (но отнюдь не гарантировано), что они оба будут иметь одинаковый размер и представление. Различие, как и между любыми двумя типами, заключается в операциях, которые могут применяться к объектам этих типов, и значениях этих операций.

В ответ на заголовок "У указателей есть размер?" оператор sizeof говорит вам, что это такое. Но 5 в int (*)[5] не соответствует размеру указателя; это количество элементов в массиве, на которое указывает указатель.

0 голосов
/ 18 ноября 2011

Указатели всегда имеют одинаковый размер для конкретного типа машины.Указатели имеют размер 4 байта на 32-битной машине.Неважно, что он указывает на любой тип данных или массив любого типа данных.Указатель - это переменная, которая содержит адрес любого объекта.

Например:

int main()
{
    int x = 0;
    int * p = &x;

    int arr[2][5];
    int (*pt)[5] = arr;

    cout<<sizeof(p)<<endl;
    cout<<sizeof(pt)<<endl;

    return 0;
}

Вы получите 4 для обоих указателей.

0 голосов
/ 17 октября 2011

Во время выполнения нет никакой разницы.Во время компиляции запоминается, является ли рассматриваемый указатель массивом или нет, а также его размер, и компилятор гарантирует, что никакие неуместные преобразования не будут выполнены.Если я не ошибаюсь, неуместное преобразование в этом случае является преобразованием общего указателя в указатель массива.

Кроме того, как уже говорили другие, во время выполнения размеры указателя зависят от платформы.На ПК они имеют такой же размер, как int: 4 байта на 32-битных платформах, 8 байтов на 64-битных платформах.

0 голосов
/ 17 октября 2011

Ваш 'указатель с размером' является массивом указателей

0 голосов
/ 17 октября 2011

Да, у poiner обычно есть размер int.Вы можете проверить размер с помощью оператора sizeof.Например:

int* p = NULL;
int size = sizeof(p);
printf("size is %d\n",size);
0 голосов
/ 17 октября 2011

Если у вас есть

int *p = /* something */;
int (*q)[5] = /* something */;

Тогда * p является целым числом, но * q является массивом из пяти целых, поэтому (* q) [0] является целым числом.

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