指针的指针(pointers to pointers)

    通常我们说指针就是内存中的地址,不同类型的指针代表相应类型变量的地址。而指针本身存放也需要地址,所以很显然我们同样可以定义指针的指针。下面就是一个指向整型变量的

指针和一个指向整型指针的指针:

    int i = 1; int* pi = &i; int** pi = &pi

 

 

      以下输出了各变量的值:

 

     i = 1 *pi = 1 **ppi = 1 &i = 0012FF60 pi = 0012FF60 *ppi = 0012FF60 &pi = 0012FF54 ppi = 0012FF54 &ppi = 0012FF48

 

 

         *ppi = 0012FF60 &(**ppi) = 0012FF60 *(&(*ppi)) = 0012FF60 *(*(&ppi)) = 0012FF60

 

      

        由于数组名第一个元素的地址,那么本身即为地址的指针也可以表示数组。指针的指针可以表示二维数组。字符型指针可以表示字符串,指向字符型指针的指针可以表示字符串集合。

    判断下面程序的输出:

 

  int main(int argc, char* argv[]) { const char* p = "12345";//p points to the first letter of string "12345" const char** q = &p; //q points to p, q = &p *q = "abcde"; //means p points the first letter of "abcde" const char* s = ++p; //s = p+1; so *s == 'b' p = "XYZWVU"; //p points to the first letter of "XYZWVU" cout<<*(++s)<<endl; //++s; so *s == 'c' }

 

    注意程序第三句,指针p指向的对象通过其本身的指针q被修改了,所以最后输出为c

 

    从上面除了可以发现内存中栈按地址减小的方向增长外(为什么每次是12Bytes呢?),还可以看到每行的值都是相等的。ppi是指向整型指针pi的指针,所以ppi =&pipi是指向整型变量i的整型指针,所以pi=&i

 

   在这里可以看到&(取地址操作符,address-of operator)*(解引用操作符,dereference oprator)互为逆操作。如下所示:

 

你可能感兴趣的:(c,String,Pointers)