【问题标题】:C how to print index of array pointerC如何打印数组指针的索引
【发布时间】:2022-01-05 20:28:31
【问题描述】:

我有一个函数,其中包含 for 循环,用于打印指向数组 index 和 value
的指针 但我的问题是我在互联网上找不到如何通过指向数组的指针打印索引
我尝试了很多选项,但它总是输出地址、值或崩溃...

double func(double*startValueOfArrayPointer,double*endValueOfArrayPointer){   
   double *pointerI;

      for(pointerI=startValueOfArrayPointer+1;pointerI<=endValueOfArrayPointer;pointerI++)
      {
        printf("\n %d value is %.2lf",    ,*pointerI);  
      }
   }

我希望它像这样输出:

1 值为 23.32
2 值为 34.65
3 值为 1.76
.. .

提前致谢

【问题讨论】:

  • 你想要:printf(" %d value is %.2lf\n", pointerI - startValueOfArrayPointer, *pointerI);
  • @CraigEstey %d 不适合 ptrdiff_t
  • @0___________ 哎呀,%d --> %ld%zu 有效吗?或者,只是(int) (pointerI - startValueOfArrayPointer)
  • @CraigEstey ptrdiff_t 已签名 - 所以 zu 不是一个好的选择。不是吗?如果我们考虑可移植代码, (int) 可能太短。 td 是正确的——但许多实现不支持它。所以在这种情况下最安全的是lld
  • @0___________ 是的,[通常]它已经签名,但在这个用例中它总是积极的,所以zu(与zd相比)可能没问题。我以前从未见过td——学习新事物总是很好。有没有sizeof(ptrdiff_t) != sizeof(ssize_t)的情况?

标签: c for-loop pointers pointer-arithmetic function-definition


【解决方案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 );
    

    【讨论】:

    • 谢谢。但是现在我发现另一个问题,当我把参数值 fe: 2 和 6 来调用这样的函数 printf("Values in the range from 2 to 6 are:%.2lf",func(arrPointer+2,arrPointer+6) );它总是输出索引 12345 ......但我怎样才能让它输出索引 23456 ?
    • @CptTeemo 查看我的更新答案。在这种情况下,函数的调用方式类似于 func(arr + 2, arr + 7, 2);
    • 谢谢你,但我忘了说我需要这个函数只有这两个参数,对不起,我不想惹你生气......
    • @CptTeemo 使用两个参数,函数将无法知道从哪个索引值开始输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多