假设*ptr
指向变量。 *ptr
,&ptr
和ptr
各自意味着什么?
很多时候,我对它们感到困惑。有人介意澄清这些陈述并给出一些具体的例子吗?
答案 0 :(得分:8)
在函数中使用以下变量。
int i = 0;
int* ptr = &i;
在函数中,内存布局可能类似于:
与i
对应的内存:
+---+---+---+---+
| 0 |
+---+---+---+---+
^
|
Address of i
与ptr
对应的内存:
+---+---+---+---+
| address of i |
+---+---+---+---+
^
|
Address of ptr
在上面的场景中,
*ptr == i == 0
ptr == address of i == address of memory location where the vale of i is stored
&ptr == address of ptr == address of memory location where the value of ptr is stored.
希望这是有道理的。
答案 1 :(得分:4)
这是一个计算机内存:
int i = 1023
如果我想打印i
,那么我必须这样做:
printf(..., i);
// out: 1023
如果我想在i
生活的地方打印,那么我只需要这样做:
printf(..., &i);
// out: 0x4
但是,我想说我想记住i
生活在哪里:
int *i_ptr = &i; // i_ptr is a variable of type int *
然后我可以这样打印:
printf(..., i_ptr);
// out: 0x04
但如果只打印i
的值,我需要一个*
:
printf(..., *i_ptr); // * also doubles as a way to follow the pointer
// out: 1023
或者我可以打印出i_ptr
生活的地方:
printf(..., &i_ptr);
// out: 0x32
答案 2 :(得分:2)
鉴于声明
int i = 0x01234567;
int *ptr = &i;
以下是真实的:
Expression Type Value
---------- ---- -----
ptr int * Address of i
*ptr int Value stored in i (0x01234567)
&ptr int ** Address of ptr variable
在内存中,它看起来像下面这样(假设是32位int
)
Item Address 0x01 0x02 0x03 0x04
---- ------- ---- ---- ---- ----
i 0x7fffbb00 0x01 0x23 0x45 0x67
ptr 0x7fffbb04 0x7f 0xff 0xbb 0x00
因此ptr
的值为0x7fffbb00
,&ptr
的值为0x7fffbb04
,*ptr
的值为0x01234567
。
答案 3 :(得分:1)
如果*ptr
指向变量,则表示*ptr
是指针本身。这意味着您要声明ptr
如下:int **ptr;
在这种情况下:
ptr
是指向变量指针的指针*ptr
是指向您的变量的指针&ptr
为您提供ptr的地址,因此指向指向变量指针的指针例如:
//set up work
int x;
int *intermediatePtr;
int **ptr;
x = 5;
intermediatePtr = &x; //used only for additional level of indirection in this example
ptr = &intermediatePtr; //ie *ptr = &x;
//should print out the memory address for the pointer to the address of x
printf("%d", ptr);
//should print out the memory address of x (different memory location than above)
printf("%d", *ptr);
//should print out the memory address of the variable
//which holds the memory address of x
//(again, different memory location than both above examples)
printf("%d", &ptr);
如果ptr
指向变量而不是*ptr
(即int *ptr; ptr = &x;
),则与上面的示例相比,间接级别要少一个。
答案 4 :(得分:0)
int *ptr; // declares a pointer to integer.
int val; // declares an integer.
&val; // pointer to val
ptr = &val; // ptr will now point to val
*ptr = 5; // same as writing val = 5
ptr++; // pointer to the next int after val (in this case, it will be undefined behaviour, it is useful if this pointer pointed to a cell in an array)
int arr[10]; // declares an array of size 10
ptr = arr; // ptr now points to arr[0] (name of an array can be implicity cast to pointer to first element)
ptr++; // ptr now points to arr[1]
答案 5 :(得分:0)
假设你有:
int number = 5;
int *ptr = &number;
ptr将是int *类型的变量,而不是存储5或 " foo",它会存储一个像0xf0f0f004这样的地址或者它是什么 变量号的地址。
* ptr将是此内存地址0xf0f0f004的值,在此特定情况下为5.
& ptr将是它所在的变量所在的地址 在其他地方,例如0xff00ffaa或其他任何地方。
ptr和number位于内存的不同位置,两者都存储值,一个只存储一个数字而另一个存储一个地址。该语言允许您输入*,访问该地址的值。
答案 6 :(得分:0)
&
=参考*
=参考 ptr是标识符/名称。您可以通过int *ptr
声明它。
这是一个小C程序:
#include<stdio.h>
int main()
{
int *ptr,ref;
ptr= &ref;
ref=12;
printf("%d\n",*ptr );
}
int *ptr
是一个整数指针。您可以使用其他数据类型,如float,char等。ptr = &ref
获取ref
的地址并存储在ptr
中。由于我们将ptr
声明为整数指针,因此当我们打印指向的值时,我们必须使用*
取消引用它。