int * val = otherVal和int val = otherVal之间的指针差

时间:2018-12-13 23:52:36

标签: c

我有点困惑,并试图寻找解释,但是所有被问到的“差异”问题都是关于type *nametype* 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相同还是将其用作指针有什么优势?

2 个答案:

答案 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转换为地址只会使整个事情变得更糟,这可能有些时髦。