2015-05-23 24 views
0

我剛開始學習編程,我正在做一個單元,在我的工程課程中,我碰到過指針。我只是想要一些保證,我真正理解這個概念正確地使用指針作爲函數中的參數。如果我理解正確,那麼即使它是調用函數範圍內的局部變量,也會將指針傳遞給您希望被調用的單獨函數更改的變量的地址。那有意義嗎?我從我的文本書中重新編寫了一個例子。唯一的辦法是他們把它放在兩個不完整的部分中,然後我把它們放在一起,填入空格並在主函數中添加最終的printf語句。我會貼在這裏:C爲新手指針

#include <stdio.h> 
#include <stdlib.h> 

#define READ_OK 0 
#define READ_ERROR 1 

int read_num(int lo, int hi, int *num); 

int main(int argc, char *argv[]) 
{ 
    int lo = 0, hi = 0, *num, val; 
    printf("Please enter a lower bound and an upper bound for your range,respectively\nLower: "); 
    scanf("%d", &lo); 
    printf("Upper: "); 
    scanf("%d", &hi); 
    num = &val; 
    if(read_num(lo,hi, &val) != READ_OK) 
    { 
     printf("Read error, program abort\n"); 
     exit(EXIT_FAILURE); 
    } 
    else 
    { 
     printf("You entered %d, press any key to continue: \n", val); 
     getchar(); 
    } 
    return 0; 
} 

int read_num(int lo, int hi, int *num) 
{ 
    int next; 
    printf("Enter a number between %d and %d: ", lo, hi); 
    while(scanf("%d", &next)==1) 
    { 
     if (lo<=next && next<=hi) 
     { 
      *num = next; 
      return READ_OK; 
     } 
     printf("%d is not between %d and %d\nTry again: ", next, lo, hi); 
    } 
    return READ_ERROR; 
} 

那麼我的理解是否正確? 「val」在read_num()中通過以指針「* num」的形式傳遞地址來修改,然後寫入「next」的值? PS:這句法正確嗎?PPS:這個過程會被稱爲什麼?

多謝您的幫助:)

+1

我不認爲你需要''main()'裏面的num * – Subinoy

+3

是的,代碼和你在最後一句中說的是正確的。不過,'main'中的'num'變量是不必要的。你賦值給它一次,而不再使用它(請注意,'read_num'中的int * num是一個完全不同的變量)。 – szczurcio

+1

@szczurcio完全不同的含義是儘管他們擁有相同的地址,但它們存儲在不同的地方,所以改變它們的值不會影響其他地方,但是改變它的ponitee的值會影響原始變量'val',無論你是在'main()'還是在'read_num()'中執行,儘管你從不使用'num',你只是初始化了它,所以使用gcc和警告會引發爭論。 –

回答

0

*num不是main()函數內部必要的。由於您在read_num()內傳遞val的地址,所以當您使用該地址時,read_num()的任何更改也會影響main()中的值。

在你的程序中,你基本上使用了兩個不同的指針 - 一個是在num內,另一個在read_num()裏面也是num,爲了更多的理解,請參閱c中變量的作用域。由於valmain之內,因此您不需要在此處使用指針,因爲您可以從主中更改值,因爲它是本地值。當您要將val的值從主變量以外或變量範圍之外更改時,您將需要指針。

+0

哇感謝快速支持的人,真的很感謝幫助:)甜,我得到了你們的一切,對冗餘'num'有意義。再次感謝,這真的會幫助我在我的最後作業:) – Rian199

+0

我認爲你是新的,請參閱http://stackoverflow.com/help/someone-answers @ Rian199 – Subinoy