C++指针的奥秘

        
int *p[4]//声明指向int的指针数组
int (*p)[4] //指向数组int[4]的指针

  • 可以这么理解: *的优先级没有[]高, 第一种情况p与[]结合,代表p是一个数组, 什么样的数组呢? int*型的数组;第二种情况是p首先和*结合,p是一个指针, 指向int [4]类型的。
  • 用typedef实现二位数组的遍历
  • int ia[3][4]={1,1,1,1,1,1,1,1};
    typedef
    int intarray[4];
    for(intarray *p1=ia;p1!=ia+3;p1++ )
    for(int *q=*p1; q!=*p1+4; q++)
    {
    cout
    <<*q<<", ";
    }
  • intarray 随int[4]类型的,那么p1就是指向整型数组的指针,*p1就是整型数组, 退化成整数指针类型,p1就可以看成是指针的指针。
      
int *p = (int *) 100;
printf(
"%d\n", p+100);//输出结果是多少?

p是一个指向int的指针, 强制初始化为内存地址为100的指针, p+100是p向下偏移100个int存储空间(4)后的地址, 强制转化成整形后应该输出100+100*4=500.

注意: 不能随意操纵p指向的内容.

int array[]={1,2,3,4,5};
int *p= int *(&array+1);
printf(
"%d%d\n", *(a+1), *(p-1));

a退化为a[0]的指针, 那么a+1就是指向a[1]的指针, 所以*(a+1)的结果是2;

&array是取int[5]的地址, 因此&array是指向int[5]的指针, &array+1就是偏移一个int[5]的地址, 值就是&array[4] + 4, p是将这个值强制转化成int *.

p-1就是p向左偏移个int地址, 就是&array[4] + 4 - 4 = & array[4], 那么 *(p-1) 的结果就是5.

注意: 指针加减整数n后的值并不是指针的值直接加减n, 而是指针偏移n个指针指向的内存;

非常感谢霞光照耀提供的学习经验,这里放在一起便于更方便看一点。

摘自:http://www.cnblogs.com/lovelyxia/archive/2010/04/23/1718964.html

原文地址:https://www.cnblogs.com/phoenixzq/p/1909726.html