使用指针运算的数组数字总和

Sum of array digits using pointer arithmetic

我需要使用指针运算为所有数组元素写出数字总和。

程序应打印:0 1 2 5 8 16 14

#include <stdio.h>
void sumDigit(int arr[], int n) {
  int *p = arr, m, sum;
  while (p < arr + n) {
      sum=0;
      m = (*p) % 10;
      sum += m;
      (*p) /= 10;
    p++;
     printf("%d ", sum);
  }
}
int main() {
  int arr[] = {0, 1, 2, 14, 35, 97, 68};
  int n = sizeof(arr) / sizeof(*arr);
  sumDigit(arr, n);
  return 0;
}

此代码仅打印最后数字 (0 1 2 4 5 7 8)。

这个任务如何实现指针运算?

可能在 general-chat 中持续了足够长的时间。您完全误解了作业的目的。目的是在不使用下标的情况下完成任务。例如。你不能这样做:

for (int i=0; i<n; ++i)
{
    // do something with arr[i]
}

相反,他们希望您这样做:

int *p = arr;
while (p != arr+n)
{
    // do something with *p, then....

    ++p;
}

就是。对于手头的任务,至少有十几种方法可以做到这一点;我可以立即想到五个。一种方式如下所示:

#include <stdio.h>

void sumDigit(const int arr[], size_t n)
{
    const int *stop = arr + n;
    for (; arr != stop; ++arr)
    {
        int sum = 0;
        int value = *arr;
        while (value != 0)
        {
            sum += value % 10;
            value /= 10;
        }
        printf("%d ", sum);
    }
    fputc('\n', stdout);
}

int main()
{
    int arr[] = {0, 1, 2, 14, 35, 97, 68};
    size_t n = sizeof arr / sizeof *arr;
    sumDigit(arr, n);
    return 0;
}

输出

0 1 2 5 8 16 14 

这是另一种方式:

void sumDigit(const int arr[], size_t n)
{
    const int *p = arr;
    while (p != arr+n)
    {
        int sum = 0;
        int value = *p;
        while (value != 0)
        {
            sum += value % 10;
            value /= 10;
        }
        printf("%d ", sum);
        ++p;
    }
    fputc('\n', stdout);
}

还有一个...

void sumDigit(const int arr[], size_t n)
{
    for (const int *p = arr; p != arr+n; ++p)
    {
        int sum = 0;
        int value = *p;
        while (value != 0)
        {
            sum += value % 10;
            value /= 10;
        }
        printf("%d ", sum);
    }
    fputc('\n', stdout);
}

这里有一个,正如我在 general-comment 中所描述的,使用 purpose-driven 函数来计算提供的 int 值的 sum-of-digits,从而使实际的 sumDigit 很多更容易理解:

int sum_of_digits(int value)
{
    int sum = 0;
    while (value != 0)
    {
        sum += value % 10;
        value /= 10;
    }
    return sum;
}

void sumDigit(const int arr[], size_t n)
{
    for (const int *p = arr; p != arr+n; ++p)
        printf("%d ", sum_of_digits(*p));
    fputc('\n', stdout);
}

所有这些都产生相同的输出,因为它们最终都做同样的事情。

您唯一需要的指针运算是 arr++。需要变量 val 才能不破坏原始数组的内容。 return int 没有意义,因为数字总和不能为负数。还要使用正确的尺寸类型 (size_t)

unsigned sumDigit(int arr[], size_t n) 
{
    int val;
    unsigned sum = 0, psum;
    while (n--) 
    {
        val = *arr++;
        psum = 0;
        do
        {
            psum += abs(val % 10);
            val /= 10;
        }
        while(val);
        sum += psum;
        printf("%u ", psum);
    }
    printf("\n");
    return sum;
}

int main(void)
{
    int arr[5] = {68876, -434554, 3456, 99999, -3435543};

    printf("Sum of digits of all numbers in the array = %u\n", sumDigit(arr, 5));
}