数组/数组指针/指针数组的区别理解

/*
    数组指针:首先是个指针,指向数组的指针,eg: int(*p)[10],p指向偶10个元素的int型数组(int(*)[10]p);
    指针数组:首先是个数组,存储指针的数组,eg: int* p[10],p是数组名,存储的是10int型指针。
    一维数组:一位数组名相当于一个指针,存放的是第0个元素首地址。
    二维数组:二位数组名存放的是第0行的首地址,不是第0行第0列的地址。二维数组是以行主序来存储内存的,是一个特殊的一维数组,这个一维数组的元素是二位数组的一行,也就是二位数组是一个整体。所以二维数组在进行参数传递的时候,要么传行指针,要么传指针的指针比如main函数:
    (1) int main(int argc, char** argv) 
    (2) int main(int argc, char* argv[])
        --> 取值:*(*(argv + m) + n)
            *(argv + m) : 取m行地址
            *(argv + m) + n : m行n列的地址
 */

#define PTR_STRUCT
#define STRUCT_PTR

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
    int a = 100;
    int * b = &a;

    int d[10];
    int c[10];
    int e[10];

    int data[4][5] = {0};

    int i  = 0, j = 0;

    int* tmp[10] = {NULL};//指针数组

    int(*p)[10] = NULL;//数组指针

    int(*d_p)[5] = NULL;//数组指针

    for(i = 0; i < 4; i++)
        for(j = 0; j < 5; j++){
        data[i][j] = 5;
    }

    for(i = 0; i < 10; i++){
        d[i] = 1;
        c[i] = 2;
        e[i] = 3;
    }

    tmp[0] = d;
    tmp[1] = c;
    tmp[2] = e;

    p = (int(*)[10])d;

    d_p = data;
    for(i = 0; i< 4;i++)
        for(j = 0; j < 5; j++){
            printf("d[%d][%d] = %d\n", i, j, *(*(d_p + i) + j) );
    }

    for (i = 0; i < 10; i++)
    {
        printf("d[%d] = %d\n", i, *(*(p + 0) + i));
#ifndef PTR_STRUCT
        printf("d[%d] = %d\n", i, *(tmp[0] + i));
        printf("c[%d] = %d\n", i, *(tmp[1] + i));
        printf("e[%d] = %d\n", i, *(tmp[2] + i));
#endif      
    }


    printf("a addr = %p, b addr = %p, it is the same\n", &a, b);

    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值