c-数组指针

二维数组 – 数组指针


#include <stdio.h>

int main(int argc, char *argv[])
{

    // 定义:数组指针
    int a[3][5];  // 定义了一个3行5列的一个二维数组
    int(*p)[5];   // 定义了一个数组指针变量p,p+1跳一个有5个元素的整型数组

    printf("a=%p\n",a);  // 第0行的行地址      a=0060FE60
    printf("a+1=%p\n",a+1); // 第1行的行地址,a和a+1差20个字节      a+1=0060FE74

    p = a;
    printf("p=%p\n",p);         // p=0060FE60
    printf("p+1=%p\n",p+1);   // p+1跳一个有5个整型元素的一维数组  p+1=0060FE74

    return 0;
}


二维数组的数组名降级问题

#include <stdio.h>


int main(int argc, char *argv[])
{

    // 二维数组的数组名降级问题:行指针降级为列指针
    int a[3][5];
    printf("a=%p\n", a);          // a=0060FE64              行地址
    printf("a + 1=%p\n", a+1);    // a + 1=0060FE78

    printf("*a = %p\n", *a);            // *a = 0060FE64      *a变成了第0行第0列元素的地址
    printf("(*a)+1 = %p\n", (*a) + 1);  // (*a)+1 = 0060FE68    这个是第0行第1列元素的地址
    printf("*a + 1 = %p\n", *a + 1);    // *a + 1 = 0060FE68
    printf("*a + 5 = %p\n", *a + 5);    // *a + 5 = 0060FE78

    return 0;
}


将二维数组的首地址传递到另一个函数里面,此时函数的形参就需要定义为数组指针


#include <stdio.h>


// 数组指针的用法
// 可以将二维数组的首地址传递到另一个函数里面,此时函数的形参就需要定义为数组指针
void fun(int(*p)[5],int x, int y)
{
    p[0][1] = 101;
	
	// *(*p +1) = 101;
	// p是行指针, *p降级为列指针 , *p +1 第0个元素+1就是第1个元素, * (*p +1) 取值
}

void test2()
{
    int i,j;
    int a[3][5];
    fun(a,3,5);

    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

int main(int argc, char *argv[])
{

    test2();

    return 0;
}


// 4199887     101        4218912   -1         16515072
// 6356648     4198762    0         4200351    4200368
// 2008309326  0          1         16520888   97


一维数组 – 数组指针


#include <stdio.h>


int main(int argc, char *argv[])
{

    int a[10];
    printf("%p\n",a);      // 0060FE78    9 A B C
    printf("%p\n",a+1);    // 0060FE7C    一维数组名字 为首元素地址 +1 跳一个整型元素

    printf("%p\n", &a);    // 0060FE78    9 A B C D E F 80 ... 90 ...A0  8+16+16=40个字节
    printf("%p\n", &a + 1);  // 0060FEA0   &a 就变成一个一维数组指针,是int (*p)[10]类型了。

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值