• 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

  • 相关阅读:
    php解析xml文件的方法
    while倒数阶乘的和
    菱形代码
    0929课堂随记
    0929作业
    0928练习作业
    HelloJava
    Java例题
    Hello World(本博客启程篇)
    vue 如何实现在函数中触发路由跳转
  • 原文地址:https://www.cnblogs.com/phoenixzq/p/1909726.html
Copyright © 2020-2023  润新知