簡體   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