2014-03-25 124 views
1

我有一個函數(從教程)爲什麼數組指針打印不正確?

int* func(int *arr, int n){ 
    if(n==1 || n==0) 
     return arr; 
    else{ 
     int temp=arr[0]; 
     arr[0]=arr[n-1]; 
     arr[n-1]=temp; 
     return func(++arr,n-2); 
    } 
} 

我幹運行它,得到它會扭轉陣列,非常好。我得到的結果時,使用這段代碼

int x[]={1,2,3,4,5,6,7,8,9}; 
int i; 
func(x,9); 
for(i=0;i<9;i++) 
{ 
    printf("%d\n",x[i]); 
} 

但在使用指針下面的代碼

int x[]={1,2,3,4,5,6,7,8,9}; 
int* p; 
p = func(x,9); 
for(i=0;i<9;i++) 
{ 
    printf("%d\n",*(p+i)); 
} 

弱時請說明你回答讓垃圾值我預期。

+0

哪裏指針通過FUNC點回來了? – Broseph

+0

@Broseph'p = func(x,9);'也許?我不確定。 –

+0

查看func的代碼,並按照指針arr。它會發生什麼? – Broseph

回答

4

你的問題是遞歸,而不是指針。可視化的遞歸調用,返回的指針指向第5個元素:

func([1, 2, 3, 4, 5, 6, 7, 8, 9], 9) -> 
func([2, 3, 4, 5, 6, 7, 8, 1], 7) -> 
func([3, 4, 5, 6, 7, 2, 1], 5) -> 
func([4, 5, 6, 3, 2, 1], 3) -> 
func([5, 4, 3, 2, 1], 1) -> 
[5, 4, 3, 2, 1] 

從評論:

這可能說明它更好,我遞增陣列打印之前,所以你可以看到什麼陣列看起來像在遞歸調用:http://ideone.com/lzgEUX

+0

但是第一次迭代後不應該是'func([9,2,3,4,5,6,7,8,1],7)'。如果沒有,那麼這是怎麼發生http://ideone.com/62HcYW? –

+0

@tintinmj @tintinmj這就是數組中發生的事情,但傳遞的指針正在遞增以指向數組中的下一個項目。 – Broseph

+0

但是第一次遞歸後呢? '9'去了哪裏? –

1

看看這個代碼:

#include <stdio.h> 

int* func(int* arr, int n){ 
    if (n==1 || n==0) 
     return arr; //remember this is the pointer we've been incrementing 
    int temp = *arr; //instead of using bracket, I'm translating to pointer 
    *arr = *(arr + n - 1); //arithmetic so it is more clear that we are 
    *(arr + n - 1) = temp; //merely manipulating a pointer to an int. 
    return func(arr + 1, n - 2); //the pointer is incremented! 
} 


int main(int argc, char** args){ 
    int x[]={1,2,3,4,5,6,7,8,9}; //initialize our array 
    int i=-4; //this is how much we need to offset the returned pointer 
    int* p = func(x,9); //get the returned pointer 
    for(;i<5;i++) 
     printf("%d\n", *(p+i)); //print out each element of the array 
    return 0; 
} 
1

所以當遞歸算法完成後,基金會返回一個指向arr中第5個元素的指針。因此,您的打印語句:printf("%d\n",*(p+i));將從第5個元素開始打印,並向前打印9個字段。當它在第9個元素之後嘗試打印元素時,您將獲得垃圾值。

我試圖想象它是這樣,也許它可以幫助:

arr = 0   // as non-relative pointer to element 
temp = 1 
arr[0] = 9 
arr[8] = 1 
func(arr=1, n = 7) 
    arr = 1 
    temp = 2 
    arr[1] = 8 
    arr[7] = 2 
    func (arr=2, n = 5) 
     arr = 2 
     temp = 3 
     arr[2] = 7 
     arr[6] = 3 
     func (arr=3, n = 3) 
      arr = 3 
      temp = 4 
      arr[3] = 6 
      arr[5] = 4 
      func (arr=4, n = 1) 
       arr = 4 
       n == 1 
       return arr = 4 
      return 4 
     return 4 
    return 4 
return 4 
p = 4 
相關問題