Проблема с указателями - PullRequest
0 голосов
/ 17 марта 2011

У меня есть вопрос.Я создал правильно инициализированный целочисленный указатель int * p и правильно инициализированный массив целых чисел int * array1 = new int[]

Что из перечисленного является допустимым кодом?

p = array1;

array1 = p;

Или оба верны?

возможно ли это также p[0], поскольку, насколько я знаю, по арифметике указателей это ничего не добавляет.

Все в с ++

Ответы [ 8 ]

1 голос
/ 17 марта 2011

Если вопрос пытается найти указатели в сравнении с массивами, они не всегда совместимы.Это скрыто в представленном коде, потому что массив немедленно преобразуется в указатель.

int*  array1   = new int[5]; // Legal, initialising pointer with heap allocated array
int array2[5] = {0}; // Declaring array directly on the stack and initalising with zeros
int *p = 0; // Declaring pointer and initialising to numm
p = array2; // Legal, assigning array to pointer
p = array1; // Legal, assigning pointer to pointer
array1 = p; // Legal, assigning pointer to pointer
array2 = p; // ILLEGAL, assigning pointer to array

Здесь array2 имеет тип массива и не может использоваться для хранения указателя.На самом деле, массив вообще не может быть переназначен, так как он не является l-значением.

int array3[5] = {0}; // Declaring array directly on the stack and initalising with zeroes
array3 = array2; // ILLEGAL, array not an l-value

Массив имеет фиксированный адрес и переназначение будет похоже на попытку записи:

int i = 0;
&i = p;

[Надеюсь, попытка переназначить местоположение переменной - очевидная ерунда.]

0 голосов
/ 17 марта 2011

"Я создал правильно инициализированный целочисленный указатель int * p и правильно инициализированный массив целых чисел int * array1 = new int[]"

Прежде всего, если оставить в стороне синтаксические ошибки, терминология неверна.

  1. int *p; - Здесь вы просто объявляете указатель для хранения адреса целочисленной переменной. Вы не инициализируете это. Объявление отличается от инициализации, а инициализация отличается от присваивания.
  2. int *array1 = new int[]; - Если оставить в стороне ошибку, это не инициализированный целочисленный массив. array1 - указатель, указывающий на массив целых чисел. И передача ничего в [] неверна. Необходимо передать значение, определяющее количество областей памяти, которые должны быть выделены для хранения целочисленных значений.

Ответы на вопросы.

Что из перечисленного является юридическим кодом?

  1. p = array1;

    Если array1 правильно инициализирован, это правильно. p указывает на первое целое число в array1. Даже если он не инициализирован должным образом, это правильно. В этом случае array и p указывают на значения мусора.

    int* array1 = new int[5]; // Notice **5** being passed.

  2. array1 = p;

    На самом деле эта операция бесполезна . И p, и array1 оба указывали на одно и то же место ранее. Но это юридически правильно.

  3. возможно ли это также p[0]?

    Да, это правильно. p может разыменовываться от 0 до 4 , поскольку это значения индекса. Если вы просто хотите p[0], в этом случае -

    int* array1 = new int ; // Notice nothing being passed.

0 голосов
/ 17 марта 2011

Обе переменные имеют указатель типа на int.Так что оба задания законны.Тот факт, что одна из переменных является массивом, не имеет значения в C. Массивы и указатели после инициализации одинаковы.

0 голосов
/ 17 марта 2011

Вы можете назначить переменную массива переменной указателя. Таким образом, p = array1 является правильным.

Вы можете сослаться на этот код.

#include <iostream>
using namespace std;

int main ()
{
  int numbers[5];
  int * p;
  p = numbers;  *p = 10;
  p++;  *p = 20;
  p = &numbers[2];  *p = 30;
  p = numbers + 3;  *p = 40;
  p = numbers;  *(p+4) = 50;
  for (int n=0; n<5; n++)
    cout << numbers[n] << ", ";

  for (int n=0; n<5; n++)
    cout << p[n] << ", ";
  return 0;
}

Если оба указателя, то нет необходимости объявлять указатель как массив, например int * array1 = new int [].

0 голосов
/ 17 марта 2011

Согласно объяснению, предоставленному на этом сайте .Первое назначение является правильным, но второе назначение не может считаться действительным.Пожалуйста, посмотрите под заголовком «Указатели и массивы».

0 голосов
/ 17 марта 2011

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

0 голосов
/ 17 марта 2011

Если p и array1 объявлены как "int *", как вы подразумеваете здесь, то любое определение допустимо по определению.

0 голосов
/ 17 марта 2011

Оба допустимы.

Первое, "p = array1", приведет к утечке вашего правильно инициализированного целочисленного указателя и будет указывать p на первое вхождение массива, на который указывает array1.*

Второе, "array1 = p", вызовет утечку правильно инициализированного целочисленного массива и будет указывать массив1 на единственное целое число, на которое указывает p.что-то.Не могли бы вы опубликовать полный код?

...