Тип приведен в арифметике Pointer для двумерного массива (C) - PullRequest
0 голосов
/ 20 февраля 2019

Нужно ли выполнять приведение типов, когда я хочу проиндексировать определенный элемент массива двумерного массива вручную с помощью арифметики указателей. Если так, почему?Вот что я имею в виду:

float *p;
float balance[5][2]={2.34, 
5.66,7.85,12.56,9.87,76.22,56.55,21.02,66.12,10.001};
p=(float *) balance;   //Do I need this type casting and if so why?    
printf("%.2f",*(p+(3*2)+1));  

1 Ответ

0 голосов
/ 20 февраля 2019

Баланс - это двумерный массив, который представляет собой массив массивов.Он будет распадаться, как любой массив, на указатель на свой первый элемент ... но этот элемент по-прежнему является массивом, а не плавающей точкой!указатель на массив на указатель на его первый элемент не совсем стандартен.Правильный способ - разыменовать balance: это будет одномерный массив, который будет хорошо распадаться на указатель на первый float:

p = *balance;    // no cast required here

При этом, с педантичной точки зрения, следующийline (*(p+(3*2)+1)) объединяет двухмерный массив 2x5 с одномерным массивом размером 10. Результат не определен по стандарту, как только индекс становится больше, чем размер строки здесь 2. Конечно, все распространенные реализации допускают его совместимость сстарый код, но вы действительно должны задаться вопросом, зачем он вам нужен, и избегать этого, если можете.

Правильный и совместимый способ будет выглядеть так:

float (*pp)[2];
float balance[5][2] = { 2.34,
    5.66,7.85,12.56,9.87,76.22,56.55,21.02,66.12,10.001 };
pp = balance;
printf("%.2f\n", pp[3][1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...