Указатель на распределение памяти указателя, почему это неправильно? - PullRequest
1 голос
/ 04 марта 2010

Я просто пытаюсь разобраться с различными понятиями указателя, и у меня есть следующий код:

char** a = new char*; // assign first pointer to point to a char pointer

    char b[10] = "bla bla";
    *a = new char; //assign second pointer a block of memory.  -> This looks wrong to me!!  
    (**a) = b[2]; 

Так что же не так со вторым «указателем» выделения памяти? Он работает и все такое, но он просто чувствует себя не так.

EDIT:

Спасибо за разъяснение этого! Я кое-чему научился!

Ответы [ 6 ]

2 голосов
/ 04 марта 2010
char** a = new char*;  // a is a pointer to a pointer to a type char. allocate a new pointer variable and make a point to it.
char b[10] = "bla bla"; // define a char array.
*a = new char; // allocate a new char and make the pointer whose address is in a point to it.
(**a) = b[2]; // copy the 3rd char of b to the char whose address is pointed by a.
2 голосов
/ 04 марта 2010

В этом нет ничего плохого, за исключением того, что использование динамического выделения памяти является довольно плохим стилем в C ++.

1 голос
/ 04 марта 2010

Единственная причина, по которой он «неправ», заключается в том, что он неясен. Вы, очевидно, согласны с тем, что это неясно.

В некоторых контекстах подобный код может быть «правильным», когда с лучшими именами и лучшей структурой классов цель ясна, что также устраняет сомнения относительно средств.

1 голос
/ 04 марта 2010

*a = new char; означает, что вы создаете одну переменную char, используя ее конструктор по умолчанию. Это эквивалентно *a = new char(); И вы присваиваете адрес только что созданной переменной указателю a

0 голосов
/ 04 марта 2010

ничего плохого, технически. Но кажется, что стиль используется редко.

0 голосов
/ 04 марта 2010

Технически нет ничего плохого.

Однако редко можно явно указать указатель на указатель на один элемент на той же странице кода. Вы не будете делать это на практике очень часто, по той же причине, по которой вы редко говорите: «Если вам нужно знать о FooBar, спросите Тома, а Том это я».

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