Почему * str1 и * (& str1), где str является именем массива символов в C, не дают одинаковый результат? - PullRequest
0 голосов
/ 31 декабря 2018

Код прост, но я просто не понимаю, как он работает.Кажется, что все три переменные хранятся по одному и тому же адресу, возможно, str1 является просто псевдонимом для str [0], но когда я пытаюсь разыменовать их, я получаю разные результаты.

   #include <stdio.h>

    int main() {
        char str1[] = "Hello";

        printf("<========Addresses: =======> \n");
        printf("%d\n", &str1[0]);
        printf("%d\n", &str1);
        printf("%d\n", str1);

        printf("<========Values stored at the address(?!)=======> \n");
        printf("%d\n", *(&str1[0]));
        printf("%d\n", *(&str1));
        printf("%d\n", *str1);
        return 0;
    }

И это то, что он печатает.

<======== Адреса: =======>

6356458

6356458

6356458

<======== Значения> хранятся по адресу =======>

72

6356458

72

1 Ответ

0 голосов
/ 31 декабря 2018

Сначала пройдемся по указателям, которые у вас есть:

  1. &str1[0]: это указатель на первый элемент массива.Его тип char *.

  2. &str1: это указатель на сам массив.Его тип char (*)[6] (не забывайте, что строки в C заканчиваются нулем, и этому терминатору тоже нужно место).

  3. str1: Это приведет к затуханию указатель на первый элемент массива, и он в точности равен &str1[0] (т. Е. Первому).

Теперь мы знаем, что первый и третийУказатель - это указатель на один элемент в массиве (первый с индексом 0). Легко увидеть, что происходит, когда мы разыменовываем его с помощью унарного оператора *: мы получаем значение элемента, на который указывает указательк.Это буква 'H', которая имеет значение 72 в кодировке ASCII .

Объяснить результат *(&str1) на самом деле довольно просто, так как мы можем удалить скобкии получите *&str1.Тогда легко заметить, что операторы разыменования и адресации взаимно отменяют друг друга, оставляя нам str1str1, как объяснено выше, равно &str1[0], то есть указателю на первый элемент в массиве.

...