>2. char str = "строка";
>char *chp;
>chp = str;в первой строке надо бы написать char str[]="строка"; Тогда компилятор сам выделит под str 7 байт;
>мне нужна схема памяти. так уж устроено у меня понимание
>если printf( "%d", &str[0]); 1549600589 // Например
> printf( "%d", &str); 1549600676 // Почему отличаются
>ведь сказано, что str, будет указывать на первый символ,
>значит адреса &str и &str[0], должны быть равны
У Кернигана-Ритчи не зря глава 5 называется "Указатели и массивы". На самом деле имя массива - указатель на нулевой элемент. а затем в скобках указывается смещение в памяти. Поэтому &str[0] - это то же самое, что и str, а, к примеру, *(str+5) - то же самое, что и str[5]. А что такое &str... это указатель на указатель, то есть местоположение str в памяти.
Короче говоря начать изучение указателей надо с изучения устройства оперативной памяти, затем долго и упорно изучать Кернигана-Ритчи, попутно занимаясь написанием программ. В итоге придёт понимание и счастье :)