zoukankan      html  css  js  c++  java
  • 程序员之--C语言细节13(二维数组和指针,&*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)

    主要内容:二维数组和指针。&*a[i][0]的理解、数组1[e]和e[1]

    #include <stdio.h>
    
    #define NUM_ROWS 10
    #define NUM_COLS 10
    
    int main(int argc, char **argv)
    {
        int a[NUM_ROWS][NUM_COLS], *p, i = 0; // a理解为指向整数指针的指针 即int ** 
        int c, d=2,*test, e[2] = {4,5},f[2][2] = {{11,22},{33,44}}; // e理解为int * 
        test = &d;
    //    c = *&test; //和&(*test)结果一样,*和&同一优先级。按右到左 
        c = &*test; // 注意和++*test的区别,这里有点不懂。为什&(*test)不出错。我
                    // 感觉是*test等效于d。而不是详细的数值。然后&(*test)相当于&(d)
                    // 所以才印证以下在指针操作时&和*可取消 
    //    c = ++*test;
        printf("1[e] = %d
    ",1[e]); // 1[e] 和 e[1] 一样,由于对编译器而言e[1] 等价于*(e + 1)==>*(1 + e)
                                    // 则等价于1[e] ,但良好编程习惯不要这样写 
        printf(" c = %d
    ",c);
        printf(" d的地址为 = %d
    ",&d);
    //    test = &*e[0];   // 这句出错(*&e[0]编译通过可是执行出错),指针才干够&和*取消,e[0]是常数,
                         //以下f[1] 表示第二行 
    //    printf(" 常数d = %d
    ",*test);
        test = &*f[1];
        printf(" d = %d
    ",*test);
        for(i = 0; i < NUM_ROWS; i++)
        {
            /* 使p指向二维数组的某一行用p = &a[i][0] 等价于p = a[i] 
             * C语言中二维数组按行存储
             * 数组下标与指针算术运算间的奇妙公式
             * 对随意数组a。 a[i]等价于*(a+1) .
             * 由于&和*能够取消。则&a[i][0]等价于&(*(a[i]+0)) ==>等价于&*a[i] ==>a[i]
             */
            for(p = a[i]; p < a[i] + NUM_COLS; p++)
            {
                *p = i;
                printf("%3d ",*p);
            }
            printf("
    ");
            
        } 
        return 0;
    }

    输出:


  • 相关阅读:
    微软铁杆兄弟诺基亚开发基于Linux的手机
    Linux目录递归改变文件名大小写
    boa-0.94.13 移植到 ARM
    LINUX如何设置只允许SSH登陆?
    9.4. 使用 I/O 内存
    I-O 端口和 I-O 内存
    Linux 的虚拟文件系统--各结构之间的联系
    Linux 系统调用
    【poj2528】Mayor's posters
    【poj3225】Help with Intervals
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6955941.html
Copyright © 2011-2022 走看看