C指针:解释程序概念

时间:2015-09-19 12:27:23

标签: c pointers

我正在学习指针基础知识。请查看我的示例代码并告诉我发生了什么。

void main()
{
     int i, *j;
     i = 2;
     j = i;
     printf("%d", j);
     printf("\n%d", j + 1);
     printf("\n%d", j + 2);
}

我的输出是

2 6 10

请解释我..

1 个答案:

答案 0 :(得分:5)

您看到的输出是因为您在编写0x02时将地址j指定给指针j + 1,您将其递增1与递增它的相同sizeof(int)sizeof(*j)的地址相同。

但是行为实际上是未定义的commented here最初是Filipe Gonçalves,而my question - hereKninnug

回复
  

C11 §6.5.6/ 8:

     

[..]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。 [..]

您可以查看官方文档以了解更多信息。

此外,您的printf()调用是未定义行为的原因。您应该使用%p说明符打印指针并将指针强制转换为void *,如果您希望赋值正确,则还应将地址强制转换为int *以使其正常工作

如果您的系统是64位,则将i转换为(int *)可能也不够。

该行

j = i;
如果您取消引用j

可能会导致未定义的行为。

你不应该用指针指定一个整数,也许你的意思是

j = &i;

否则启用编译警告,编译器应警告您错误的分配,尽管它有效不正确

注意main()返回int,您已将其声明/定义为未返回值。