2014-03-25 81 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 
相关问题