Ну, ваша программа неверна.
ptr
- это указатель на массив (из 10 символов). Итак, *ptr
- это массив из 10 символов. Поэтому не имеет смысла сравнивать *ptr
с \0
, так как *ptr
не будет нулевым.
При выполнении сравнения *ptr
сначала укажет на «AIZEN», после увеличения его будет указывать на "GINJO" и так далее. Для каждого приращения ptr
, *ptr
будет просто увеличиваться на 10. После 5 приращений вы получаете доступ вне массива, когда вы делаете printf("%s\n",*ptr);
. Это неопределенное поведение, и может произойти все, что угодно.
Попытка этого
while(*ptr != '\0'){
printf("%s\n",*ptr);
printf("%p\n",(void*)ptr);
printf("%p\n",(void*)*ptr);
ptr++;
}
может привести к выводу, подобному этому
AIZEN
0x7ffd162228c0
0x7ffd162228c0
GINJO
0x7ffd162228ca
0x7ffd162228ca
ISHIDA
0x7ffd162228d4
0x7ffd162228d4
PERNIDA
0x7ffd162228de
0x7ffd162228de
GRIMMJOW
0x7ffd162228e8
0x7ffd162228e8
0x7ffd162228f2
0x7ffd162228f2
0x7ffd162228fc
0x7ffd162228fc
0x7ffd16222906
0x7ffd16222906
P@
0x7ffd16222910
0x7ffd16222910
nɜ
0x7ffd1622291a
0x7ffd1622291a
Здесь вы видите, как увеличиваются указатели и что Оператор print генерирует все виды странных вещей (из-за неопределенного поведения, но это также могло привести к сбою программы).
Вы можете изменить свою программу следующим образом:
int main(void) {
char a[][10]={"AIZEN","GINJO","ISHIDA","PERNIDA","GRIMMJOW", ""}; // Notice
// the empty string
// to stop
// the loop
char (*ptr)[10]=a;
while(**ptr !='\0'){ // Notice **
printf("%s\n",*ptr);
printf("%p\n",(void*)ptr);
ptr++;
}
return 0;
}
То есть: 1) добавьте пустую строку в массив и 2) разыменуйте указатель, чтобы проверить NUL (т. е. завершение строки)
Также обратите внимание, что во втором примере (*ptr)[10]!='\0'
также не имеет смысла. Вы получаете доступ к 11-му элементу в массиве (он же строка), но массив состоит всего из 10 элементов.