C++学习笔记 整型指针
指针充斥了C/C++,大有不会指针就寸步难行之势,没辙,只好拿起书老老实实去学。
程序代码经过编译之后,系统便会为它分配一个地址空间,比如
int a=1021;
编译之后,系统给变量a分配地址,比如首地址为0x28ff44,那么从0x28ff44开始存放1021,至于需要占用多大空间,则跟编译器与操作系统等因素有关,这个用size()可以查看。
这种直接按变量地址存取变量值的方法称为直接存取方式。对应的还有一种间接存取方式。
[以下举例灵感来源于《从零开始学C语言》第14章指针操作 p193]
我们藏宝的时候,可以直接扔进保险柜,记牢位置就可以,取的时候,直接打开保险柜就可以拿到宝贝;也可以先藏宝图放进保险柜,打开保险柜之后,拿到的仅仅是宝贝真正存放的地址,而不是宝贝,你需要根据藏宝图的指引,去真正的地址,取到宝贝。第一种方法就是直接访问,第二种方法就是间接访问。
指针变量声明方式:
类型 *标识符;
例如
int *a;
char *b;
不同类型的数据在内存中占用的空间大小是不一样的,因此给出指针变量的类型,就能知道该地址存放的是什么类型的数据,也可以让编译器知道需要分配多大空间。
下面我们举一个稍微长一点的例子,里面已经给出很详细的说明。
1 /* 2 Name: main.cpp 3 Copyright: NO Copyrights reserved 4 Author: Jack 5 Date: 16/05/12 14:59 6 Description: 整型指针学习范例 7 */ 8 9 #include <cstdlib> 10 #include <iostream> 11 12 using namespace std; 13 14 int main(int argc, char *argv[]) 15 { 16 int a, *b,*c; //声明一个整型的变量a,以及两个整型的指针变量b、c,*是指针标识 17 //指针存放的是某个变量的地址 18 a=1021; //a的值,地址需要用&来取得 19 20 21 cout << "a:" << endl; 22 cout << " 'a'=>: value: " << a << endl; 23 cout << " '&a'=>: address: " << &a << endl; 24 cout << "" <<endl; 25 26 27 b=&a; //指针b存放的是变量a的地址 28 cout << "b: " << endl; 29 cout << " 'b'=>: stores address of a: " << b << endl; 30 cout << " '*b'=> value at which the address: " << *b << endl; 31 cout << " '&b'=> b's its address: " << &b << endl; 32 cout << "" <<endl; 33 34 c=b; //指针c存放的是b中的地址,也就是a在内存中的位置。由于b/c都是指针类型的变量,所以可以直接赋值 35 36 //此处如果写成c=&b,则编译器会报错cannot convert int** to int* in assignment,需要用指针的指针来实现 37 //******************************************************************************************************** 38 //从这里可以看出,&X似乎是最终数值的存放地址,如果X是普通变量,保存的是最终数值, 39 //则可以是指针存放这个地址 40 //如果X自己也是指针,保存的是其他数值的地址,那么保存&X的变量则需要是指针的指针 41 //******************************************************************************************************* 42 43 cout << "c: " << endl; 44 cout << " 'c'=>: stores address of a: " << c << endl; 45 cout << " '*c'=> value at which the address: " << *c << endl; 46 cout << " '&c'=> c's its address: " << &c << endl; 47 cout << "c is also a pointer as b, so it could assign its value to b directly" << endl; 48 cout << "" <<endl; 49 50 //由于b本身是指针,所以要记录b的地址,就需要用指针的指针 51 int **d; 52 d=&b; 53 cout << " address point to b: 'd'=> " << d << endl; 54 cout << " value in the above address '*d'=> "<< *d << endl; 55 cout << " address of d itself '&d'=> " << &d << endl; 56 cout << " value at d '**d'=> " << **d << endl; 57 cout << " '&*d'=> " << &*d << endl; 58 cout << " '*&d'=> " << *&d << endl; 59 cout << " " << endl; 60 61 system("PAUSE"); 62 return EXIT_SUCCESS; 63 }
运行结果为

下面表格可以看出地址之间的关系

指针变量d为指针的指针 **d,所以里面存放的是其它指针的指针,在上述代码中,即存放的是指针b的指针,0x28ff40,而指针变量b存放的是变量a的地址,0x28ff44,所以,要最终变量a的值,要取两次指针。
变量d存放的是b的指针 0x28ff40
第一次 *d => d中存放的地址0x28ff40地址中存放的value: 0x28ff44
因为是指针的指针,所以0x28ff44还是指针,所以还要一次取值操作
第二次 **d => 地址0x28ff44中存放的数值:1021.
因此: d = b的地址 0x28ff40
*d = 0x28ff40地址中存放的内容,0x28ff44,仍然是地址
**d 0x28ff44中存放的内容,1021
结论:

浙公网安备 33010602011771号