如果我错了,有人可以检查我的理解并纠正我吗?
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,我真的想在它设置之前破解基础知识。
答案 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 =安培;一个;