指针中(星号)的确切目的是什么

What exactly is the purpose of the (asterisk) in pointers?

本文关键字:是什么 星号 指针      更新时间:2023-10-16

我是编程新手,我试图围绕"指针"的概念。


int main()
{
    int x = 5;
    int *pointerToInteger = & x;
    cout<<pointerToInteger;
}

为什么当我cout << pointerToInteger;输出是十六进制值时,但是当我使用cout << *pointerToInteger;时输出是 5 ( x=5(。

*根据

上下文具有不同的含义。

  1. 指针的声明

    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.
    
  2. 取消引用表达式中的指针。

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

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

一种看待它的方法是,源代码/代码中的变量,比如

int a=0;

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

int*p_a=&a; //(`p_a` meaning pointer to `a` see Hungarian notation)

匈牙利语符号维基

我们得到p_a指出&a的价值是什么。您现在谈论的是a地址上的内容,而 *p_a 是指向 &a(a 地址(的任何内容的指针。

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

然而,p_a本身在内存中有一个占用空间(可能小于a本身(,当你cout<<p_a<<endl;时,你将写入指针地址是什么,而不是那里的内容。 但是*p_a将是&a.

p_a通常小于a本身,因为它只是一个指向内存的指针,而不是值本身。这有意义吗?指针向量比值向量更容易管理,但它们在许多方面都会做同样的事情。

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

例如:

int a;

int* b = &a;

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

例如:shortshort*

有两种方法可以"查看"变量b(这可能使大多数初学者感到困惑(:

  • 您可以将b视为类型 int* 的变量。

  • 您可以将*b视为类型 int 的变量。

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

    但事实是这两个声明是相同的(空格毫无意义(。

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

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

    您可以设置(写入(指向值:*b = 5 .


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

例如:

int* a = (int*)0x8000000;

在这里,我们有指向内存地址0x8000000的变量a

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

您可以安全地更改 a 的值,但您应该非常小心地更改 *a 的值。

是的,在声明指针变量和通过指针变量访问数据时,星号*具有不同的含义。

例如
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 *ptr = 7;错误(不是错误(作为指针,ptr期望有效的地址,但您提供了constant(7). 直到声明没关系,但是当您像*ptr一样取消引用它时,它会产生问题,因为它不知道data/value 7 location是什么。因此,始终建议使用有效地址分配指针变量。例如

    int input = 7; int *i_ptr = &input; cout<<*i_ptr;

  • 例如 char *ptr = "Hello"; =>这里*只是通知编译器ptr是一个pointer variable不正常的 && Hello是一个char array,即有效地址,所以这个语法是可以的。现在你可以做

    if(*ptr == 'H') { /*....*/ } else { /*.... */ }