Указатели и массивы против указателей и целых чисел C ++ - PullRequest
0 голосов
/ 10 января 2019

Я изучаю C ++ и немного запутался в том, как отличается Указатель на целочисленное значение и Указатель на массив ... См. Мой код ниже:

int main(void) 
{
    int* ptrOne;
    int VarOne = 25;

    ptrOne = VarOne; 

    int* ptrTwo;
    int ArrayTwo[6];
    ArrayTwo[0] = 2; //ect for the rest of the array, omitted here.

    ptrTwo = ArrayTwo;
}

Указатели - это просто переменные, которые содержат адрес.

Для строки ptrOne = VarOne это значение ЗНАЧЕНИЯ 25 сдвигается в ptrOne.

Для строки ptrTwo = ArrayTwo он помещает АДРЕС ArrayTwo [0] в ptrTwo.

Почему ptrTwo = ArrayTwo эквивалентно ptrTwo = & ArrayTwo [0], но ptrOne = VarOne НЕ равно ptrOne = & VarOne?

Это связано с тем, что операция выполняется с массивом против int?

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

Ответы [ 2 ]

0 голосов
/ 10 января 2019
int A[5]={0,1,2,3,4};

Имя массива A является постоянным указателем на первый элемент массива. Так что A можно считать const int *. Поскольку A - это постоянный указатель, A = NULL будет недопустимым утверждением. Массивы и указатели являются синонимами с точки зрения того, как они используют для доступа к памяти. A[0] возвращает значение в [указателе первого элемента массива] + 0 , но возвращает элемент массива с индексом '0' .

int* ptr= A; //= int* ptr= &A[0];

Так что, поскольку int рассматривается как тип данных, мы не можем использовать его как указатель. когда мы хотим объявить статический указатель значения int, он записывается со следующим синтаксисом:

int X= 25;
int* ptr= &X;
0 голосов
/ 10 января 2019

Почему ptrTwo = ArrayOne эквивалентно ptrTwo = & Array [0]

Потому что в C имя массива является адресом первого элемента. Вы можете проверить, почему: Почему адрес массива равен его значению в C?

но ptrOne = VarOne НЕ равно ptrOne = & VarOne?

Поскольку VarOne является одной переменной, поэтому VarOne является значением самой переменной, а не адресом этой переменной.

На самом деле этот код должен быть явной ошибкой, если вы включите предупреждение компилятора (-pedantic-errors), которое говорит вам, что вы не можете преобразовать тип указателя в int.

error: assignment makes pointer from integer without a cast [-Wint-conversion]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...