Указатели с символьными переменными - PullRequest
0 голосов
/ 27 апреля 2020

Я изучаю C ++, разбираюсь в указателях и создал следующий код

#include<string>
using namespace std;
int main()
{
    char s[100] = "Today is a rainy day";
    cout<<s[0]<<endl;
    char *p;
    p = s;
    cout <<s<<endl;
    cout<<p<<endl;
    cout<<*p<<endl;
}

В этом коде я предположил, что, поскольку s указывает на начальный адрес массива, печать указателя p даст мне адрес и * p даст мне первый элемент массива.

Мой вывод был в форме

T
Today is a rainy day
Today is a rainy day
T

Здесь p и s выводят полный массив символов, который Я не понял, также использование * p выводило на печать первый элемент, хотя p теперь было просто массивом.

Как работают указатели, когда мы используем их в таких массивах, как это я хотел бы понимать.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Когда вы разыменовываете массив или указатель, вы получаете char. Это печатает, что char, как вы, возможно, ожидали.

Однако, когда вы предоставляете char* (это то, что вы получаете как с массивом, так и со случаем указателя, так как массив затухает до указателя здесь ) вместо этого вызывается перегрузка operator<< для char*.

Эта перегрузка обрабатывает любую char*, которую она видит как C -строку, поэтому вы видите, что она распечатана как таковая ,

0 голосов
/ 27 апреля 2020

Разница между указателем и массивом существует только во время компиляции. Во время выполнения они одинаковы и распадаются на указатели.

Для массива во время компиляции вы можете найти его размеры и использовать их в качестве параметров в коде шаблона. См. std::is_array, std::extent и др. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...