C ++ имеет статическую типизацию, поэтому, конечно, компилятор понимает, что x
и z
- это не одно и то же.Они имеют разные типы - z - это массив, x и y - указатели.
Причина, по которой z = x
не компилируется, состоит не в (просто) в несовместимости типов, а в том, что вы можете 't присваивать переменной массива вообще.Когда-либо.x = z
присваивает x указатель на первый элемент z.x = y
присваивает значение y
x
. [*]
Когда я передаю массив функции как int * in вместо int in [], что я получаюили проигрывают?
Они делают одно и то же, поэтому у вас нет выбора.Возможно, вас сбило с толку тот факт, что синтаксис C ++ допускает int in[]
в качестве параметра функции.Тип параметра in
это не какой-либо массив, это int*
.
Если бы я спросил вас, какой тип данных у равен
Это int*
.Это то, что объявлено как, так оно и есть.
Значение , которое содержит , является указателем на (первый элемент) массива.Я часто использую эту формулу: «указатель на (первый элемент)» в тех случаях, когда я хотел бы сказать «указатель на массив», но не могу, потому что есть вероятность двусмысленности относительно того, является ли используемый тип указателем-to-array or not.
Однако указатели на массивы редко используются в C ++, потому что размер массива является частью типа.В C ++ нет такого типа, как «указатель на массив int», просто «указатель на массив 1 int», «указатель на массив 2 int» и т. Д. Это обычно не очень удобно, поэтому использованиеуказатель на первый элемент массива, размер которого может быть неизвестен во время компиляции.
- это действительно только потому, что арифметика с указателями попадает в пространство памяти, которое все еще действует
В значительной степени, да.Размер массива является частью типа z, но не является частью типа x или y, а также не является частью типа результата z, затухающего в указателе на его первый элемент.Так что y
может быть указателем на первый из 10 элементов или просто на 1 элемент.Вы знаете разницу только по контексту, и, требуя от своих абонентов, чтобы значение, которое вы указали, указывало на то, на что он должен указывать.
«Случается», однако, слишком много оставляет за собой шанс - часть вашей работыпри использовании массивов необходимо убедиться, что вы не отклоняетесь от их границ.
[*] z = x
не разрешено, даже после того, как вы сделали x = z
, потому что z есть (и всегда будетбыть) конкретный массив из 10 дюймов в памяти.Еще при разработке C возник вопрос о том, могут ли переменные массива в принципе быть «перезаписываемыми», что означает, что вы можете сделать:
int z[10];
int y[10];
z = y; // z is now an alias for y
y[0] = 3;
// z[0] now has the value 3
Деннис Ричи решил не допустить этого, потому что это помешало бы емуот различения массивов от указателей так, как он должен был сделать.Так что z
никогда не может ссылаться на массив, отличный от того, который был объявлен как.Прочитайте все об этом здесь: http://cm.bell -labs.com / cm / cs / who / dmr / chist.html , под "Embryonic C".
Еще одно вероятное значение для z = y
может быть memcpy(z,y,sizeof(z))
.Этого значения тоже не было.