有任何不懂的问题可以评论区留言,能力范围内都会一一回答
本期我们主要通过数组讲解指针+-整数和指针-指针
数组本质上和指针是相似的,数组名是数组首元素的地址,我们也可以通过指针去访问数组,这个后面会放在数组与指针思考抽一期去讲解
1.指针加减整数
首先我们要明确一点就是数组名是数组首元素地址
其次我们知道数组元素之间的元素是连续的,因此我们得到首元素地址我们就可以通过得到其他元素的地址,然后再进行访问。
我们先创建一个数组,然后尝试用for循环和指针去遍历
int main(void) {
int arr[6] = { 1,2,3,4,5,6 };
int* p = &arr[0];
int sz = sizeof(arr) / sizeof(arr[0]);
for (int a = 0; a < sz; a++)
{
printf("%d\n", *(arr+a));
}
return 0;
}
很显然我们对指针进行整数加减就是对数组不同元素的访问
但是同时引出一个问题就是如果是二维数组呢???我们改如很去处理呢?
二维数组用指针访问非常麻烦,可以先看前面的数组与指针思考的类容,后面我也会去填这个坑的
但是要记住指针类型一定要和数组类型一致,数组是int[]类型的,那么指针最好是int*类型的,不然容易出错
2. 指针减指针
指针减指针要确保:相减的两个指针要指向同一个数组或者空间,不然就算编译可以通过,计算的结果也是不可控的。
指针减指针本质上得到的是指针之间元素的个数
如图所示它既可以是正的也可以是负的。
最后给大家留个思考题
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int arr[6] = { 1,2,3,4,5,6 };
char* p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
for (int a = 0; a < sz; a++)
{
printf("%d\n", *p);
p += 4;
}
return 0;
}
这串代码好像没有什么问题,但是有很大的问题,思考一下问题在哪,为什么?
提示: 但是要记住指针类型一定要和数组类型一致,数组是int[]类型的,那么指针最好是int*类型的,不然容易出错
这个我将在每日好题(2)中讲解
最后老规矩,以一张思维导图作为结尾