另一个C指针问题

时间:2009-07-11 14:28:23

标签: c pointers

以下代码:

int *a;
*a = 5;

很可能导致分段错误,我知道原因。

以下代码:

int a;
*a = 5;

甚至不会编译。 (gcc说:unary *的无效类型参数。)。

现在,指针只是一个整数,使用它 用于存储地址。 那么,如果我说:

,为什么会出现问题呢?
*a = 5;

理想情况下,这也会导致分段错误。

6 个答案:

答案 0 :(得分:14)

指针不是整数。 C的数据类型为

a)防止某些编程错误,

b)提高程序的可移植性

在某些系统上,指针可能不是整数,因为它们实际上由两个整数(段和偏移)组成。在其他系统上,“int”类型不能用于表示指针,因为int是32位而指针是64位。由于这些原因,C不允许直接使用int作为指针。如果要使用足以容纳指针的整数类型,请使用intptr_t。

答案 1 :(得分:3)

当你说

int a;
*a = 5;

您正在尝试使编译器取消引用不是指针的内容。当然,您可以转换为指针然后取消引用它,就像这样,

*((int*)a) = 5;

..这告诉编译器你真的,真的想这样做。但是 - 这是一件冒险的事情。为什么?好吧,在你的例子中,例如,你从未真正初始化a的值,因此当你将它用作指针时,你将获得已经用于a的位置的任何值。因为它看起来像是一个局部变量,所以它将是函数堆栈框架中的一个非初始化位置,并且可以是任何。实质上,您将尝试将值5写入某个未确定的位置;这不是一件明智的事情!

答案 2 :(得分:2)

据说说明指针只存储地址,而地址可以被认为是数字,就像整数一样。但通常地址都有一个结构(如页码,页面内的偏移等)。

你不应该逐字逐句。一个整数字面上存储一个数字,您可以添加,减去等。但是您不能将其用作指针。整数是整数,指针是指针。它们用于不同的目的。

有时,从指针到整数的转换可能是必要的(出于任何目的 - 可能在OS内核中进行一些地址算术)。然后,您可以将指针强制转换为这样的整数类型,先前确定您的编译器是否保证正确的大小并保留值。但是如果要取消引用,则必须转回指针类型。

答案 3 :(得分:1)

在第一种情况下,你永远不会真正指定“a”。

int* a = ?
*a = 5; //BAD. What is 'a' exactly?

int a = ? //but some int anyway
*a = 5; //'a' is not a pointer!

如果您希望将整数用作指针,则必须先将其强制转换。指针可能整数,但在概念上它们用于不同的目的。

答案 4 :(得分:0)

运算符*是一元运算符,没有为整数数据类型定义。这就是声明

的原因

*a = 5;

不会编译。

此外,整数和指针不是一回事。它们在内存中的大小通常相同(32位系统为4个字节)。

答案 5 :(得分:-4)

int * a - 是指向int的指针。它没有任何意义,你没有初始化它。在询问此类问题之前,请阅读有关C的任何书籍。