2014-11-11 4 views
1

Я смущен о массиве SizeOf строки в C++, я следующая строка массива:SIZEOF массив строк в C++

static const char* namedButtonStr[] = { 
     "GLUT_LEFT_BUTTON", 
     "GLUT_MIDDLE_BUTTON", 
     "GLUT_RIGHT_BUTTON" 
}; 

И получить размер этого массива, используется следующий код:

int size = int(sizeof(namedButtonStr)/sizeof(namedButtonStr[0])); 

Где sizeof(namedButtonStr) 12, sizeof(namedButtonStr[0]) является 4, а размер массива 12/4 = 3.

Мой вопрос, почему sizeof(namedButtonStr) 12 и sizeof(namedButtonStr[0]) - 4? Мое понимание sizeof(namedButtonStr) is 3 и sizeof(namedButtonStr[0]) is 17 («GLUT_LEFT_BUTTON» имеет 17 символов).

+1

Если вы пишете на C++, почему бы не написать реальный C++, и использовать что-то вроде: 'станд :: вектор namedButtons = { "GLUT_LEFT_BUTTON", "GLUT_MIDDLE_BUTTON", "GLUT_RIGHT_BUTTON"}; '. В этом случае количество строк - это просто 'namedButtons.size()'. –

+2

'namedButtons' - это массив указателей, а не массив строк. Каждый элемент указывает на первый символ строки. –

+0

@Hi, я новичок в C++, я изучаю «OpenGL», этот код пришел от моего учителя, должна быть причина, по которой он создал такой массив строк, можете ли вы это объяснить? – Tom

ответ

6

namedButtonStr[0] имеет тип const char*, поэтому его sizeof - это размер указателя, а не массив, на который он указывает.

namedButtonStr, напротив, представляет собой массив, поэтому его sizeof является байетитом всего массива, то есть 3 * sizeof(<one item in the array>).


Редактировать: Кстати, это довольно стандартная идиома для определения размера массива, вы увидите ее часто.

2

На мой вопрос: почему sizeof(namedButtonStr) составляет 12 и sizeof(namedButtonStr[0])? Мое понимание sizeof(namedButtonStr) is 3 и sizeof(namedButtonStr[0]) is 17 («GLUT_LEFT_BUTTON» имеет 17 символов).

namedButtonStr будет содержать 3 указателя. (В общем, указатель C имеет 4 байта, это может измениться по мере того, как становятся 64-битными шинами вместе с 64-битными компиляторами.)

Итак, 3 указателя * 4 (байт на указатель) = 12 байт.

namedButtonStr[0] относится к одному/первому из этих трех указателей, и, как указано выше, каждый указатель имеет 4 байта.

В результате 12/4 = 3