2014-11-01 40 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