C как напечатать индекс указателя массива

#c #for-loop #pointers #pointer-arithmetic #function-definition

Вопрос:

У меня есть функция, которая содержит цикл for для печати указателя на индекс и значение массива
, но моя проблема в том, что я не могу найти в Интернете, как печатать индекс указателем на массив
, я перепробовал много вариантов, но он всегда выводит адрес, значение или сбой…

 double func(double*startValueOfArrayPointer,double*endValueOfArrayPointer){   double *pointerI;   for(pointerI=startValueOfArrayPointer 1;pointerIlt;=endValueOfArrayPointer;pointerI  )  {  printf("n %d value is %.2lf", ,*pointerI);   }  }  

я хочу, чтобы он выводил что-то вроде этого:

1 значение равно 23,32
2 значение равно 34,65
3 значение равно 1,76

Заранее спасибо

Комментарии:

1. Ты хочешь: printf(" %d value is %.2lfn", pointerI - startValueOfArrayPointer, *pointerI);

2. @CraigEstey %d не подходит для ptrdiff_t

3. @0___________ Упс, это %d —gt; gt; %ld или %zu работает? Или просто (int) (pointerI - startValueOfArrayPointer) ?

4. @CraigEstey ptrdiff_t подписан — так zu что это не лучший выбор. Не так ли? (int) может быть слишком коротким, если мы рассмотрим переносимый код. td является правильным, но многие реализации его не поддерживают. Так что самое безопасное в этом случае-это lld

5. @0___________ Да, [в целом] он подписан, но в данном случае он всегда положительный, так zu что (против zd ) может быть нормально. Я никогда td раньше не видел-всегда приятно узнавать что-то новое. Был ли когда — нибудь случай, когда sizeof(ptrdiff_t) != sizeof(ssize_t) ?

Ответ №1:

Разница заключается в типе ptrdiff_t и правильном способе печати:

 printf("n %td value is %.2lf", pointerI - startValueOfArrayPointer ,*pointerI)  

или если ваша реализация не поддерживает %td :

 printf("n %lld value is %.2lf", (long long)(pointerI - startValueOfArrayPointer) ,*pointerI)  

Ответ №2:

Для начала ваша функция ничего не возвращает, хотя ее тип возвращаемого значения не void является .

Также модификатор длины 'l' в строке формата не влияет.

Имейте в виду, что в C индексы начинаются с 0. Тем не менее ваша функция может выглядеть следующим образом.

 void func( const double *first, const double *last ) {  for ( const double *current = first; current != last;   current )  {  printf( "n%tu value is %.2f", current - first   1, *current );  } }   

Или, если вы хотите, чтобы выводимые индексы могли начинаться с указанного пользователем значения, функция может выглядеть следующим образом

 void func( const double *first, const double *last, size_t initial ) {  for ( const double *current = first; current != last;   current )  {  printf( "n%zu value is %.2f", ( size_t )( current - first   initial ), *current );  } }   

Обратите внимание, что указатель last не должен находиться в диапазоне выводимых значений. В противном случае будет трудно указать пустой диапазон для массива. То есть диапазон указан как [first, last ) .

Например, если у вас есть массив, подобный

 double a[N];  

и хотите вывести все значения массива с помощью функции, тогда функция будет называться так

 func( a, a   N );  

или (если использовать измененную функцию), например

 func( a, a   N, 1 ); // or func( a, a   N, 0 );  

Комментарии:

1. Спасибо. но теперь я обнаружил еще одну проблему,когда я ввел значения параметров,например: 2 и 6, для вызова функции, подобной этой printf(«Значения в диапазоне от 2 до 6:%. 2lf», функция(arrPointer 2, arrPointer 6)); она всегда выводит индекс 12345… но как я могу сделать так, чтобы он выводил индекс 23456 ?

2. @CptTeemo Смотрите мой обновленный ответ. В этом случае функция вызывается как func( arr 2, arr 7, 2 );

3. спасибо, но я забыл сказать, что мне нужна эта функция, чтобы иметь только эти 2 параметра, поэтому я не хочу вас раздражать…

4. @CptTeemo С двумя параметрами функция не сможет узнать, с какого значения индекса начинать вывод.