Имя массива в качестве указателя - PullRequest
0 голосов
/ 18 октября 2019

Я узнал, что имя массива функционирует как указатель.
В C ++, когда я сделал имя массива целочисленного типа 'a', cout a выводит адрес массива.
Но когда я сделал имя массива с типом символа 's', cout s выводит содержимое массива неадрес.
Я хочу знать, почему это происходит.

#include <iostream>

using namespace std;

int main()
{
    // a string is a sequence of characters.
    char s[4] = "abc"; // why not giving 3 as the size of the array?

    // what if you want to print the address?
    cout << '\n';
    cout << (void*) s << "\n"; // Treat 's' as a void* variable.
    cout<<(void*)&s<<endl;
    cout << (void*)&s[0] << "\n"; // This also works.
    cout << (void*)&s[1] << "\n";
    cout<endl;


    cout << s << "\n"; // Treat 's' as a void* variable.
    cout<<&s<<endl;
    cout << &s[0] << "\n"; // This also works.
    cout << &s[1] << "\n";

    return 0;

}

1 Ответ

0 голосов
/ 21 октября 2019

1.Всегда строковая константа заканчивается нулевым значением ('\ 0'). Если вам не нужно это значение Null, вы можете присвоить значение следующим образом

char s1 [3] = {'a', 'b', 'c'};

2. Выше заявления вы делаете явное приведение типов! Вы конвертируете массив символов в пустой указатель. И WKT, char имеет размер 1. Так что адрес был увеличен на единицу. И к вашему сведению, Notaion имени массива, такого как 's', равен & s [0]. (Адрес первого индекса), а также равен адресу имени массива (& s) ..

[s == & s == & s [0]]

И мы знаем, что указатель void может содержать адрес любого типа и может быть напечатан для любого типа. Но при преобразовании символа в указатель void мы видим только преобразование адреса. Потому что & s и s содержит только адрес первого символа. Кроме того, cout не признает, что значение является символьным значением.
...