Размер указателя на массив - PullRequest
8 голосов
/ 13 октября 2011

Если у меня есть массив, объявленный так:

int a[3][2];

, то почему:

sizeof(a+0) == 8

, тогда как:

sizeof(a)   == 24

Я не понимаюкак добавление 0 к указателю изменяет вывод sizeof.Может быть, есть неявное приведение типа?

Ответы [ 2 ]

12 голосов
/ 13 октября 2011

Если добавить 0 к a, то a сначала преобразуется в значение указателя типа int(*)[2] (указывающее на первый элемент массива типа int[3][2]).Затем к этому добавляется 0, что добавляет 0 * sizeof(int[2]) байтов к адресу, представленному этим значением указателя.Так как это умножение дает 0, оно даст то же значение указателя.Поскольку это указатель, sizeof(a+0) возвращает размер указателя, который составляет 8 байтов на вашем ящике.

Если вы выполните sizeof(a), у компилятора нет оснований преобразовывать a в значение указателя (это имеет смысл, только если вы хотите индексировать элементы или выполнять арифметику указателей, включающую адресэлементы).Таким образом, выражение a остается типом массива, и вы получаете размер int[3][2] вместо размера int(*)[2].Итак, 3 * 2 * sizeof(int), что на вашем боксе 24 байта.

Надеюсь, это прояснит ситуацию.

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

sizeof сообщает вам размер типа выражения.Когда вы добавляете 0 к a, тип становится указателем (8 байт в 64-разрядных системах).

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