Переменная s
объявлена как имеющая тип char *
. В то время как переменная ptr
объявлена имеющей тип char **
. Таким образом, указатели имеют несовместимые типы.
Чтобы код был действительным, вы должны написать либо
char *s = "12d3.46";
char *ptr = s;
, либо
char *s = "12d3.46";
char **ptr = &s;
В последнем случае значения указатели s
и ptr
будут разными. Указатель s
содержит адрес первого символа строкового литерала "12d3.46"
, а указатель ptr
содержит адрес самой переменной s
. То есть значение, хранящееся в s
, будет равно значению выражения *ptr
.
Обратите внимание, что s
не является массивом. Это указатель. Если вы хотите объявить массив, а затем указатель, который будет указывать на первый элемент массива, вы должны написать
char s[] = "12d3.46";
char *ptr = s;
В этом случае этот вызов
printf("%p %p\n", ( void * )s, ( void *)ptr);
выведет два равные адреса.