2012-09-09 24 views
1

所以我想學C,現在,我有兩個功能:一個數組中的元素移位:換擋元件 - 基於指針的

void shift(int a[], int n) { 
    int i; 
    for(i = 0; i != n-1; i++){ 
     a[i] = a[i+1]; 
    } 
} 

和版本相同的功能,除了指針型:

void pointer_shift(int *a[], int n) { 
    int i; 
    for (i = 0; i != n - 1; i++) { 
     *a[i] = *a[i + 1]; 
    } 
} 

我不知道基於指針的版本是否正確與否,但我想我的最重要的問題是我應該如何實際測試無論是/工作。除了這兩個函數的定義,我有:

#include <stdio.h> 

void shift(int a[], int n); 
void pointer_shift(int *a[], int n); 

int main(void) { 
    printf("Begin execution of testing Problem 1\n"); 
    int a1[] = {100, 101, 102}; 
    int i; 
    for(i = 0; i<3;i++) 
     printf("Before Shift: " "%d\n", a1[i]); 
    //shift(a1, 3); 
    pointer_shift(&a1, 3); 
    for(i = 0; i<3;i++) 
     printf("After Shift In Main: " "%d\n", a1[i]); 
    return 0; 
} 

移(A1,3)

工作正常,但我爲我的生活,也無法弄清楚如何正確測試pointer_shift。

我得到兩個錯誤;一個是,在線路

pointer_shift(& A1,3)

我傳遞參數1不兼容的指針類型。另一個錯誤是無法解讀的,但我希望問題會很明顯,有人能夠幫助我。所以......如何在我的主要測試我的兩個功能?

謝謝!

+0

這是一個非主題 - 但是當你使用C++ 11時,最好使用指向數組的指針std :: array。 – 2012-09-09 09:19:41

回答

3

改變你的指針基於函數是這樣的:

void pointer_shift(int *a, int n) { 
    int i; 
    for (i = 0; i != n - 1; i++) { 
     *(a+i) = *(a+i+1); 
    } 
} 

你所接受是一個指針數組,而你從main傳遞一個數組。由於數組衰減爲指針,因此在這裏調用shift(a1, 3)就足夠了。

2

變化的函數原型接受這樣

*(a+1) = 4; 

int*

void pointer_shift(int *a, int n) 

,然後訪問數組元素是一樣的

a[1] = 4; 

你仍然可以把它使用數組變量的同樣方式,因爲數組衰減到一個點r作爲函數的參數傳遞給它們的第一個元素時

+0

感謝您的幫助! –

-1

您的第一個函數已經是基於指針的。當您定義int[]類型的函數參數時,編譯器會像處理指針類型int*一樣對待它。所以函數可以傳遞一個指針或一個數組(它會自動轉換爲指針)。

如果將函數原型更改爲接受int *a而不是int a[],則該函數將完全相同。

你的第二個函數不起作用,因爲它需要一個指向int的指針數組,這不是你想要的。

0
int main(void) { 
    printf("Begin execution of testing Problem 1\n"); 
    int a1[] = {100, 101, 102}; 
    int *array_of_pointers[3]; 
    int i; 

    array_of_pointers[0]= &a1[0]; 
    array_of_pointers[1]= &a1[1]; 
    array_of_pointers[2]= &a1[2]; 

    for(i = 0; i<3;i++) 
     printf("Before Shift: " "%d %p\n ", a1[i], array_of_pointers[i]); 

/* 
    same as passing a1, the address of the array is 
    the same value as the value of the array, just a different type 
*/ 
    pointer_shift(array_of_pointers, 3); 
    printf("After Shift, note that array_of_pointers has not shifted:\n"); 
    for(i = 0; i<3;i++) 
     printf("After Shift In Main: " "%d %p\n", a1[i], array_of_pointers[i]); 
    return 0; 
} 

pointer_shift 需要一個指針數組,而不是int數組。 此處的「移位」不在數組中,而是位於數組中元素指向的數值中, 數組元素的值保持不變!