C指针:* ptr vs& ptr vs ptr

时间:2014-07-30 18:36:35

标签: c pointers

假设*ptr指向变量。 *ptr&ptrptr各自意味着什么?

很多时候,我对它们感到困惑。有人介意澄清这些陈述并给出一些具体的例子吗?

7 个答案:

答案 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)

这是一个计算机内存:

enter image description here

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 );
    }
    
    • 在C中,int *ptr是一个整数指针。您可以使用其他数据类型,如float,char等。
    • ptr = &ref获取ref的地址并存储在ptr中。由于我们将ptr声明为整数指针,因此当我们打印指向的值时,我们必须使用*取消引用它。