Как использовать указатель массива? - PullRequest
2 голосов
/ 06 декабря 2011

Я новичок в C ++ и не могу понять, как работают указатели по отношению к массивам.Я не могу понять, как я должен получить доступ к элементу в указателе массива.Вот что я имею в виду:

int* array[10];

(*array)[5] = 4;// This works but I don't think that that is the correct way to do it
array->[5] = 4; // Is there a similar method such as what you would use for a normal pointer?

Также мне было интересно, можно ли инициализировать указатель массива так, как вы можете инициализировать обычный массив с массивом в фигурных скобках.

int  array[] =  {0, 2, 45, 235};// Works
int* array[] =  {0, 2, 45, 235};// does not work
int* array[] = &{0, 2, 45, 235};// does not work

РЕДАКТИРОВАТЬ:Некоторые из вас предлагают использовать массив без указателя.Но если я сделаю это, не сделаю ли он копию всякий раз, когда я передаю ее в метод, как с обычными переменными?

Ответы [ 10 ]

4 голосов
/ 06 декабря 2011
int * array[10]

Это не указатель массива. Это массив из указателей. Вы помещаете в него указатели, а не целые числа.

Указатель массива будет выглядеть так:

int (*ptr)[10] = &array;

Но это также не заполнено целыми числами. Он заполнен массивами из 10 целых чисел. Точнее, он указывает либо на один массив из 10 целых чисел, либо на первый массив в массиве из 10 целых чисел.

1 голос
/ 06 декабря 2011

Это объявление:

int* array[10];

... может быть не то, что вы думаете. Это объявление массива из 10 указателей на int. Это не массив 10 int с.

Поскольку вы на самом деле не инициализировали каждый из этих 10 указателей, попытка получить доступ к одному из них вызвала неопределенное поведение. Вот что вы здесь делаете:

(*array)[5] = 4;

... и снова здесь:

array->[5] = 4;

Что вам, вероятно, нужно, это массив из 10 int с, который вы объявляете так:

int array[10];

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

array[5] = 4;

Но, пока мы говорим о массивах, почему бы не использовать вместо него vector и избежать всего этого беспорядка?

vector<int> vi;
vi.push_back(1);
/* ... */
0 голосов
/ 06 декабря 2011

Когда вы пишете

int* array[10]; 

Вы на самом деле не создаете массив целых чисел или, в этом отношении, массив указателей на целые числа.Вы делаете 40 байтов данных (поскольку целое число занимает 4 байта).

0 голосов
/ 06 декабря 2011

Когда вы передаете массив, вы фактически передаете указатель, который указывает на первый элемент массива.Поэтому вам, вероятно, следует придерживаться того, чтобы не смешивать массивы и указатели на массивы.Как указывалось ранее, массивы неявно представлены в виде указателей.Если вы только начинаете, сначала изучите базовые массивы, затем указатели, а затем переходите к динамическому распределению памяти.Указатели очень хитры, поэтому вы можете использовать их медленно и тщательно.Это сэкономит вам много времени позже.

0 голосов
/ 06 декабря 2011

Нет, потому что указатели должны указывать на объект, а вы указываете на список инициализатора, а не на объект массива. Вы должны создать экземпляр объекта массива со списком инициализатора, чтобы указатель указывал на него.

Точно так же вы не можете иметь

int* = &7;
0 голосов
/ 06 декабря 2011

сам массив является указателем

он указывает на базовый адрес

, это поможет

http://pw1.netcom.com/~tjensen/ptr/ch2x.htm

0 голосов
/ 06 декабря 2011

в целом:

  • Символическое имя массива (int arr[], имя arr) обычно работает как указатель на его голову;так что arr[3] == *(arr+3).(Обратите внимание, что арифметика указателя в C / C ++ указывается в единицах размера указателя, а не в байтах.)
  • Создание массива с использованием int* arr[] - это массив указателей на целые числа , а не массивцелых чисел.

В вашем примере вы пытаетесь поместить целые числа в слоты, предназначенные для указателей.Крайне маловероятно, что вы захотите это сделать.

0 голосов
/ 06 декабря 2011

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

int array[] = {0,2,3,4};
int *ptr = array;

Но, честно говоря, я не уверен, попросили ли вы об этом.

0 голосов
/ 06 декабря 2011

Для номера один, потому что array - это массив из 10 int* с, который указывает на какую-то случайную ячейку памяти, вам нужно сделать так, чтобы указатели указывали на int (это также должно ответить на ваш следующий вопрос):

// 10 ints on the heap held in an array on the stack
int* array[] = {new int, new int, new int, new int, new int, new int, new int, new int, new int, new int};

*array[3] = 32; // [] has higher precedence than * so this is like *(array[3])

// remember to loop through and delete each one
for (int i = 0; i < 10; ++i)
    delete array[i];
0 голосов
/ 06 декабря 2011

Для массива простых типов данных, таких как int, оператор -> не определен.Оператор * - это оператор разыменования, дающий вам элемент, на который указывает каждый указатель.В вашем случае int *.

Для второй части вашего вопроса, только один метод действителен для инициализации массива с постоянными данными.

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