zoukankan      html  css  js  c++  java
  • 对二维数组使用指针进行操作的探索(C语言)

     1 /*
     2     Name: 对二维数组使用指针进行操作的探索 
     3     Copyright: 
     4     Author: lingr7
     5     Date: 01/12/18 11:55
     6     Description: 
     7 */
     8 #include<stdio.h>
     9 int main() {
    10 
    11     int a[2][3] = {{1,2,3},{4,5,6}};
    12     int **p = a;/*这一步,将a存放的地址赋值给了p,这一步是的p与a完全等价*/
    13     int *p2 = p;/*这一步就将a[0][0]的地址确实地存入了p2,
    14     与int *p2 = a;语句完全等价,同时进行了强制转换*/
    15     
    16     printf("a[1][2]的值:%d
    ", *(p2 + 1*3 + 2));/*对二维数组访问成功*/
    17     printf("a[1][2]的值:%d
    ", *((int*)p + 1*3 + 2));/*访问成功*/
    18     printf("a[1][2]的值:%d
    ", *((int*)a + 1*3 + 2));/*对二维数组访问成功*/
    19    /* 既然(int*)a与 *(int(*)[3])a在这里是等价的,那么还是(int*)a更方便一点*/
    20     printf("a[1][0]的值:%d
    ", *(*(int(*)[3])a+1*3+0));/*访问成功*/
    21     printf("a[1][0]的值:%d
    ", *(*(int(*)[3])p+1*3+0));/*访问成功*/
    22     /*以上能够正确的访问二维数组*/
    23     
    24     printf("a[1][0]的值:%d
    ", *(a+1*3+0));/*这里因为a的地址的多重性而混乱,必须强制转换确认
    25     a是一个指向整型元素的指针,才能正确使用a里存放的地址*/
    26     printf("a[1][0]的值:%d
    ", *(*(int(*)[3])p+1*3+0));/*p与a的效果完全一样*/
    27     /*printf("a[1][0]的值:%d
    ", *(*(int*)p+1*3+0));/*编译不通过*/
    28     printf("a[1][0]的值:%d
    ", *((int*)*p+1*3+0));/*操作失败*/
    29     printf("a[1][0]的值:%d
    ", *((int*)(*p)+1*3+0));/*操作失败*/
    30     printf("a[1][0]的值:%d
    ", *(p+1));
    31     printf("*p应该是一个指向指针的指针:%d", *p);
    32     printf("
    ");
    33     printf("a的地址:%d
    ", a);
    34     printf("a[0][0]的地址:%d
    ",&a[0][0]);
    35     printf("a[0][0]的值:%d
    ", *p);
    36     printf("a[1][2]的值:%d
    ", *(p + 1*3 + 2));/*这里和int *p = a的结果不同*/
    37     printf("a[1][2]的值:%d
    ", *p + 1*3 + 2);/*21,这里应该是5才对啊
    38     这里跟对二维数组的操作无关,因为*p指向一个指向整型的指针,可是*P移位根本不确定,*P移位后指向什么东西*/
    39     /*printf("a[1][2]的值:%d
    ", *(*p + 1*3 + 2));/*存储地址为21的东西没办法输出*/
    40     printf("a[0][0]的值:%d
    ", *(p+1));
    41     printf("p+1之前:%d
    ",p);
    42     p++;
    43     printf("p+1之后:%d
    ",p);/*地址+1,实际上是10进制加8了,这是因为p是一个指针,+1之后是下一个
    44     而p指向一个指针,对p移位所以是下一个存储地址长度,与p指向的那个指针指向的类型无关*/
    45 
    46 }
  • 相关阅读:
    PHP入门
    bootstrap框架
    jsp5 include forward param
    jsp4 Cookie
    网页定位导航
    jsp3 javabean
    Obsidian md安装闪退
    Excel 2016 Mac VBA 的变化 窗体消失
    Excel Mac 2016 调用 Applescript
    如何自学R
  • 原文地址:https://www.cnblogs.com/lingr7/p/10048917.html
Copyright © 2011-2022 走看看