非常基本的C问题

时间:2010-02-16 09:02:29

标签: c pointers

如果我错了,有人可以检查我的理解并纠正我吗?

int p = 5; //create an int holding 5
int *ptr; //create a pointer that can point to an int
*ptr = &p; // not sure - does this mean that my pointer now points to memory address   five, or that the memory address my pointer points at contains 5?

对不起基本问题 - 我很快就会有一个需要使用指针的assignmnet,我真的想在它设置之前破解基础知识。

8 个答案:

答案 0 :(得分:5)

几乎就是 - 将其更改为:

int p = 5; // create an int holding 5
int *ptr; // create a pointer that can point to an int
ptr = &p; // ptr now points at p

答案 1 :(得分:3)

你的程序错了。 ptr未初始化。分配给*ptr最有可能造成内存违规。您无法将int*&p是)分配给int*ptr是)。

正确的是:

ptr = &p;

答案 2 :(得分:1)

您的ptr现在指向存储了5的内存地址。

另外,我不相信代码编译。你可能想要:

int p = 5; //create an int holding 5
int *ptr; //create a pointer that can point to an int
ptr = &p; // not sure - does this mean that my pointer now points to memory address   five, or that the memory address my pointer points at contains 5?

答案 3 :(得分:1)

指针基本上是一个地址。将指针视为地址标签,将值视为实际的房屋。您可以使用标签查找房屋,但标签不是房屋。

int *ptr; // declares a pointer to an int

所以ptr本质上是一个内存地址。 (有可能C规范实际上没有指明它是一个地址,但是请耐心等待。)

int i = 5; // create a local int.

在堆栈上声明一个整数,并将其值设置为5. i的地址位于堆栈空间中的某个位置。

让我们看看继续之前的一个中间步骤。这可能不会编译,如果确实如此,实际上不会任何事情。

&i;

这个表达式的作用是返回变量i的地址。它是i在内存中的位置 - 整数的地址

最后一个......

*ptr;

同样,这可能实际上不会做任何事情,它只是一个表达。但是,它的作用是取消引用指针 - 它指的是位于ptr中包含的地址的实际int。

好的,让我们来看看我们可以做的一些事情。

ptr = i;

这没有任何作用,至少我们想要做的事情。可能不会编译,但我还没有检查出来。它没有做任何事情,因为它为整数的地址分配了一个整数。这就像在邮局寄一个方框到一个地址标签 - 你真的希望它去家里!

i = ptr;

好的,这与最后一个相同,但相反。按照我们的比喻,这是试图把房子变成一个标签!

*ptr = i;

这里我们取消引用指针,并为其分配i的值。取消引用指针基本上就像使用标签驱动到房子。一旦我们在那里,我们可以做实际的房子。这是有效的,因为取消引用的int指针是一个int,而int也是一个int。

ptr = &i;

这也有效。 & i基本上为房子“我”制作了一个新标签。由于我们在两侧都有一个指针,我们可以将一个指定给另一个。这基本上是将i的地址标签复制到名为ptr。

的地址标签
*ptr = &i;

这没有意义。我们从两个不同的东西开始,然后将每个东西转换成另一个!现在我们正在尝试为房子分配标签,而在我们将房屋分配给地址标签之前。

答案 4 :(得分:0)

你想要

ptr = &p; // set ptr to point to the location holding p

答案 5 :(得分:0)

其他人已经解释了如何修复代码。为了便于理解,让我告诉您错误行的作用:

*ptr = &p;

*ptr 取消引用指针,即*ptr = ...将某些内容分配到ptr所指向的内存插槽中。由于ptr尚未初始化,因此它指向内存中的某个未知位置,而*ptr = ...可能会因Segmentation Fault或类似内容而失败。

由于ptr是指向int的指针,*ptr = ...的右侧也需要一个int,但是传递给它的地址< / em>(&p),这会导致编译器警告。

答案 6 :(得分:0)

我知道这并没有直接回答你的直接问题(其他人已经做过),但我建议你阅读c-faq中的section on pointers

很多信息。

答案 7 :(得分:0)

int a = 5;

声明存储的指针类型

int * ptr;

将变量的地址分配给指针

PTR =安培;一个;