繁体   English   中英

用指针访问数组,给出一个额外的元素

[英]accessing array with pointer giving an extra element

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

g ++编译器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:我知道,当while遇到数组中的0时,它将终止,或者如果未找到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中断,为什么会在0中断
每次arrayLength + 1吗? 还有这个偶数长度是什么?

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

我认为您的误解来自以下事实:您没有意识到int*只是一个内存地址,每当您将++arr递增时,您基本上都是通过sizeof(int)对其进行调整。 仅此而已,当您到达数组的末尾时,地址仅指向数组之后的任意值。

之所以得到额外的元素,是因为指针没有什么可告诉编译器指针指向多少元素的。 当你做

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

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

我认为与其他数据类型相比,char数组(c字符串)的工作方式可能令人困惑。 当你有

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

这在数组的末尾结束,因为c字符串会自动将null终止符(0)添加到字符串的末尾。 这使您可以执行上述循环之类的操作,因为您知道null终止符将在那里,如果不存在则终止于您创建字符串的人。

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

while(*arr)东西是不正确的。 仅当该指针指向的某个值为零时,它才会停止。 但是谁说放在数组的末尾呢? 当您增加arr ,您可以轻松地超出数组的范围(该函数不知道其大小!),然后*arr将为您提供当前存储在arr指向的内存地址中的任何内容。

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

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

您需要先对INT-Array进行计数,然后才能将它们传递到类似的内容中,例如,此处以Pointer结尾的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 ++无法知道您的指针指向多少元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM