好记性不如烂笔头

最近复习的时候发现之前学过的知识发生遗忘,以此写下这篇文章加深印象

对于数组指针和指针数组这两个比较绕的东西,只有了解了本质才能熟练的运用它们

指针数组:里面全是指针类型的元素


#include<stdio.h>
int main()
{
    int i = 0;
    int a[3][4] = { {1,2,3,4} ,{5,6,7,8} ,{9,10,11,12} };//定义一个二维数组
    int* pa[3];//定义一个指针数组
    for (i = 0; i < 3; i++)//给指针数组赋值
        pa[i] = a[i];
    printf("指针数组的内容为:\n");
    for (i = 0; i < 3; i++)//打印出指针数组的内容
    {
        int j;
        for (j = 0; j < 4; j++)
            printf("%d ", *(*(pa + i) + j));
        printf("\n");
    }
    //以下均为不同方式的解引用操作
    printf("不同解引用操作的结果为:\n");
    printf("%d,%d\n", a[1][1], *(pa[1] + 1));
    printf("%d,%d\n", a[1][1], *(*(pa+1) + 1));
    printf("%d,%d\n", a[1][1], (*(pa + 1))[1]);
    printf("%d,%d\n", a[1][1], pa[1][1]);
    return 0;
}

数组指针:指向数组的指针

                                                        int (*p)[4]=a;

括号中的*表明 p 是一个指针,它指向一个数组,数组的类型为int [4],这正是 a 所包含的每个一维数组的类型。             []的优先级高于*()是必须要加的

 对指针进行加法(减法)运算时,它前进(后退)的步长与它指向的数据类型有关,p 指向的数据类型是int [4],那么p+1就前进 4×4 = 16 个字节,p-1就后退 16 个字节,这正好是数组 a 所包含的每个一维数组的长度。也就是说,p+1会使得指针指向二维数组的下一行,p-1会使得指针指向数组的上一行。数组名 a 在表达式中也会被转换为和 p 等价的指针!


#include <stdio.h>
int main(){
    int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
    int (*p)[4] = a;
    printf("%d\n", sizeof(*(p+1)));
    return 0;
}      
//16

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值