4、指针运算
4.1、指针加整数
1. #define N_VALUES 5 2. float values[N_VALUES]; 3. float *vp; 4. //指针+-整数;指针的关系运算 5. for (vp = &values[0]; vp < &values[N_VALUES];) 6. { 7. *vp++ = 0; 8. }
对指针加1其实是加上指针所指向类型的大小,指针的类型决定了指针向前或者向后走一步有多大(距离)。
这里需要注意:
标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。
4.2、指针-指针
1. //int main() 2. //{ 3. // int arr[10] = { 0 }; 4. // printf("%d\n", &arr[9] - &arr[0]);//9 5. // printf("%d\n", &arr[0] - &arr[9]);//-9 6. // 7. // return 0; 8. //}
指针 - 指针得到的数值的绝对值:是指针和指针之间的元素个数
而这项运算的前提条件是:指针和指针指向了同一块空间
4.3、指针的关系运算
地址是有大小的,指针的关系运算就是比较指针的大小
1. #define N_VALUES 5 2. float values[N_VALUES]; 3. float *vp; 4. for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--) 5. { 6. *vp = 0; 7. }
如上述代码就是一个简单的指针的关系运算,对velaus进行初始化
5、指针和数组
在将指针和数组之前,我们得清楚指针和数组的关系,这里我们需要明白
指针变量就是指针变量,不是数组,指针变量的大小是4/8个字节,专门用来存放地址的。数组就是数组,不是指针,数组是一块怜恤得控件,可以村放一个或者多个类型相同得数据。
既然我们我们讲得是指针和数组,那么它们之间有什么关系呢?哲理我们还需要明白
数组中,数组名其实是数组首元素的地址,数组名==地址==指针,当我们知道数组首元素的地址的时候,因为数组又是连续存放的,所以通过指针就可以遍历访问数组,数组可以通过指针来访问
如果还不明白他们之间的关系,可以看一看下图
这里我们需要注意:数组名是首元素地址
两个情况意外:sizeof()和&
6、二级指针
二级指针就是用来存储指针变量的变量,怎么理解呢?我们先看一段代码;
1. int main() 2. { 3. int a = 10; 4. int* p = &a; 5. return 0; 6. }
如上述代码,p是指针变量,用来存放a的地址,但是p是变量,只要是变量就需要在内存中开辟空间,而二级指针里面存放就是p的地址;
我们监视后发现确实如此
使用格式如下
1. int** pp = &p; 2. //int*是在说明pp指向的p是int*类型的变量 3. //*在说明pp是一个指针变量
我们再来看一下简单应用
1. //int main() 2. //{ 3. // int a = 10; 4. // int* p = &a;//p是一级指针变量,指针变量也是变量,变量是在内存中开辟空间的,是变量就有地址 5. // int** pp = &p;//pp就是二级指针变量,二级指针变量就是用来存放一级指针变量的地址 6. // **pp = 100; 7. // printf("%d\n", a);//结果为100; 8. // return 0; 9. //}
7、指针数组
指针数组顾名思义就是用来存放指针(地址)的数组,下面就是一个简单指针数组,里面存放的是指针(地址)
若想使用里面的数据,使用方法如下,我们需要先在指针数组选择,访问那一地址,然后我们据根据需要选择所选地址里的内容,逻辑如下:
知道了逻辑,我们可以简单应用实现一下
这里有个误区需要注意,虽然指针数组访问方式与二位数组相同,但他们是不一样的,二维数组在内存中是连续存储的,指针数组不一定,它是将一个个地址集合放在了一个指针数组里面,就像拼装在了一起
创作不易,一件三连加关注!!!
创作不易,一件三连加关注!!!