Почему имя строки содержит адрес самого себя в c
Как это возможно, имя строки содержит адрес строки - ДА хорошо, но ее (имя строки) адрес должен быть другим, но это то же самое
Не только это, *str
дает первый символ - это нормально, но *str
это не что иное, как значение в (6356737), в этом коде, но само по себе равно 6356737, а не 'f'(что является ничем иным, как str [o])
int main()
{
char str[] = "fdsgugreui";
printf("\nstr=%u,&str=%u : *str = %c\n",str,&str,*str);
int i=0;
while(str[i] != '\0'){
printf("\n&str[%d] =%u : str[%d] = %c\n ",i, &str[i], i, str[i]);
++i;
}
return 0;
}
//результат...
str=6356737,&str=6356737 : *str = f
&str[0] =6356737 : str[0] = f
&str[1] =6356738 : str[1] = d
&str[2] =6356739 : str[2] = s
&str[3] =6356740 : str[3] = g
&str[4] =6356741 : str[4] = u
&str[5] =6356742 : str[5] = g
&str[6] =6356743 : str[6] = r
&str[7] =6356744 : str[7] = e
&str[8] =6356745 : str[8] = u
&str[9] =6356746 : str[9] = i
Process returned 0 (0x0) execution time : 0.150 s
Press any key to continue.
Я не могу понять почему!
1 ответ
str
это массив символов, который распадается на указатель на первый элемент char
массив - который так же, как &str[0]
,
Обратите внимание, что по стоимости str
а также &str
одинаковы, но их тип отличается. str
распадается на указатель - так становится char*
но второй char(*)[11]
(обратите внимание, когда вы передаете имя массива как операнд &
он не превратится в указатель), который является указателем на объект массива.
Правильный способ распечатать адрес printf("%p",(void*)str);
и это также будет то же самое для других переменных указателя.
str[0]
это содержимое массива str
на позиции 0
, Вот и все - это не имеет ничего общего с адресом, это char
, В твоем случае str[0]
ничего кроме 'f'
,
Что такое распадающийся массив?
Так что в большинстве ситуаций массив преобразуется в указатель на первый элемент. Это распад массива. Обратите внимание на случай здесь str
это массив char
s - когда мы используем str
в printf
он преобразуется в указатель на первый элемент самого себя, который является адресом str[0]
и указатель содержит это значение. Это объясняет, почему вы получаете значение &str[0]
когда ты напечатал str
,
Есть несколько исключений для распадающегося массива:
- это операнд
sizeof
оператор. _Alignof
оператор или- одинарный
&
оператор или - строковый литерал, используемый для инициализации массива
Самое интересное это &str
здесь вы видите, что это операнд &
адрес оператора - это исключение, когда гниение не произойдет. Так &str
указатель на объект массива Тип является char (*)[]
, И да, как вы говорите, он будет иметь ту же ценность, что и str
или же &str[0]
но это тип совершенно другой.
Что такое char(*)[SIZE]
?
Это обозначает указатель на массив символов, который имеет размер SIZE
, Есть SIZE
элементы в массиве.
Является char (*p)[SIZE]
такой же как char* p[SIZE]
?
Ий. Это не. Первый - указатель на массив char
с, который имеет SIZE
количество элементов.
char* p[]
это массив char*
-s. Это не одно и то же. Первый обозначает один указатель, а второй - массив указателей.
Другое дело - для указателей есть две вещи, которые имеют значение
- Значение указателя.
- Тип указателя.
Второй диктует, как арифметика указателя будет зависеть от размера типа объекта, на который он указывает. Здесь вы также видели, что &str
а также str
имеет то же значение, но не тот же тип. Вы будете удивлены, увидев это заявление и распечатав его.
printf(" &str+1 = %p str+1 = %p\n",(void*)(&str+1),(void*)(str+1));
Подсказка: первая
&str
это указатель на массив. Второй указатель наchar
,