(这里开始写正文…)#
created: 2025-11-04T18:16 updated: 2025-11-04T19:16#
指针的算数运算#
- 指针的算术运算
- 指针加上整数
- 指针减去整数
- 两个指针相减
在一个不指向任何数组元素的指针上执行算术运算会导致未定义的行为
只有在两个指针指向同一个数组时,把他们相减才有意义
指针加上整数 & 指针减去整数#
int a[10];
int *p = &a[0];
p = p + 2; //指针向右移动两个位置
p = p - 2; //指针向左移动两个位置
![[Pasted image 20251104182339.png]]
两个指针相减#
- 两个指针相减时,结果是指针之间的距离(用数组元素的个数来衡量)
指针比较#
- 只有在两个指针指向同一个数组时,用关系运算符进行指针比较才有意义,比较的结果依赖于数组中两个元素的相对位置
- 比较运算符
<、<=、>和>=
判等运算符
== 和 !=
指向复合字面量的指针#
- 复合字面量,可以用于创建没有名称的数组
int *p = (int []){3, 0, 3, 4, 1};
//p 指向一个 5 元素数组的第一个元素,这个数组包括 5 个整数:3、0、3、4 和 1
int a[] = {3, 0, 3, 4, 1};
int *p = &a[0];
指针用于数组处理#
#define N 10
...
int a[N], sum, *p;
...
sum = 0;
for (p = &a[0]; p < &a[N]; p++)
sum += *p;
- 尽管元素 a[N]不存在(数组 a 的下标为0~N-1),但是对它使用取地址运算符是合法的。因为循环不会尝试检查 a[N]的值,所以在上述方式下使用 a[N]是非常安全的
- 采用指针对数组进行处理的好处时可以节省执行时间
* 运算符和++运算符的组合#
*p++或 *(p++) | 自增前表达式的值是 *p,以后再自增 p |
用数组名作为指针#
- 用数组的名字作为指向数组第一个元素的指针
*(a+1) = 12// 把 12 储存到 a[1]
- 通常情况下,
a + i 等同于&a[i] *(a+i)等价于 a[i]
通过使用数组名作为指针,来简化数组遍历的方法
#define N 10
int a[N] = {0};
int *p;
for(p = a; p<a+N; p++){
sum += *p
}
- 虽然可以把数组名当作指针,但是不能给数组名赋新的值
数组型实际参数#
- 数组名在传递给函数时,总是被视为指针, 所以作为实际参数的数组的值是可能被改变的
- 如果不希望改变数组的值,可以在函数的形参的定义前面加上 const
对于形参而言,声明为数组跟生命为指针是一样的。但是对于变量是不一样
用指针作为数组名#
int a[N], i, sum = 0, *p = a;
...
for (i = 0; i < N; i++)
sum += p[i];
指针和多维数组#
处理多维数组的元素#
- 多维数组的内存的存储过程
- ![[Pasted image 20251104190636.png]]
int a[row][col];
int *p;
...
for (p = &a[0][0]; p <= &a[NUM_ROWS-1][NUM_COLS-1]; p++)
*p = 0;
处理多维数组的行#
$没看懂$
用多维数组名作为指针#
- @

