1. 指针运算
1.1 算术运算
- 加减+、-
指针与整数相加:表示指针指向下个变量。
指针与整数相减:表示指针指向上个变量。
指针与指针相减:两个指针的元素间隔个数。
- 自增自减++、–
指针能够算术运算,必然能够自增自减。
*p++
/*p--
操作说明
-
操作数是指针
-
自增自减
++
、--
优先级高于解引用*
计算过程
- 运算
++
/--
,返回的是p
的值(地址),然后p
自加/自减。 - 运算
*
,获取p
指向的值。
等价于
*p;
p=p+1;
自增自减 | 相当于 |
---|---|
*q++ |
*(q++) |
*q-- |
*(q--) |
*++p
/*--p
操作说明
- 操作数是指针
- 前缀自增自减
++
、--
和解引用*
的结合律是自右向左。 - 前缀自增自减
++
、--
在解引用*
的右边,优先计算。
计算过程
- 运算
++
/--
,p
自加/自减,返回的是p
自加/自减后的值(地址)。 - 运算
*
,获取p
指向的值。
自增自减 | 相当于 |
---|---|
*++q |
*(++q) |
*--q |
*(--q) |
++*q
/--*q
操作说明
*
操作数是指针,前缀自增自减++
、--
操作数是指针指向的值。- 前缀自增自减
++
、--
和解引用*
的结合律是自右向左。 - 解引用*在前缀自增自减
++
、--
的右边,优先计算。
计算过程
- 运算
*
,获取p
指向的值。 - 运算
++
/--
,p
指向的值自加/自减。
自增自减 | 相当于 |
---|---|
++*q |
++(*q) |
--*q |
--(*q) |
如果一个表达式里有多个运算符,则先进行优先级比较,先执行优先级高的运算符;如果优先级相同,那就看结合性,根据结合方向来做运算。
1.2 单位长度
从上面可以看到,指针的加1减1,地址并非加1减1。
应用范围
指针的算术运算表示在一片连续空间上的移动。
指针的比较运算也是用于一片连续空间的地址比较。
常用于数组等连续内存。
2. 指针类型
- 无论指向什么类型,所有指针的大小都是一样的,都是地址的大小。
char* str;
short* ps;
int* pn;
long* pl;
long long* pll;
float* pf;
double* pd;
long double* pld;
- 指针类型转换
指向不同类型的指针不能直接相互赋值(特例void*
),需要强制类型转换。
char* str = "abcd";
int* p = str;
指针类型转换没有改变指针内的地址,也没有改变指针指向的值,只是改变了移动的单位长度。
void
类型的指针
void*
是一种很特别的指针,表示指向未知类型的指针,并不指定它是指向哪一种类型的数据,而是根据需要转换为所需数据类型。
int n = 0;
int* p = &n;
void* q = p;
int* k = (int*) q;
指针作用小结
- 较大数据结构体传入时做参数。
- 传入数组后,对数组做操作。
- 函数需要多个返回值时,作为返回值参数。
- 动态申请内存。
- 避免使用未初始化指针、空指针和野指针。