C++ 指针中(星号)的确切用途是什么?

C++ 指针中(星号)的确切用途是什么?,c++,pointers,memory-address,dereference,C++,Pointers,Memory Address,Dereference,我对编程还不熟悉,我正试着用“指针”来概括我的想法 intmain() { int x=5; int*指针指针指针=&x; cout*根据上下文有不同的含义 指针的声明 int* ap; // It defines ap to be a pointer to an int. void foo(int* p); // Declares function foo. // foo expects a pointer to an int as an argume

我对编程还不熟悉,我正试着用“指针”来概括我的想法


intmain()
{
int x=5;
int*指针指针指针=&x;

cout
*
根据上下文有不同的含义

  • 指针的声明

    int* ap;  // It defines ap to be a pointer to an int.
    
    void foo(int* p); // Declares function foo.
                      // foo expects a pointer to an int as an argument.
    
  • 取消引用表达式中的指针

    int i = 0;
    int* ap = &i;   // ap points to i
    *ap = 10;       // Indirectly sets the value of i to 10
    
  • 乘法运算符

    int i = 10*20; // Needs no explanation.
    

  • 如果声明某种类型的变量,则还可以声明指向它的另一个变量

    例如:

    int a;

    int*b=&a;

    所以本质上,对于每个基本类型,我们也有相应的指针类型

    例如:
    short
    short*

    有两种方法可以“查看”变量
    b
    (这可能会让大多数初学者感到困惑):

      >p>可以考虑<代码> b>代码>作为变量<代码> int *>代码> < < /p> >p>可以考虑<代码> *b/COD>作为类型<代码> int >的变量。

      因此,有些人会声明
      int*b
      ,而有些人会声明
      int*b

      但事实是,这两个声明是相同的(空格是没有意义的)

      您可以使用
      b
      作为指向整数值的指针,也可以使用
      *b
      作为实际指向的整数值

      您可以获取(读取)指向的值:
      int c=*b

      您可以设置(写入)指定值:
      *b=5


    指针可以指向任何内存地址,而不仅仅指向您之前声明的某个变量的地址。但是,在使用指针获取或设置位于所指向内存地址的值时,必须小心

    例如:

    int*a=(int*)0x8000000;

    这里,变量
    a
    指向内存地址0x8000000

    如果此内存地址未映射到程序的内存空间中,则使用
    *a
    的任何读写操作都极有可能导致程序因内存访问冲突而崩溃


    您可以安全地更改
    a
    的值,但是更改
    *a

    的值时应该非常小心,一种方法是查看它,即源代码中的变量,例如

    int a=0;
    
    使“int a”引用内存中的一个值0。如果我们创建一个新变量,这一次是一个(可能更小的)“int指针”
    int*
    ,并让它指向&a(a的地址)

    我们得到了
    p_a
    ,它指向
    &a
    的值。你现在谈论的
    a
    的地址是什么,而*p_a是指向&a(a的地址)的指针

    当您想要修改内存中的值而不创建重复的容器时,这有其用途


    p_a
    本身在内存中有一个内存占用空间(可能小于
    a
    本身),当您
    cout是时,星号
    *
    在声明指针变量和通过指针变量访问数据时具有不同的含义

    int input = 7;
    int *i_ptr = &input;/*Here * indicates that i_ptr is a pointer variable 
                         Also address is assigned to i_ptr, not to *iptr*/ 
    cout<<*i_ptr;/* now this * is fetch the data from assigned address */
    cout<<i_ptr;/*it prints address */
    
    int输入=7;
    int*i_ptr=&input;/*Here*表示i_ptr是指针变量
    地址也分配给i_ptr,而不是*iptr*/
    
    coutOne是指针(即内存地址)-这是十六进制值。另一个是该地址的内容。
    *
    指针前面表示“取消引用”指针,或遍历它。
    *
    类型后表示指向该类型的指针。指针只是指向内存中某个存储给定信息的地方的方向。
    int*ap
    int*ap
    之间是否有区别(样式除外)?@c.berger,不,没有。
    int*p_a=&a; //(`p_a` meaning pointer to `a` see Hungarian notation)
    
    int input = 7;
    int *i_ptr = &input;/*Here * indicates that i_ptr is a pointer variable 
                         Also address is assigned to i_ptr, not to *iptr*/ 
    cout<<*i_ptr;/* now this * is fetch the data from assigned address */
    cout<<i_ptr;/*it prints address */