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

 

结论:

  

posted on 2012-05-16 15:50  ardypro  阅读(1657)  评论(0)    收藏  举报