当前位置: 代码迷 >> 综合 >> 指针与数组(移动指针访问数组)
  详细解决方案

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

热度:36   发布时间:2024-01-21 20:15:07.0

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

  • 步长:指针指向的类型所占用空间大小,即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); //应输出104p--; //指针类型减n后,内存首地址向前移动 n*sizeof(类型) 字节printf("p = %u\n", p); //应输出100printf("--------------\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;
}

 

  相关解决方案