指针与数组(移动指针访问数组)

通过对指针加减运算也就是指针移动,可以很方便的对数组元素修改或访问。

  • 步长:指针指向的类型所占用空间大小,即sizeof(类型)
  • 指针类型 + n ,内存首地址将会向后移动 n * 步长 字节
  • 指针类型 - n ,内存首地址将会向前移动 n * 步长 字节
  • 数组名如果出现在表达式中,数组名将会转换为数组第一个元素的内存首地址。但sizeof和&例外。
  • 数组[下标] 最终会展开为:数组 + 下标。如:arr[2]、2[arr]将展开为:arr+2、2+arr相当于*(arr+2)

#include <stdio.h>
/*
时间:2022-04-17 14:34
作者:sgbl888
功能:指针与数组
知识点:
    1、指针类型加n后,内存首地址向后移动 n*sizeof(类型) 字节,其中sizeof(类型)也称为 步长
    2、指针类型减n后,内存首地址向前移动 n*sizeof(类型) 字节
    3、步长为指针所指向的类型所占用空间大小
    4、数组名如果出现在表达式中,会将数组名转换为数组第一个元素的内存首地址。如果用&或sizeof则不会
    5、数组[下标]最终会展开为 数组 + 下标 形式。比如 *(arr+2)、2[arr]
*/
int main(){
    int* p = (int*)100;
    printf("p = %u\n", p);
    p++; //指针类型加n后,内存首地址向后移动 n*sizeof(类型) 字节
    printf("p = %u\n", p); //应输出104
    p--; //指针类型减n后,内存首地址向前移动 n*sizeof(类型) 字节
    printf("p = %u\n", p); //应输出100
    printf("--------------\n");

    //指针与数组
    int arr[] = {2, 4, 6, 8, 10};
    printf("arr[0] = %hd\n", arr[0]);
    printf("arr[1] = %hd\n", arr[1]);
    printf("arr[2] = %hd\n", arr[2]);
    printf("arr[3] = %hd\n", arr[3]);
    printf("arr[4] = %hd\n", arr[4]);

    int* pr = arr; //数组名出现在表达式中,会把数组名转换为数组第一个元素的内存首地址
    printf("pr = %u\n", pr);
    printf("&arr[0] = %u\n", &arr[0]);

    //通过指针移动访问数组元素
    *pr = 9; //将数组的第一个元素赋值为7
    *(pr+1) = 7; //将数组的第二个元素赋值为7
    *(pr+2) = 5;
    *(pr+3) = 3;
    *(pr+4) = 1;
    
    //数组下标访问方式最终会展开为 数组名 + 下标。如arr[2],编译器会展开为2[arr] = *(arr+2)的形式
    printf("arr[0] = %hd\n", *(arr+0)); //数组名出现在表达式会转为第一个元素的内存首地址
    printf("arr[1] = %hd\n", 1[arr]); //展开为*(arr+1)
    printf("arr[2] = %hd\n", *(pr+2)); //相当于arr[2]
    printf("arr[3] = %hd\n", 3[arr]);
    printf("arr[4] = %hd\n", *(pr+4));

    //在sizeof或&不会再将数组名转换为第一个元素的内存首地址
    printf("arr sizeof: %zd\n", sizeof arr);
    printf("&arr = %u\n", &arr);

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值