C ++, создание указателя на массив символов - PullRequest
6 голосов
/ 12 марта 2012

В C ++ у меня есть массив символов, определенный как:

char miniAlphabet[] = {'A','B','C','D','E', '\0'};

Я хочу изменить значения этого массива из других функций, не передавая их этим функциям. Это где вы используете указатели правильно?

Так что мой вопрос в том, как правильно сделать указатель на этот массив символов. Могу ли я просто сделать указатель на первый элемент, а затем, когда я захочу изменить значения, я перемещаюсь по памяти, пока не достигну конечного символа?

Ответы [ 4 ]

16 голосов
/ 12 марта 2012
char miniAlphabet[] = {'A','B','C','D','E', '\0'};

Это эквивалентно.

char *p1 = miniAlphabet;

char *p2 = &(miniAlphabet[0]);

Обратите внимание, что () бесполезны для приоритета операторов, поэтому

char *p3 = &miniAlphabet[0];

В C / C ++ имямассив - это указатель на первый элемент массива.

Затем вы можете использовать математику указателей, чтобы творить чудеса ...

Это будет указывать на второй элемент:

char *p4 = &miniAlphabet[0] + 1;

как

char *p5 = &miniAlphabet[1];

или

char *p6 = miniAlphabet + 1;
1 голос
/ 12 марта 2012

Короче да. При создании массива miniAlphabet является указателем на массив указанного вами размера и типа. Который также является указателем на первый элемент.

Пример того, что вы предлагаете.

void foo(char *array)
{
    array[0] = 'z';
    array[2] = 'z';
}

...

char myArray[] = { 'a', 'b', 'c'};
foo(myArray);
//myArray now equals  {'z', 'b', 'z'}

также следует отметить, что разыменование myArray дает вам значение в первом элементе.

1 голос
/ 12 марта 2012

Если вы передаете массив функции, вы передаете по ссылке как переменную массива, это просто указатель на адрес первого элемента массива. Таким образом, вы можете вызвать такую ​​функцию:

funcName(miniAlphabet);

и получить массив «по ссылке» следующим образом:

void funcName(char *miniAlphabet) {
   ...
}
1 голос
/ 12 марта 2012

Положение массива в памяти совпадает с положением его первого элемента.Так, например, обе подписи функций ниже эквивалентны:

function changeArray(char[] myArray);
function changeArray(char* myArray);

И вы можете вызвать любую версию следующим образом:

changeArray(miniAlphabet);

... или

changeArray(&(miniAlphabet[0]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...