指针(星号)的目的究竟是什么?

时间:2016-05-01 03:14:17

标签: c++ pointers memory-address dereference

我是编程新手,我正试图围绕'指针'的想法。

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

}

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

4 个答案:

答案 0 :(得分:18)

*具有不同的含义,具体取决于具体情况。

  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.
    

答案 1 :(得分:6)

如果声明某种类型的变量,那么你也可以声明另一个指向它的变量。

例如:

int a;

int* b = &a;

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

例如:shortshort*

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

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

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

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

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

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

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

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

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

例如:

int* a = (int*)0x8000000;

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

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

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

答案 2 :(得分:5)

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

int a=0;

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

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

Hungarian notation wiki

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

当您想要修改内存中的值而不创建重复容器时,可以使用此选项。

p_a本身在内存中有足迹(可能小于a本身),当你cout<<p_a<<endl;时,你会写出任何指针地址,而不是那里。 *p_a&a将是p_a

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

答案 3 :(得分:0)

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

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";

  • 例如
  • * =&gt;这里ptr只是告诉编译器pointer variableHello不正常的&amp; char array是一个if(*ptr == 'H') { /*....*/ } else { /*.... */ },即有效地址,所以这个语法没问题。现在你可以做到

    {{1}}