通过对指针加减运算也就是指针移动,可以很方便的对数组元素修改或访问。
- 步长:指针指向的类型所占用空间大小,即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;
}