【问题标题】:Compare an integer and an address of a variable比较整数和变量的地址
【发布时间】:2014-11-01 12:04:13
【问题描述】:

我需要有关如何将变量的地址与整数进行比较的帮助。 //或者比较指针和整数的情况。//

要求程序应该有一个带有初始化值的数组。程序应同时显示值和值的地址。然后程序要求用户输入用户想要更改的值的地址。我想显示一条错误消息,例如“输入无效!”当程序检测到输入的地址不在可用地址中时。

样本输出应该是:

  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]);
        }
}

【问题讨论】:

  • 这看起来应该标记为 C,而不是 C++。
  • 看起来这行是你的问题:*pVar = temp;
  • 其实我的问题是这个(int*)temp==&amp;data[i])
  • Louie,之前有人问过非常相似的问题,例如here。将用户输入的整数转换为指针的结果有些不可预测(即,它是实现定义的)。因此,让用户直接输入地址并不是一个好主意。为什么不让用户简单地从地址列表中选择(即当用户输入“1”时,您使用列表中的第一个地址,“2”为第二个,等等)?
  • @jogojapan thnx 寻求帮助。但是在我们的编程类中,我们的程序需要输入需要更改的值的地址。 :(

标签: c pointers integer compare


【解决方案1】:

您需要做的是让用户输入一个数字,并将其解释为一个指针。首先你必须检查指针,然后你必须使用它。如果您需要将数字解释为指针,则需要进行类型转换。为了方便您自己,您应该这样做一次,并将结果用于检查和分配。

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

现在您的地址为temp。首先将 this 类型转换为指针;

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); 

【讨论】:

  • OP旁注:如果您愿意放宽将输入地址存储为int的要求,则应将其存储为uintptr_t,保证足够宽保存地址。
  • 谢谢!我会尝试根据您的建议修复我的程序:D
  • 我的程序可以在编译器不发出警告的情况下完成吗?如果没有,警告是坏的还是可以的?
  • 使用#pragma 可能会消除警告,但这取决于您使用的编译器。将 int 转换为 int* 通常是不好的,所以基本上,如果你做这样的事情,你想要一个编译器消息。所以你不应该禁用整个程序的警告,只是那一行。如果您保留 0 个警告,则您知道在收到警告时需要查看一些内容。否则你可能会完全忘记警告,并遇到奇怪的错误。
猜你喜欢
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
  • 2011-01-20
相关资源
最近更新 更多