2016-02-01 5 views
2

Мой профессор в настоящее время преподаёт тему динамического распределения памяти вместе с указателями. Я не совсем понимаю, следующий пример:Динамическое распределение памяти со строками

#include <iostream> 
#include <cstring> 
#include <cstdlib> 
using namespace std; 

int main(void) 
{ 
    int i; 
    char * names[7];  // declare array of pointers to char 
    char temp[16]; 

    // read in 7 names and dynamically allocate storage for each 
    for (i = 0; i < 7; i++) 
    { 
     cout << "Enter a name => "; 
     cin >> temp; 
     names[i] = new char[strlen(temp) + 1]; 

     // copy the name to the newly allocated address 
     strcpy(names[i],temp); 
    } 

    // print out the names 
    for (i = 0; i < 7; i ++) cout << names[i] << endl; 

    // return the allocated memory for each name 
    for (i = 0; i < 7; i++) delete [] names[i]; 

    return 0; 
} 

Для линии, которая печатает имена, я не понимаю, как «имена [I]» печатает имена. Не следует ли «имена [i]» распечатывать указатели? Любая помощь по этому поводу очень ценится.

+0

Не используйте 'std :: endl', если вам не нужен дополнительный материал, который он делает. '' \ n'' запускает новую строку. –

ответ

5

Существует перегрузка operator<< со следующей подписью.

std::ostream& operator<<(std::ostream&, char const*); 

который печатает нулевую завершаемую строку.

При использовании

cout << names[i] << endl; 

, что перегрузка используется.

Вы можете увидеть все перегрузки, не являющиеся членами, по адресу http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2.

Существует функция перегрузки членом std::ostream с подписью:

std::ostream& operator<<(const void* value); 

Тем не менее, в логике разрешения перегрузки, функция не являющегося членом с char const* как тип аргумента задается более высокий приоритет.

Смежные вопросы