以下代码:
int *a;
*a = 5;
很可能导致分段错误,我知道原因。
以下代码:
int a;
*a = 5;
甚至不会编译。 (gcc说:unary *的无效类型参数。)。
现在,指针只是一个整数,使用它 用于存储地址。 那么,如果我说:
,为什么会出现问题呢?*a = 5;
理想情况下,这也会导致分段错误。
答案 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的任何书籍。