<C 数组><1>int (*p)[n] 和 int *p[n]

int *p[n]int (*p)[n] 区别

int *p[n]
[] 优先级高于 *
int *p[n] 就是一个 指针数组 数据类型为 int *,元素为地址

int (*p)[n]
是一个 二维数组
是一个 指针数组数组

二维数组 和 一维数组
两者是相似的
都是 二维数组
一维数组 只是是特殊的而已
只需让 二维数组 其中一维等于
就像二维坐标中的一轴为零

int (*p)[n] 表示 一维数组

不提倡这样用
没有必要
这里只是为了更清晰的表达二维数组

#include "stdio.h"

#define LINE_NUM 2 /*行数*/
#define LIST_NUM 3 /*列数*/

#if 1
//====================一维数组=============================//
//===================特殊的二维数组========================//
int main()
{
    //定义 拥有一个维度 其中包含 3 个整形元素的数组 
    int c[LIST_NUM+1]={1,2,3};// +1 防止数组溢出

    /**
     * () 优先级最高
     * 就近原则 : p_c 是一个指针
     * 
     * 等价 互相 赋值
     * (*p_c)[LIST_NUM+1]
     *     c[LIST_NUM+1]
     * *p_c == c == &c  元素的地址
     * 
     * 数组: c 或是地址或是数组
     * 指针: *p_c 必然是地址
     * *p_c --- 指针数组的元素-指针
     * p_c --- 一个 指针数组的数组 的地址(首元素指针)
     */
    int (*p_c)[LIST_NUM] = c;//
    
    //数组访问
    int i = 0;
    for(i=0; i<LIST_NUM; i++)
    {
        /**
         *      式子                    解释
         *   *((*p_c)+i)            * 运算 -- 取实际值
         *     (*p_c)+i             指针数组的元素-的-地址-的-偏移-下一个元素的地址 
         *      *p_c                指针数组的元素-的-地址-(是指针)
         *       p_c                一个指针数组的首地址    
         *       p_c+1              二重身了---二维数组了---多个指针数组
         *  下方二维数组就靠他了
         */
        printf("*((*p_c)+i) : %d\n",*((*p_c)+i));// 
        printf("  (*p_c)+i : %d\n",(*p_c)+i);// 
        printf("   *p_c : %d\n",*p_c);// 
        printf("    p_c : %d\n",p_c);// 
        printf("    p_c+1 : %d\n",p_c+1);// 
        printf("sizeof(*p_c) : %d\n",sizeof(*p_c));// 
        printf("sizeof(p_c) : %d\n\n",sizeof(p_c));// 
    }

    return 0;
}
#endif

/*======================运行结果==========================*/
PS V:\file\code\c\data_structure> .\ll.exe
*((*p_c)+i) : 1
  (*p_c)+i : 6422016
   *p_c : 6422016
    p_c : 6422016
    p_c+1 : 6422028
sizeof(*p_c) : 12
sizeof(p_c) : 8

*((*p_c)+i) : 2
  (*p_c)+i : 6422020
   *p_c : 6422016
    p_c : 6422016
    p_c+1 : 6422028
sizeof(*p_c) : 12
sizeof(p_c) : 8

*((*p_c)+i) : 3
  (*p_c)+i : 6422024
   *p_c : 6422016
    p_c : 6422016
    p_c+1 : 6422028
sizeof(*p_c) : 12
sizeof(p_c) : 8
/*======================运行结果==========================*/

int (*p)[n] 表示 二维数组

#include "stdio.h"

#define LINE_NUM 2 /*行数*/
#define LIST_NUM 3 /*列数*/

#if 1
//====================二维数组=============================//
//=================一维数组的小变形========================//
int main()
{
    int a[LINE_NUM][LIST_NUM] = {{5, 2, 3}, {4, 5, 6}};
    int (*p_a)[LIST_NUM] = a;//
    /**
     * 变式为
     * int (*p_a)[LIST_NUM];
     * p_a = a;
     */

    int h = 0;//行
    int l = 0;//列

    for(h=0; h<LINE_NUM; h++)
    {
        for(l=0; l<LIST_NUM; l++)
        {
            printf("%d ",*(*(p_a+h)+l));//   
        }
        printf("\n");
    }

    return 0;
}
#endif

/*======================运行结果==========================*/
PS V:\file\code\c\data_structure> gcc .\digit_group.c -o ll
PS V:\file\code\c\data_structure> .\ll.exe
5 2 3 
4 5 6 
PS V:\file\code\c\data_structure> 
/*======================运行结果==========================*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青蓝灰紫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值