Неопределенное поведение
Давайте разберем это:
int arr[5] = {8,2,9,4,5},a,b,*ptr;
int c = 5;
ptr = arr; // ptr = address of arr[0]
a = *ptr + 10; // a = (arr[0] + 10) = (8 + 10) = 18
ptr = &c; // ptr = address of c
ptr += 2; // UNDEFINED BEHAVIOR, c is not an array
cout<<*(ptr+1); // COULD PRINT ANYTHING
Не то, что мы установили неопределенное поведение, юристы по языку не могут подать в суд на меня, чтобы объяснить что может происходить:
Переменные main
возможно складываются в стек следующим образом. Для этого простого примера удобно, чтобы элементы в стеке были целыми числами:
0x100 c
0x104 arr[0]
0x108 arr[1]
0x10C arr[2]
0x110 arr[3]
0x114 arr[4]
0x118 a
0x11C b
0x120 ptr // address of the variable ptr, not what ptr points to
Следовательно, ptr+2
- это тот же адрес, что и arr [1] в массиве, который содержит значение "2 ». И тогда дополнительным выражением (ptr+1)
является адрес arr [2], который содержит значение 9.
Но это потому, что вам повезло. Любая другая система или компилятор может взломать sh программу или сделать свет тусклым в вашем доме. Такова природа неопределенного поведения.