Несколько других получили вас за то, что похоже на путаницу между mat[0][0]
типа float
и &ptr[0][0]
типа float *
, но у вас есть еще одна более тонкая проблема: массивы не указатели.
Обычно массивы очень похожи на указатели, но по очень тонким причинам float [][]
не совместим с float **
, как float []
и float *
.
Во многих контекстах (таких какпередаваемый в функцию), массив распадается на указатель на свой первый элемент .Таким образом, mat
распадается до &mat[0]
.Тип массива T []
распадается на указатель T *
, что означает, что тип mat
распадается на (и тип &mat[0]
) равен float (*)[]
, то есть указатель на массив фиксированразмер.
Вот разница между float *
и float[]
:
float * float[]
+-----+ +-----+-----+
| ptr | --> | 0.0 | 1.0 |
+-----+ +-----+-----+
Теперь вот разница между float **
и float[][]
:
float ** float *[] float[][] float (*)[]
+-----+ +-----+ +-----+-----+ +-----+ (imagine this
| ptr | --> | ptr | --> | 0.0 | 1.0 | <-- | ptr | pointing to
+-----+ +-----+ +-----+-----+ +-----+ the 0.0 cell)
| ptr | --> | 2.0 | 3.0 |
+-----+ +-----+-----+
Эти типы, слева направо, указатель на указатель на float
, массив указателей на float
, массив массивов float
s и указатель на массив из float
s.Адрес &float[0]
, преобразованный в float **
, получает разыменованную дважды как указатель , даже если есть только один указатель - указатель на float[0]
(и, следовательно, остальная часть массива),Любое значение, которое вы получите через это, является мусором.