【问题标题】:Can we differentiate a variable against a pointer variable我们可以区分变量和指针变量吗
【发布时间】:2011-09-29 07:00:39
【问题描述】:

昨天我在用 C 编码时,我的朋友问我指向一个变量是指针还是变量?我坚持了一会儿。我没有找到答案,我只需要回去搜索并告诉他。但我在想是否有任何功能可以区分它们。 我们可以区分变量和指针变量吗

int a;
sizeof(a); // gives 2 bytes
int *b;
sizeof(b); // gives 2 bytes
// if we use sizeof() we get same answer and we cant say which is pointer
// and which is a variable

有没有办法找出一个变量是普通变量还是指针?我的意思是有人可以在查看您在开始时声明的变量然后再往下写 1000 行代码后说它是指针还是变量?

评论后 我想明确地说它是一个 16 位系统架构。

【问题讨论】:

  • 认真的吗? sizeof(int) = 2 bytes?!?!?!?!那台机器/编译器多大了?
  • 我用的是turbo c 1989 borlando!
  • 我不知道你还能找到 C64 的 C 编译器。
  • @niko - 没那么多。您使用的是老式编译器。

标签: c


【解决方案1】:

首先,“是指针还是变量”这个问题没有多大意义。指针变量一个变量,就像一个整数变量,或者一个数组变量,是一个变量。

所以真正的问题是某物是否是指针。

不,没有函数可以告诉您某物是否是指针。如果你想一想,在像 C 这样的静态类型语言中,不可能有。函数采用某些指定类型的参数。除非类型(指针或其他)首先是正确的,否则不能将变量传递给函数。

【讨论】:

  • 尽管在具有模板和函数重载的 C++ 中,如果参数表达式具有指针类型则返回 true 否则返回 false 的函数(嗯,函数集)很容易。请注意为数组返回 false 。 C++ 和 C 一样是静态类型语言,不同的是它有一堆 C 没有的额外工具。
【解决方案2】:

您的意思是在运行时区分它们而不查看代码?不,你不能。指针是保存内存地址的变量。您无法在运行时检查它。这意味着,没有这样的函数isPointer(n) 会根据参数n 返回真/假。

【讨论】:

  • 不,指针不是整数。指针是指针。它们可能以类似于整数的方式在内部表示 - 但 所有 对象都是。
  • @Keith Thompson,我的意思是你不能用任何方法说这是一个普通的 int 还是 int * 。如有错误请指正。
  • 你说得对;指针与整数的概念在编译时是相关的,并且没有运行时方法来区分它们。我只是不同意您关于“指针是整数......”的说法。它们不是,就像浮点对象是整数一样(尽管它们是由位组成的)。
  • 我同意这不是正确的语言。我已经改变了。感谢您指出这一点。
【解决方案3】:

您可以从使用中推断出类型。

例如:

char* c;
...
c[0] = 'a';
*c = 'a';

索引和取消引用会让您知道它是一个指向某物的指针(或者如果定义为 char c[SOME_POSITIVE_NUMBER]; 则它是一个数组)。 此外,像 memset(c,...)、memcpy(c,...) 这样的东西会暗示 c 是一个指针(数组)。

OTOH,你通常不能用指针做大部分算术,所以,如果你看到类似

x = c * 2;
y = 3 / c;
z = c << 1;
w = 1 & c;

那么 c 不是指针(数组)。

【讨论】:

    【解决方案4】:

    三件事:

    1. 您使用的是哪个平台,其中 sizeof(int) 返回 2?认真的
    2. 指针是类型。指向 int 的指针是一种类型,就像 int 一样。类型的大小和指向该类型的指针有时相等但不直接相关;例如,指向双精度的指针(至少在我的机器上)的大小为 4 字节,而双精度的大小为 8 字节。 sizeof() 将是一个非常糟糕的测试,即使在某些情况下这种测试是合适的(不存在)。
    3. C 是一种严格类型的语言,您的问题在这种情况下并没有真正的意义。作为程序员,您确切地知道 a 是什么,并且您将照此使用它。

    【讨论】:

      【解决方案5】:

      如果您希望在源代码中看到变量时能够判断它是否为指针,但又不回头查看声明,一种常见的方法是在方式中指出它你命名你的变量。例如,您可以在指针名称的开头添加一个“p”:

      int *pValue; /* starts with 'p' for 'pointer' */
      int iOther;  /* 'i' for 'integer' */
      

      ...甚至:

      int *piSomething; /* 'pi' for 'Pointer to Integer' */
      

      当您在代码中看到变量时,这样可以很容易地分辨出类型。有些人使用相当多的前缀,来区分相当多的类型。

      尝试查找“Hungarian notation”以获取示例。

      【讨论】:

      • 你比我快了大约 10 秒,但这只是因为我要将 URL 添加到 Wiki :) - en.wikipedia.org/wiki/Hungarian_notation
      • 这是什么年?我们的理解和 niio 的要求..!!! Dmitri +1 理解这个问题..否则我们都知道这个答案
      【解决方案6】:

      不,你不能。 以及用途是什么,因为每次运行代码时指针地址都会不同?但是你可以减去两个指针,也可以得到任何指针的内存地址值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-03
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        相关资源
        最近更新 更多