2010-01-29 45 views
1

我試圖使用一個數組來保存一個調查的輸入,每一邊都有相等的正值,但有一個指向數組中心的指針,因此可以使用負指針值訪問數組。指針,數組,printf

例如,數組的值將保持在0到30之間,指針將指向15,並且將提示用戶輸入介於-15和15之間的值,其中用戶值的數組將增加。

如果我的邏輯還不完全正確,但是我現在遇到的問題是遞增值(我不確定是否正確輸入ptr[userInput]++並輸出這些值值printf。我看到別人的帖子關於傳遞數組到printf實際上是傳遞一個指針到數組,而且這個人說要用**ptr(*ptr)[0]去引用它兩次,但我的編譯器(Mac XCode)似乎沒有。?。喜歡它

任何想法這是我的代碼,我評論在我的問題是:

#define ENDPOINT 15 
#define TERMINATE 999 
#define TEST_FILE "TestFile6.txt" 

void RecordOpinions(void) 
{ 
    int record[2 * ENDPOINT + 1]; 
    int *ptr = &record[ENDPOINT + 1]; 
    int userInput; 
    int loopCount = -ENDPOINT; 

    printf("ptr:%d\n", *ptr); // this was a test for me trying to figure out how to 
           // print the value of the ptr. 

    printf("Please enter your opinion of the new TV show, Modern Family from "); 
    printf("-%d(worst) to 0 to +%d(best). Entering %d ", ENDPOINT, ENDPOINT, TERMINATE); 
    printf("will terminate and tabulate your results: \n"); 

    scanf("%d", &userInput); 
    while (userInput != TERMINATE) { 
     if (userInput > ENDPOINT || userInput < -ENDPOINT) { 
      printf("Invalid entry. Enter rating again: "); 
     } 
     else { 
      printf("You entered: %d\n", userInput); 

      ptr[userInput]++;  // not sure if this is the right way to increment 
            // the array at the user's input value. 
     } 
     scanf("%d", &userInput); 
    } 
    printf("Rating entry terminated.\n"); 
    printf("Ratings:.\n"); 
    for (; loopCount <= ENDPOINT;) { 
     printf("%d\n", ptr[loopCount++]); // this part is where I also need help 
               // in trying to print out the value of 
               // the ptr, not the address. 
    } 
} 
+0

1+只是爲了說明您的疑慮並向我們展示代碼:) – Skurmedel 2010-01-29 17:43:54

+1

輸出是什麼? – 2010-01-29 17:45:20

回答

3

就您在問題中提出的直接問題而言,您的代碼非常好。即你正在正確地處理你的「雙面」數組(並且不,當你在數組中的值時,你不需要任何額外的引用)。

我看到的一個問題是,您忘記了初始化(將初始值分配給)您的record數組,這意味着輸出結果無論如何都將是垃圾,對於您如何使用它將產生嚴重後果。

此外,戴夫韓丁在評論中指出,如果你想使用-ENDPOINT+ENDPOINT範圍從ptr起源,你需要初始化你ptr&record[ENDPOINT],不與&record[ENDPOINT + 1]。否則,如果用戶輸入ENDPOINT值作爲索引,則最終會在右端出現越界訪問。 (並且record[0]的值將在左端始終保持未使用狀態。)

P.S.我會做出不少「風格」上的改變,但在這種情況下他們並不重要。

+1

我想他們也許意思是初始化'int * ptr =&record [ENDPOINT];'而不是'int * ptr =&record [ENDPOINT + 1];'。 – dave4420 2010-01-29 17:50:25

+0

@ Dave Hinton:是的,趕上! – AnT 2010-01-29 17:52:00

+0

感謝您的初始化幫助。這是有道理的。我現在面臨的問題是讓我自己相信戴夫所說的。我試圖把它畫出來,而且我的記錄值從0到30有31個值。但是如果我想讓ptr的原點爲+15和-15,是不是必須指向記錄陣列上的數字15,它實際上是數組的第16個索引?我的意思是我看到它實際上並沒有和ENDPOINT + 1一樣工作,而Dave是正確的,但我不明白爲什麼它不正確等於ENDPOINT + 1.再次感謝! – Crystal 2010-01-29 22:22:20

0

爲什麼不從用戶輸入的數字中減去15? I.E.

ptr[userInput - ENDPOINT]++; 

其中ptr指向數組的開始?這更容易理解,更傳統。

+0

恰恰相反。如果問題的本質要求將負指數和正指數都映射到數據,那麼OP使用的方法將更加優雅和可讀。事實上,這是慣用的。 – AnT 2010-01-29 18:02:57