int* pInts[ 10 ] ;
Таким образом, элемент pInts[ 0 ] является указателем на переменную типа int . Следовательно, приведённый ниже код корректен:
void fn( )
{
int n1 ;
int* pInts[ 3 ] ;
pInts[ 0 ] = & n1 ;
*pInts[ 0 ] = 1 ;
}
Как и этот:
void fn( )
{
int n1 , n2 , n3 ;
int* pInts[ 3 ] = { & n1 , & n2 , & n3 } ;
for ( int i = 0 ; i < 3 ; i++ )
{
*pInts[ i ] = 0 ;
}
}
И даже этот:
void fn( )
{
int n1 , n2 , n3 ;
int* pInts[ 3 ] = { ( new int ) ,
( new int ) ,
( new int ) } ;
for ( int i = 0 ; i < 3 ; i++ )
{
*pInts[ i ] = 0 ;
}
}
В последнем варианте память под переменные выделяется из кучи.
Массивы указателей чаще всего используются для работы с массивами строк. Приведённые далее примеры показывают, почему это удобно.
Использование массивов строк...124
Допустим, мне понадобилась функция, возвращающая название месяца по его номеру. Например, если этой функции передать число 1, она вернёт название первого месяца — "Январь". Номер месяца будет считаться неправильным, если он окажется меньше 1 или больше 12.
_________________
124 стр. Часть 2. Становимся функциональными программистами
Эту функцию можно написать следующим образом:
/* int2month( ) — возвращает название месяца */
char* int2month( int nMonth )
{
char* pszReturnValue ;
switch( nMonth )
{
case 1 : pszReturnValue = "Январь" ;
break ;
case 2 : pszReturnValue = "Февраль" ;
break ;
case 3 : pszReturnValue = "Март" ;
break ;
/* и так далее... */
default : pszReturnValue = "Неверный номер месяца"
}
return pszReturnValue ;
}

«Операторswitch( ) действует так же, как совокупность операторовif .»
[ Помни! ]
Эту задачу можно решить более элегантно, использовав номер месяца как индекс в массиве указателей, представляющих названия месяцев. Тогда программа приобретёт такой вид:
/* int2month( ) — возвращает название месяца */
char* int2month( int nMonth )
{
/* проверка правильности номера месяца */
if ( nMonth < 1 || nMonth > 12 )
{
return "invalid" ;
}
/* nMonth имеет корректное значение */
/* Вернём имя месяца */
char* pszMonths[ ] = { "Ошибка" ,
"Январь" ,
"Февраль" ,
"Март" ,
"Апрель" ,
"Май" ,
"Июнь" ,
"Июль" ,
"Август" ,
"Сентябрь" ,
"Октябрь" ,
"Ноябрь" ,
"Декабрь" } ;
return pszMonths[ nMonth ] ;
}
Сначала в этой программе проверяется корректность аргумента nMonth , т.е. что его значение лежит в диапазоне между 1 и 12 включительно ( в предыдущей программе проверка производилась, по сути, оператором default ). Если значение nMonth правильное, оно используется как смещение внутри массива, содержащего названия месяцев.
_________________
125 стр. Глава 9. Второе знакомство с указателями

«Такой способ обращения к строкам по индексу особенно полезен при написании программы, работающей на разных языках. Например, массив названий месяцев может инициализироваться во время работы с названиями на разных языках, так чтоptrMonth[ 1 ] всегда будет указывать на январь независимо от используемого языка.»
[ Советы ]
Доступ к аргументам main( )...126
Второй аргумент функции main( ) — массив указателей на строки. Эти строки содержат аргументы, передаваемые программе при вызове. Допустим, я ввёл следующее в командной строке MS DOS:
MyProgram file.txt /w
MS DOS запустит программу, которая находится в файле MyProgram.ехе , и передаст ей как аргументы file.txt и /w . Аргументы, начинающиеся с косой черты ( / ) или дефиса ( - ), обрабатываются операционной системой, как и любые другие: они передаются программе, чтобы та разбиралась с ними сама. Аргументы, которые начинаются с <, >, >>или ||( а иногда и некоторые другие ), представляют особый интерес для операционных систем и программе не передаются.
Аргументы программы являются одновременно аргументами функции main( ) . Переменная pszArgs , передаваемая main( ) , содержит массив указателей на аргументы программы, a nArg — их количество.
Читать дальше