2014-11-01 2 views
0

Мне нужна помощь в том, как сравнить адрес переменной с целым числом. // или случай сравнения указателей с целыми числами. //Сравните целое число и адрес переменной

Необходимо, чтобы программа имела массив с инициализированными значениями. Программа должна отображать как значение, так и адрес значений. Затем программа просит пользователя ввести адрес значения, которое пользователь хочет изменить. Я хочу показать сообщение об ошибке, например «Invalid Input!» когда программа обнаруживает, что введенный адрес не входит в число доступных адресов.

вывод должен быть:

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

+0

выглядит так: ваша строка: '* pVar = temp;' – wimh

+0

Почему это? :) – Louie

ответ

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, вам не нужны pVar и var.

scanf, вероятно, сделает все, что вам нужно, но это очень запутанно, поскольку вы делаете неявный тип;

scanf("%d", *pVar); 

*pVar является INT, но scanf ожидает int *. Если вы действительно этого захотите, для этого нужен достойный комментарий, объясняющий другим, кто читает код, что вы здесь делаете. Без этого кто-либо другой просто отметит эту строку как ошибочную.

Если вы используете tempptr вместо этого, вы используете int * где зсапЕ ожидает int *

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

Боковое примечание для OP : если вы хотите отменить требование сохранения входного адреса в 'int', вы должны сохранить его в' uintptr_t', который, как гарантируется, будет достаточно широким для хранения адреса. –

+0

thnx! программа с вашими предложениями: D – Louie

+0

Может ли моя программа выполняться без компилятора, выдающего предупреждение? Если нет, есть предупреждение плохое или все в порядке? – Louie

Смежные вопросы