有人可以帮我清楚一些关于指针的混淆吗?在C.

时间:2016-08-08 15:59:12

标签: c

我现在理解的是。

int a = 100;
int *a_ptr; // creates pointer variable named a_ptr and points to type int
a_ptr = &a; // a_ptr is address of a
*a_ptr = 5; // value of pointer = value of a now set to 5.

我不明白的是,指针的意思是占据另一个变量的地址,因为它的正确值或内容不是吗?
如果值*a_ptr不应该是*a_ptr = &a;

Figure representing the concept

由于

2 个答案:

答案 0 :(得分:0)

将指针想象为路标:它告诉您在哪里可以找到某些东西。没有更多,没有更少。存在指针的价值/原因是因为它是我们实际上非常熟悉的概念。 C按值传递所有内容。让我们使用一个牵强附会的类比,我相信,这将为您清除一些事项:

想象一下,在度假并告诉别人你所住的酒店。不是详细描述,而是给对方一个名字,地址和或许更多细节可以帮助某人找到这个地方。您将 设置详细描述整个事物,也不会撕毁酒店并随身携带,更不用说每次告诉别人有关它时重建它

回到C:C按值传递所有内容。在这个类比中,这就像把每个人一对一的比例复制到你正在喋喋不休的酒店。这很昂贵,耗时且非常烦人。你给酒店副本的人可以改变它,但你永远不会知道:那里是一个共同的起点(原始酒店),但是每个副本都是相互独立的。这一点。

就像在现实生活中一样,你只需写下酒店的地址,然后把它交给家人和朋友。这就是C用指针做的事情:它会告诉你在哪里可以找到某些内容(struct hotelint),其他人可以使用该地址前往它。
另外一个好处是,如果你的一些朋友实际访问了那个地方,他们可以告诉你它在某些方面有所改变:颜色现在是绿色,而不是蓝色,所有者已经改变等等。

使用该地址,拥有地址的每个人都可以访问有关该地点的最新信息。
如果酒店关闭,地址变得毫无意义,但当然,如果有人使用你给他们的地址认为他们会留在一个好地方,他们会生气。接下来发生的事情很难预测(未定义的行为)。

所以恢复:

int x = 123;// a hotel
int *x_address = &x;//an address to the hotel
int *for_friend = &x;
int *friend2 = &x; // you can hand out sever addresses to the same hotel
*x_address += 1; // read this as *(travel to)x_address to arrive at hotel X, and stay += 1 night or something
//friend2 wants to see how many nights were spent in hotel x:
printf("%d\n", *friend2);//124 -> 123 originaly + *x_address += 1

如果x超出范围,那相当于酒店关闭。如果sombody *x_address(前往x),则其行为未定义。

我过去曾使用过不同的类比来解释你可以用什么方式查看指针以使它们更容易理解,我已经写了一段时间,不知道这是不是让事情更清楚,但我想我只是在这里发布链接:

Pointers are easy

答案 1 :(得分:0)

  

如果*a_ptr的值不应该是*a_ptr = &a;

*a_ptr是值,但&a不是值,即指向值的指针,因此它们具有不同的类型。

因此,可以通过指针*a_ptr = a设置值,或者可以将指针设置为指向值a_ptr = &a