我有点困惑,并试图寻找解释,但是所有被问到的“差异”问题都是关于type *name
与type* name
的,我知道答案。
我有这样的代码:
int a = 1;
printf("a = %d", a); // Prints 1
int *pt = a;
printf("pt = %d", pt); // Prints 1
*pt = 2; // Crash why? What am i pointing to here?
&pt = 2; // Not even compiling since
pt = 2; // Works
printf("pt = %d\n", pt); // Prints 2
printf("a = %d\n", a); // Prints 1
我知道,要更改a
的值,我应该先完成int *pt = &a
,然后再进行*pt = 2
,但这不是我的问题。
在这种情况下,我的问题是,使用int *pt = a
与使用int pt = a
相同还是将其用作指针有什么优势?
答案 0 :(得分:1)
int a = 1; ... int *pt = a;
尝试将值1
存储为指针pt
持有的地址。保证对pt
的任何取消引用都是SegFault的,因为address 1
处于系统保留的内存范围的最底端-您无法访问它,从而导致访问冲突和SegFault。 / p>
什么是指针?
指针只是一个普通变量,它以其他值作为地址。换句话说,指针指向可以找到其他内容的地址。在通常情况下,您会想到一个包含立即数的变量,例如int a = 5;
,指针将仅保存5
存储在内存中的地址,例如int *b = &a;
。无论指针指向哪种对象,其工作方式都相同。之所以可以这样工作,是因为指针的type
控制着指针的算术运算,例如:使用char *
指针,pointer+1
指向下一个字节,对于int *
指针(正常的4字节整数),pointer+1
将指向下一个{{1} }在int
之后的4个字节处偏移。 (因此,一个指针只是一个指针。...pointer
自动处理算术的地方)
所以在您的情况下:
type
将int a = 1;
...
int *pt = &a;
存储在内存中的地址分配给指针变量a
。然后,您可以通过取消引用pt
(例如pt
)来访问该地址的值
答案 1 :(得分:0)
您正在做的是将指针pt
指向的地址设置为a
当前所持有的地址(在您的情况下为1)。由于*a
绝对不是有效且可访问的地址,因此在尝试取消引用该地址时,很可能会遇到分段错误。这与您通过int *pt = 0
创建空指针有点相同,但是使用a中的值代替0即可。
请记住,将带符号的int转换为地址只会使整个事情变得更糟,这可能有些时髦。