[英]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.