c++ 指针

c++其实是对内存操作的语言,而这个过程就可以通过指针来进行。

c++ primer: 指针(pointer)是指向(point to)另外一种类型的符合类型,[A pointer is a variable that holds a memory address where a value lives.] 实现了对其他对象的间接访问。指针本身就是一个对象,允许对指针赋值和拷贝,在一个指针周期内可以先后指向不同的对象指针存放的是某个对象的地址。(关于对象的理解先以python下的对象来理解了,就是有自己的属性的东西,比如类可以看成一个对象)。指针可以在定义时不赋初始值。

int *p; // *表示定义了一个指针,前面的int修饰表示p是一个int类型的指针,即p所指向的内存的内容必须是一个int类型;
cout << "p:" << p << '\n';   // 输出为0x119dae1d2就是当前指针p指向的内存地址;
// 由于指针没有初始化,所以会从栈地址中随机分配一个内存地址;
int *p = 1;  //这种方法是不正确的,因为指针必须指向对象,而1是int类型的数,不是对象。

如果希望指针指向一个数,由于指针必须指向地址,所以可以使用取地址符号"&"。在下面例子中,num在栈上分配了一个地址,通过&num就可以取出num的地址即0x7ffee0138a14。这个地址的内容就是一个常量区上的数字1。所以可以将&num看成一个有地址有属性(值为1)的对象。所以可以用一个指针p2指向这个对象。通过打印信息发现p2指针指向的内存地址和&num取出的地址是一样的,其所指向的内容也是一样的。符号*除去具有定义指针的作用,还有解引用的作用,可以通过*p2来访问指针p2所指向的地址的内容,输出发现*p2的输出就是数值1。

int num = 1;
int *p2 = #
cout << "p2:" << p2 << "\t &num:" << &num << '\n';
cout << "*p2:" << *p2 << '\n';
// p2:0x7ffee0138a14	 &num:0x7ffee0138a14
// *p2:1

如果对指针p2进行++操作,指针地址从0x7ffee0138a14增加为0x7ffee5c5ea18,由于地址是以字节的形式存储的,所以增加了4个字节。这个大小是sizeof(int)的大小,一个int类型大小是4字节。所以指针增加的内存是根据其指向的数据类型的大小来决定的。观察此刻p2所指向内存的值发现为208409042,因为新的地址处没有定义内容,所以也会内容也是随机的。

++p2;
cout << "++p2:" << p2 << "\t *p2:" << *p2 << "\n"; 
// ++p2:0x7ffee5c5ea18	 *p2:208409042

如果在使用--p2操作,可以发现指针所指向的内存空间又变为了原来的地址,由于该地址时指向时常量区的数,不会改变,所以内容还是1:

--p2;
cout << "--p2:" << p2 << "\t *p2:" << *p2 << "\n";
// --p2:0x7ffeef343a14	 *p2:1

 

你可能感兴趣的:(c++)