不使用索引的指针和数组

时间:2019-01-01 10:42:12

标签: c arrays pointers

已要求我对一个int数组求和并返回不使用索引的总和。 (函数需要获取数组和大小)

我知道我应该设置一个指向数组的指针,并将指针与数组地址进行比较,并使用指针++在数组上运行。

我写下了以下代码:

int sumArray(int nNumArray[], int nSize)
{
    int nSum = 0;

    while(*nNumArray <= &nNumArray[nSize-1])
    {
        nSum += *nNumArray;
        nNumArray++;
    }
    return nSum;
}

效果很好

* nNumArray是指值,&nNumArray [nSize-1]是指地址。

我试图了解这种方式的工作原理。

将感谢您的一些见解。谢谢。

3 个答案:

答案 0 :(得分:2)

“效果很好”:这是不可能的

(*nNumArray <= &nNumArray[nSize-1]):您将 int 放入向量中(然后在其外部),将 int 的地址放入向量中(实际上是其结束)。先验的编译器会提示错误

此外,&nNumArray[nSize-1]不会是向量在第一个循环之后的结尾,因为您修改了 nNumArray

如果要使用指针,则可以使用其他变量来存储它,而不修改 nNumArray 并更改测试,例如(ptr <= &nNumArray[nSize-1])

#include <stdio.h>

int sumArray(int nNumArray[], int nSize)
{
    int nSum = 0;
    int * ptr = nNumArray;

    while(ptr <= &nNumArray[nSize-1])
    {
        nSum += *ptr++;
    }
    return nSum;
}

int main()
{
  int a[3] = {1,2,3};

  printf("%d\n", sumArray(a, 3));
  return 0;
}

答案 1 :(得分:2)

while循环条件不正确:

while(*nNumArray <= &nNumArray[nSize-1])

因为要比较整数(*nNumArray)和指针(&nNumArray[nSize-1])。编译器必须在此语句上发出警告消息。

您可以执行以下操作:

int sumArray(int nNumArray[], int nSize)
{
    int nSum = 0;

    while(nSize--)
    {
        nSum += *nNumArray;
        nNumArray++;
    }
    return nSum;
}

答案 2 :(得分:1)

第一个错误在这里:

(*nNumArray <= &nNumArray[nSize-1])

数组变量本身的名称在C语言中被视为指针,因此*nNumArray表示指针的引用。

它应该是nNumArray才能比较地址。

第二个错误

如果仅修复了第一个错误,它将无法完美运行。

索引操作如下:

&nNumArray[nSize-1]的工作原理与nNumArray + nSize - 1

因此while循环可能看起来像这样:

while(nNumArray <= nNumArray + nSize - 1){
    nSum += *nNumArray;
    nNumArray++;
}

(这样可以更容易发现哪里出了问题)

while循环将一直运行,直到*nNumArray访问了一个 int ,而该 int 不在导致分段错误的数组之外。

您可能希望通过使用另一个指针与nNumArray + nSize - 1进行比较,整个sumArray函数应如下所示:

int sumArray(int nNumArray[], int nSize)
{
    int nSum = 0;
    int *ptr = nNumArray;
    while(ptr <= nNumArray + nSize - 1)
    {
        nSum += *ptr;
        ptr++;
    }
    return nSum;
}

现在它应该可以正常工作了:)