2015-07-12 2 views
2

Я нашел пример указателя на массив, который для меня не имеет смысла, мне было интересно, сможет ли кто-нибудь мне помочь?Указатели на массивы

int a[5] = 0,1,4,89,6; 
int *p = a; 'p points at the start of a' 
p[3] = 1; 'a[3] is now 6' 

Я не знаю, как третья линия, р [3] = 1, работает и как это вызывает [3] = 6. Спасибо за помощь заранее.

+0

Я думаю, что '5 [а]' такой же, как 'а [5]' andI'm право:) –

+1

yea 5 [a] тот же, что и [5], потому что 5 + a тот же, что и + 5. Но не то, что Tarius спрашивает – Nick

+0

Tarius - можете ли вы добавить тег C или C++ (или язык, который вы используете, поскольку он может быть C с классами или C--) – Nick

ответ

3

Это неверно. a[3] есть 1, а не 6.

Вот объяснение построчно:

int a[5] = 0,1,4,89,6; 
int *p = a; //'p points at the start of a' 
p[3] = 1; //'a[3] is now 1 not 6' 

Первая строка инициализации массива. Я думаю, что должно быть {} вокруг чисел, но если компилируется с вами, тогда все в порядке. Это, как я считаю, что это должно быть:

int a[5] = {0,1,4,89,6}; 

Вторая строка создать указатель на Int p и инициализировать его в адрес a. Массивы и указатели тесно связаны с C, поэтому теперь у вас есть 2 переменные a и p, указывающие на один и тот же адрес памяти.

Третья линия - установить p[3] в 1, на этот раз вы получаете доступ p в виде массива междунар (возможно из-за этого отношения между массивами и указателями). Поскольку p и a точек в тот же адрес памяти, это означает, что a[3] теперь 1

Также замечания неверны, должны быть/* */или //.

UPDATE: комментарий

Давида очень важно.

Массивы представляют собой последовательную зарезервированную память, способную хранить несколько значений массива, в вашем случае 5 int.

Указатель является указателем и может указывать везде, где они могут указывать на Int переменная:

int a = 5; 
int *b = &a; 

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

int a = 5; 
int *b = &a; 
*b = 4; // OK. 
b[0] = 4; // OK. 
b[1] = 4; // compiles correctly, but is **wrong**. 
      // it will overwrite something in memory 
      // and if program not crash, 
      // it will be security hole. 

int x[10]; 
int *y = x; 
*y = 4; // works correctly for y[0], 
      // but makes it difficult to read. 
y[0] = 5; // OK 
y[9] = 5; // OK 
y[10] = 5; // compiles correctly, but is **wrong**. 
      // it is after last element of x. 
      // this is called **buffer overflow**. 
      // it will overwrite something in memory 
      // and if program not crash, 
      // it will be security hole. 

UPDATE:

Я рекомендую проверить эту статью
http://boredzo.org/pointers/

+1

Будьте осторожны. «Указатель» и «массив» не являются тем же самым в C. Массив представляет собой последовательный зарезервированный блок памяти, либо статически объявленный в стеке, либо динамически выделяемый в куче. Правда, ссылка, используемая для указания на первый элемент массива, является указателем, но не самим массивом. С другой стороны, 'p' above - это просто указатель на тип' int'. Ему может присваиваться адрес первому элементу массива и вести себя как указатель на этот массив, но это связано только с тем, что компилятор знает тип указателя, чтобы арифметика указателя позволяла использовать. –

+0

вы оба правильные и не правильные в одно и то же время. вы всегда можете сделать int a = 5; int * b = & a; а затем a [1] = 100; это нарушение памяти **, но ** он будет скопирован и в некоторых случаях будет работать без видимой ошибки. Но из-за неправильной практики я даю вам +1. – Nick

+0

@ DavidC.Rankin - обновлен! – Nick

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