使用指针跨越INTEGER数组中的所有元素

kr8*_*r85 2 c c++ arrays pointers

有没有办法使用指针跨越整数数组中的所有元素(类似于使用指针跨越字符串元素).我知道整数数组不是NULL终止所以当我尝试使用指针溢出数组时溢出.所以我添加NULL作为数组的最后一个元素,它工作得很好.

int array[7]={1,12,41,45,58,68,NULL};
int *i;
for(i=array;*i;i++)
    printf("%d ",*i);
Run Code Online (Sandbox Code Playgroud)

但是,如果数组中的一个元素为0,那将表现为NULL.是否有任何其他方法可以实现指针跨越整数数组中的所有元素?

In *_*ico 5

通常,除非您选择不属于有效数据范围的标记值,否则不会.例如,有效范围可能是正数,因此您可以使用负数-1作为指示数组末尾的标记值.这是C风格的字符串如何工作; 使用NULL终结符是因为它超出了可以表示字符的有效整数范围.

但是,通常最好以某种方式将数组指针与指示数组大小的另一个变量配对,或者将另一个指针指向数组的一端.

在您的具体情况下,您可以执行以下操作:

// Note that you don't have to specify the length of the array.
int array[] = {1,12,41,45,58,68};
// Let the compiler count the number of elements for us.
int arraySize = sizeof(array)/sizeof(int);
// or int arraySize = sizeof(array)/sizeof(array[0]);

int main()
{
    int* i;
    for(i = array; i != array + arraySize; i++)
        printf("%d ",*i);
}
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

int arrayBegin[] = {1,12,41,45,58,68};
int* arrayEnd = arrayBegin + sizeof(arrayBegin)/sizeof(arrayBegin[0]);

int main()
{
    int* i;
    for(i = arrayBegin; i != arrayEnd; i++)
        printf("%d ",*i);
}
Run Code Online (Sandbox Code Playgroud)

但是只给出一个指针,你不知道它指向的数组有多长.实际上,你甚至无法判断指针是指向数组还是单个对象!(至少不便携.)

如果你有必须接受数组的函数,要么你的函数需要:

  • 指针指针指向的数组的大小,
  • 或者两个指针,一个指向数组的第一个元素,一个指向数组的一个接一个结尾.