Почему имя строки содержит адрес самого себя в 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 это массив chars - когда мы используем str в printf он преобразуется в указатель на первый элемент самого себя, который является адресом str[0] и указатель содержит это значение. Это объясняет, почему вы получаете значение &str[0] когда ты напечатал str,

Есть несколько исключений для распадающегося массива:

  1. это операнд sizeof оператор.
  2. _Alignof оператор или
  3. одинарный & оператор или
  4. строковый литерал, используемый для инициализации массива

Самое интересное это &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,

Другие вопросы по тегам