一. 指针的两个要素
(一些没什么用,但是必不可少的东西)
- 首地址
注意呀 32位操作系统任何“首地址”(指针)都是4B的!! - 指类(指针(首地址)所指向的内存空间的数据类型)
二. 指针变量的定义及其指类
- int p; - -p是int类型的变量,占用四字节的内存空间
- int *p; - -p是int * 类型的变量,占用四字节的内存空间,他的指类是int类型
- short p; - -p是short类型的变量,占用两字节内存空间
- short * p; - - p是short * 类型的变量,p占用四字节内存空间,他的指类是short类型
- short **p(二阶指针); - - p是short **类型的变量,p占用四字节空间,他的指类是short*类型
三. &和*
(这里玩一些绕口令游戏)
1. &取地址运算符
(1).&单目运算符,运算符优先级低
(2).不能对常量和表达式进行操作
不能用 && - - 逻辑与运算符,一个双目运算符,也不能&(&i)这样用,因为(&i)是表达式
- 举个栗子
int i , *p , * *r;
i 的类型是int
p的指类是int
r的指类是int *
&p的指类是int *,其本身的类型是 int **
p = &i ; 将 i 空间的首地址赋值给空间 p (p指向i)。这时,i 的类型就是 p 的指类
r = &i ; 将 i 空间的首地址赋值给空间 r (r指向i)
然而,经本人上机验证,这条语句在Dev运行会出现警告,因为r 与 i 的类型不同。得到结论 参与运算的指针的指针类型必须保持一致
2. * 指向运算
(1).*单目运算符,运算优先级与&相同,并且,*与&运算互为逆运算
&*i <=> i ---------------------- *&i <=> i
(2).可以对 指针常量、指针变量、指针表达式进行应用,但是, 不可以对 值类常量、变量、表达式进行应用。
-
举个栗子
单单int *p是错的
你得
int i, *p;
p = &i;
这样对啦(#^ . ^#)! -
绕口令来啦
记住呀!
*某,在=左边叫--------“某”所指向的空间
*某,在=右边叫或者在表达式内--------“某”所指向的空间的值
*p = **r+*q
p 所指向的空间
r 所指向的指针 所指向的空间的值
q 所指向的空间的值
来 我们凑一凑即为:
r 所指向的指针 所指向的空间的值 与 q 所指向的空间的值求和,将和赋值给 p 所指向的空间
(可以自己随便搞搞 * 瞎玩一下,这里不再多说) -
强调一点
变量定义语句中的*,不是指向运算符,是变量为指针类型的说明符!
int *p = &i;
将 i 空间的首地址赋值给 一个int * 类型的变量p