首页 > 代码库 > 程序猿之--C语言细节13(二维数组和指针,&*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)

程序猿之--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\n",1[e]); // 1[e] 和 e[1] 一样,因为对编译器而言e[1] 等价于*(e + 1)==>*(1 + e)                                // 则等价于1[e] ,但良好编程习惯不要这样写     printf(" c = %d\n",c);
    printf(" d的地址为 = %d\n",&d);
//    test = &*e[0];   // 这句出错(*&e[0]编译通过但是运行出错),指针才可以&和*取消,e[0]是常数,
                     //下面f[1] 表示第二行 
//    printf(" 常数d = %d\n",*test);
    test = &*f[1];
    printf(" d = %d\n",*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("\n");
        
    } 
    return 0;
}

输出:


程序猿之--C语言细节13(二维数组和指针,&*a[i][0]的理解,数组1[e]和e[1]很可能你没见过)