zoukankan      html  css  js  c++  java
  • c语言二维数组与指针

      问题,以下输出的结果是什么,区别在于哪?

    void main()
    {
        int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    
        //输出的3个地址都一样,差别在哪?
        printf("
    %x",a);  
        printf("
    %x",*a); 
        printf("
    %x",&a);
    system(
    "pause"); }

      像我这种野生码农看到这个问题基本懵了,好吧我们先通过一维数组来理解。

    void main()
    {
        int num[5] = { 1,2,3,4,5 };
        printf("
    %x", num);    //第一个元素的首地址,1个int元素4个字节
        printf("
    %x", &num);   //数组的地址,数组5个元素,20个字节。
        
        //printf("
    %d", (*(&num))[2]); 可以知道 (*(&num))就是数组 {1,2,3,4,5}-> &num是指向整个数组的地址
    
        //区别
        printf("
    %d", sizeof(*num)); //4   *num 根据类型地址取出内容  => 1 ,4字节
        printf("
    %d", sizeof(*&num));//20  *&num 根据类型地址取出内容
            
        getchar();
    }

      通过上面的例子,可以知道

      1. num就是指向数组的首地址,由此可得 *num 就是数组首地址的值 1。

      2. &num 就是指向整个数组的地址。

    于是我们再来看上面二维数组的例子解答。

     1 void main()
     2 {
     3     int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
     4     
     5     //打印出整个数组的元素和对应的地址
     6     for (int i = 0; i < 3; i++)
     7     {
     8         for (int j = 0; j < 4; j++)
     9         {
    10             printf("%d,%x  ",*(*(a+i)+j), *(a + i) + j);
    11         }
    12         printf("
    ");
    13     }
    14 
    15     //3个结果都一样,差别在哪?
    16     printf("
    %x",a);  //a行指针
    17     printf("
    %x",*a); //a行指针的值 {1,2,3,4}
    18     printf("
    %x",&a); //整个二维数组的地址
    19     
    20     printf("
    %d",sizeof(*a));//  16  -> *a代表一个行的数组 {1,2,3,4} , 
    21     printf("
    %d", sizeof(**a));// 4  -> 有上可以推断 **a 代表第一行数组首地址  1
    22     printf("
    %d", sizeof(*&a));// 48 -> &a代表整个二维数组的首地址,则 *(&a) 取整个二维数组的内容,12个元素,则48 个字节    
    23 
    24 
    25     system("pause");
    26 }

      

  • 相关阅读:
    理解OAuth 2.0
    Npoi导出word(Peanuts)
    轻松搞定javascript日期格式化问题
    史上最全的MSSQL复习笔记
    SQL经典短小代码收集
    Web系统与自控系统数据通讯架构 之 OPC DA DataChangeEventHandler 非热点数据更新策略 ,
    记一次SQL Server insert触发器操作
    记一次单机Nginx调优,效果立竿见影
    windows 显示引用账户已被锁定,且可能无法登录
    C# 使用modbus 读取PLC 寄存器地址
  • 原文地址:https://www.cnblogs.com/loveyouyou616/p/5727934.html
Copyright © 2011-2022 走看看