我们可以将变量与指针变量区分开来

时间:2011-09-29 07:00:40

标签: c

昨天当我在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位系统架构。

6 个答案:

答案 0 :(得分:8)

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

所以真正的问题是某些东西是否是指针。

不,没有任何功能可以告诉你某些东西是否是指针。如果你考虑一下,用像C这样的静态类型语言就不可能。函数接受某些指定类型的参数。除非首先将类型(指针或其他方式)正确,否则不能将变量传递给函数。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

例如:

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不是指针(数组)。

答案 3 :(得分:1)

三件事:

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

答案 4 :(得分:0)

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

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

......甚至:

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

当您在代码中看到变量时,可以很容易地告诉类型。有些人使用相当多的前缀,以区分各种类型。

尝试查看“匈牙利表示法”作为示例。

答案 5 :(得分:-1)

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