2014-11-01 41 views
0

我需要幫助,瞭解如何將變量的地址與整數進行比較。 //或者將指針與整數進行比較//比較變量的整數和地址

需要程序應該有一個帶有初始化值的數組。程序應該顯示值的值和地址。然後程序要求用戶輸入用戶想要改變的值的地址。我想顯示一個錯誤消息,如「無效的輸入!」當程序檢測到輸入的地址不在可用地址中時。

樣本輸出應該是:

data[1] = 11 
    data[2] = 22 
    data[3] = 33 
    data[4] = 44 

    address[1] = 2538816 
    address[2] = 2538820 
    address[3] = 2538824 
    address[4] = 2538828 

    enter address: 2538888 
    Invalid Input! 

我已經創建的代碼,它的工作原理,但它給我一個警告,因爲我鑄造錯了(我知道鑄造是不適合我需要什麼)。 我唯一關注的是:

  • 用戶從可用地址向int變量輸入一個地址。
  • 用戶輸入的地址應與可用地址進行比較。 (這是問題)
  • 如果輸入的地址是可用的地址之一,則用戶將改變存儲在用戶輸入的地址上的值。
  • 如果沒有,程序應該顯示無效輸入!

也用於該程序的要求是,當「程序要求用戶輸入的地址。該地址被存儲在臨時int變量,然後複製到整數指針」。

main() 
{ 
    int var = 4, temp; 
    int data[5]={11, 22, 33, 44}; 
    int* pVar; 
    pVar = &var; 
    char choice; 
    void display(int, int*); 

    while(1) 
    { 
     display(var,data); 

     while(1) 
     { 
      printf("\nEnter address: "); 
      scanf("%d", &temp); 
      int check=0; 

      for(int i=0; i<4; i++) 
      { 
       if((int*)temp==&data[i]) 
       { 
        check=1; 
        break; 
       } 
      } 
      if(check==1) 
      { 
       *pVar = temp; 
       break; 
      } 
      else 
      { 
       printf("Invalid Input!\n"); 
      } 
     } 

     printf("Enter integer: "); 
     scanf("%d", *pVar); 

     display(var,data); 

     while(1) 
     { 
      getchar(); 
      printf("\n\nDo you want to restart? [Y] Yes or [N] No: "); 
      scanf("%c", &choice); 

      if(choice=='Y'||choice=='y'||choice=='N'||choice=='n') 
      { 
       break; 
      } 
      else 
      { 
       printf("Invalid Input!\n"); 
      } 
     } 

     if(choice=='N'||choice=='n') 
     { 
      break; 
     } 
    }//endline13 
system("PAUSE"); 
} 

void display(int var, int data[4]) 
{ 
    system("cls"); 
     printf("Values---------------------------*\n\n"); 
     printf("var = %d\n\n", var); 

     for(int i=0; i<4; i++) 
     { 
      printf("data[%i] = %i\n", i, data[i]); 
     } 

     printf("\nAddresses---------------------------*\n\n"); 
     printf("Address of variable = %d\n\n", &var); 

     for(int i=0; i<4; i++) 
     { 
      printf("Address of data[%i] = %i\n", i, &data[i]); 
     } 
} 
+1

這看起來應該被標記爲C,而不是C++。 – user657267 2014-11-01 12:06:43

+0

看起來像這條線是你的問題:'* pVar = temp;' – wimh 2014-11-01 12:10:56

+0

這是爲什麼? :) – Louie 2014-11-01 12:11:28

回答

2

你需要做的是讓用戶輸入一個數字,並將其解釋爲一個指針。首先你必須檢查指針,然後你必須使用它。如果你需要將一個數字解釋爲一個指針,你需要一個類型轉換。爲了讓自己更容易,你應該這樣做一次,並將結果用於檢查和分配。

int temp; 
scanf("%d", &temp); 

現在您有地址temp。首先將這個轉換爲一個指針;

int *tempptr; 
tempptr = (int*)temp; // compiler will issue a warning for this. 

注意如果int的大小是相同的int *規模才能做到這一點,就可以生成一個編譯器錯誤,如果它是不是:

#if sizeof(int) != sizeof(int *) 
#error cannot typecast int to int * 
#endif 

我相信你檢查的方式是正確的,但你現在可以使用tempptr代替

//if((int*)temp == &data[i]) 
if (tempptr == &data[i]) 

這就奇怪了:

int var = 4; 
int* pVar; 
pVar = &var; 
*pVar = temp; // this means: var = temp 

在這裏,您不再將temp用作指針,而是再次用作整數。 如果您使用tempptr,則不需要pVarvar

scanf可能會做你所需要的,但它是非常混亂,因爲你正在做一個隱式類型轉換;

scanf("%d", *pVar); 

*pVar是int,但scanf期望一個int *。如果你真的想要這樣做,它需要一個體面的評論解釋給閱讀代碼你在這裏做什麼的人。沒有它,任何人都會簡單地將這條線標記爲錯誤。

如果使用tempptr而是使用一個int *其中scanf的期待一個int *

scanf("%d", tempptr); 
+0

OP的備註:如果你願意放寬輸入地址到'int'的存儲要求,你應該把它存儲到一個'uintptr_t'中,它保證足夠寬以容納一個地址。 – 2014-11-01 12:31:03

+0

thnx!我試着修復我的程序與您的建議:D – Louie 2014-11-01 12:35:33

+0

我的程序可以在沒有編譯器發出警告的情況下完成嗎?如果沒有,警告是壞的還是可以的? – Louie 2014-11-01 12:41:42