提示:这里主要是对于数组名(类指针)进行步长的探讨,介绍了 int类型的一维和二维数组和元素类型为指针的一维和二维的 步长
一、步长?
学习指针的时候,遇到指针加减某一整数的时候,指针会根据其自身的数据类型对其指向的地址进行移位操作。
如下:
int arr[3] = { 1,2,3 };
int* p = &arr[0]; //用数组的第一个元素的地址给p指针赋值
printf("%d", *(p + 1)); //int类型指针的步长是 4 那么第一个元素地址+4就是第二个元素的地址了
//那解引用之后的结果就是第二个元素的值了
二、常见步长的介绍
1.传统的
代码奉上:
int main()
{
int brr[3] = { 1,2,3 };//(int)一维数组
int a = 0;//普通整形变量
int* p = &a;
int arr[2][5];//(int)二维数组
int(*pr)[5] = arr;
printf("p\n");
printf("%p\n",p+1);
printf("%p\n",p);
printf("&brr\n");
printf("%p\n",&brr+1);
printf("%p\n",&brr);
printf("brr\n");
printf("%p\n",brr+1);
printf("%p\n",brr);
printf("pr\n");
printf("%p\n",pr+1);
printf("%p\n",pr);
printf("&arr\n");
printf("%p\n",&arr+1);
printf("%p\n",&arr);
printf("arr\n");
printf("%p\n",arr+1);
printf("%p\n",arr);
return 0;
}
上述代码运行的结果:
2.奇葩的(数组的元素类型是地址)
代码奉上:
int main()
{
int a, b, c, d, e, f, g, h;
int* arr[3] = { &a,&b,&c };
int* brr[2][3] = { {&a,&b,&c},{&d,&e,&f} };
printf("&arr\n");
printf("%p\n",&arr+1);
printf("%p\n",&arr);
printf("arr\n");
printf("%p\n",arr+1);
printf("%p\n",arr);
printf("&brr\n");
printf("%p\n", &brr + 1);
printf("%p\n", &brr);
printf("brr\n");
printf("%p\n", brr + 1);
printf("%p\n", brr);
return 0;
}
结果:
重点在于:
&数组名 表示的是数组的整体 ,那么步长的大小就是整个数组的大小
数组名 表示的是数组首元素地址,那么步长大小就看这个元素的类型大小
四、例题
int main()
{
int arr[2][3] = { {1,2,3},{4,5,6} };
int* prt1 = (int*)(&arr + 1);
int* prt2 = (int*)(*(arr + 1));
printf("%d %d\n", *(prt1-1),*(prt2-1));
return 0;
}
结果及分析:
总结
之所以对步长如此敏感 只要是学习了数组指针 对于步长有了新的认识