已要求我对一个int数组求和并返回不使用索引的总和。 (函数需要获取数组和大小)
我知道我应该设置一个指向数组的指针,并将指针与数组地址进行比较,并使用指针++在数组上运行。
我写下了以下代码:
int sumArray(int nNumArray[], int nSize)
{
int nSum = 0;
while(*nNumArray <= &nNumArray[nSize-1])
{
nSum += *nNumArray;
nNumArray++;
}
return nSum;
}
效果很好
* nNumArray是指值,&nNumArray [nSize-1]是指地址。
我试图了解这种方式的工作原理。
将感谢您的一些见解。谢谢。
答案 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;
}
现在它应该可以正常工作了:)