使用指针访问数组,提供额外的元素

时间:2016-05-09 13:38:36

标签: c++ arrays pointers

确定一个非常基本的问题,但我坚持不懈。我无法弄清楚数组末尾的额外神秘值。我只是试图通过它的基地址遍历数组,简单明了。但是每次执行时,数组末尾的垃圾值都保持不变

g ++ complier 64位机器。

#include<iostream>
#include<bits/stdc++.h>

using namespace std;

void printarray(int * arr){
   while(*(arr)){ cout<<*arr<<" "; arr++; }
   cout<<endl; 
}

int main(){
   int arr[] = { 3,2,4,1,5 };
   printarray(arr); // prints 3,2,4,1,5,32765
   return 0;
}

编辑1:我知道只要遇到数组中的0,while就会终止,或者如果没有找到0就会疯狂。但我仍然希望你们看看下面的测试用例

3,2,0,4,1,5  // outputs 3,2
3,2,4,1,5,7,8,9 // outputs same array correctly
3,2,4,1,5,7,8,9,10 // outputs array+ 1 varying garbage at last

//observations, this method works for even sized arrays not containing              
//0, while for odd it emits an additional garbage value.

我的问题是,如果while只在0处突破,为什么它会在wh处中断  arrayLength + 1每次?这个奇怪的长度又是什么呢?

4 个答案:

答案 0 :(得分:5)

数组不会以任何特殊方式终止。你要做的是不行,因为while(*arr)依赖于错误的假设:数组末尾有一个0元素(sentinel)但是你声明了数组一个{3,2,4,1,5}所以没有结束元素。

我认为你的误解来自这样一个事实,即你没有明白int*只是一个记忆地址,每当你按++arr递增它时,你基本上都会调整它{{1} }}。没有更多,当你到达数组的末尾然后地址只是指向数组之后,无论那里有什么价值。

答案 1 :(得分:2)

你得到了额外的元素,因为没有关于指针告诉编译器指针指向多少元素的指针。当你这样做

while(*(arr)){...}

while循环将继续运行直到*arr == 0。由于数组不包含0,因此它将继续越过数组的末尾,直到它找到0。这是未定义的行为,因为您正在使用该指针访问您不拥有的内存。

我认为你可能会混淆char数组(c-strings)与其他数据类型相比如何工作。当你有

char arr[] = "something";
while(*(arr)){...}

这结束于数组的末尾,因为c-strings会自动将一个空终止符(0)添加到字符串的末尾。这允许你做上面循环之类的事情,因为你知道null终止符将在那里,如果不是那么那就是你创建字符串的人。

答案 2 :(得分:1)

数组在传递给函数时会衰减为指针,并且此函数对数组的长度一无所知。

while(*arr)内容不正确。只有当此指针指向的某个值为时,它才会停止。但谁说放在数组的末尾?当你增加arr时,你可以很容易地超出数组的范围(函数不知道它的大小!),然后*arr将为你提供存储的内容。内存地址arr指向此刻。

迭代数组,传递数组本身及其长度。否则,这将反复迭代,直到*arr的值为零。

答案 3 :(得分:0)

指针不会被任何字符在C ++中终止。 这适用于其他类型,例如char*,因为它以\0(0)终止。

INT-Array你需要先对Elements进行计数才能将它们传递给类似的东西,例如这里的指针结尾为5:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
void printarray(int * arr){
    int *saved=arr;
   while(*saved!=5)
   { 
    cout<<*saved++<<" ";  
   }
   *saved=0;
   cout<<endl; 
}

int main(){
   int arr[] = { 3, 2, 4, 1, 5 };
   printarray(arr); // prints now without ending 5.
   return 0;
}

否则,您需要传递元素的计数器。 C ++无法知道指针指向的元素数量。