ian*_*hew 5 c++ pointers memory-address dereference
我是编程的新手,我正试图围绕"指针"的想法.
int main()
{
int x = 5;
int *pointerToInteger = & x;
cout<<pointerToInteger;
}
Run Code Online (Sandbox Code Playgroud)
为什么当我 cout << pointerToInteger;输出是十六进制值时,但是当我使用cout << *pointerToInteger;输出时是5(x = 5).
R S*_*ahu 20
* 具体取决于具体情况.
声明指针
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.
Run Code Online (Sandbox Code Playgroud)取消引用表达式中的指针.
int i = 0;
int* ap = &i; // ap points to i
*ap = 10; // Indirectly sets the value of i to 10
Run Code Online (Sandbox Code Playgroud)乘法运算符.
int i = 10*20; // Needs no explanation.
Run Code Online (Sandbox Code Playgroud)如果声明某种类型的变量,则还可以声明另一个指向它的变量。
例如:
int a;
int* b = &a;
因此,从本质上讲,对于每个基本类型,我们也有一个对应的指针类型。
例如:short和short*。
有两种方法可以“查看”变量b(这可能会使大多数初学者感到困惑):
您可以将其b视为type的变量int*。
您可以将其*b视为type的变量int。
因此,有些人会宣布int* b,而另一些人会宣布int *b。
但是,事实是这两个声明是相同的(空格是没有意义的)。
您可以将其b用作指向整数值的指针,也可以*b用作实际的指向整数值。
您可以获取(读取)目标值:int c = *b。
您可以设置(写入)指向的值:*b = 5。
指针可以指向任何内存地址,而不仅指向先前声明的某个变量的地址。但是,在使用指针时必须小心,以获取或设置位于指向的内存地址的值。
例如:
int* a = (int*)0x8000000;
在这里,我们有a指向内存地址0x8000000的变量。
如果此内存地址未映射到程序的内存空间内,则使用任何读或写操作*a很可能会由于违反内存访问而导致程序崩溃。
您可以安全地更改的值a,但是您应该非常小心地更改的值*a。
一种看待它的方法,就是源/代码中的变量
int a=0;
Run Code Online (Sandbox Code Playgroud)
使'int a'引用内存中的值,0.如果我们创建一个新变量,这次是一个(可能更小的)"int指针" int *,并让它指向&a(a的地址)
int*p_a=&a; //(`p_a` meaning pointer to `a` see Hungarian notation)
Run Code Online (Sandbox Code Playgroud)
我们得到p_a的价值&a是什么.你在谈论a现在的地址是什么,而*p_a是指向&a(a的地址)的指针.
当您想要修改内存中的值而不创建重复容器时,可以使用此选项.
p_a然而,它本身在内存中有一个足迹(可能比a它本身小),当你cout<<p_a<<endl;编写任何指针地址时,不是什么.*p_a但是会的&a.
p_a通常比a它本身小,因为它只是一个指向内存的指针,而不是值本身.那有意义吗?指针向量将比值向量更容易管理,但它们在许多方面都会做同样的事情.