指针肯定不陌生,指针很重要,各种各样的代码都会用到指针,接下来就来见识见识它到底是个啥。
指针
首先介绍两个定义:指针与指针变量
- 指针:就是保存地址的变量;
- 指针变量:变量的值是内存的地址,普通变量的值是实际的值,指针变量的值是具有实际值的变量的地址;
指针的两个运算符:&与*
- &是一个取地址的运算符
*
除了表示乘积运算之外,在指针里表示访问地址; * 是一个单目运算符,用来访问指针的值所表示的地址上的变量;
概念定义类的不是很好理解,其实简单来说可以这样记:
& 是取地址 * 是访问地址 ;&与*互相反作用
格式:
- 输出地址(指针):printf(“%p,&变量名);或printf(”%p,指针);
- 解读一段代码可能会更好理解
- int* p = &i ;
- *表示p是一个指针,它指向的是一个int,现在把i的地址交给了p;
注意:
- i是一个普通变量(普通变量的值是实际的值),p是一个指针变量(指针变量的值是具有实际值的变量的地址);
所以&i表示取i的地址赋予了指针p; *p
是读取p的地址所以就指向了i;即p=&i;*p
=i;
*p
成了一个值;可以做左值或右值(叫左值、右值是因为*p表示的是一个数值,在=左为左值,在=右就是右值)
通过改变*p的值从而i的值也随之改变;这是因为p是指向i的地址,*p通过访问地址变成了此地址上的表达量
- *&i<==>i;&i读取地址而
*
是访问地址,则*&
就相当啥也没有改变
指针一开始有点不好理解,随着不断的打交道,自己写的代码慢慢会用到指针,不要慌张,理解以后就会好很多
const类型指针
const类型指针不常用,但还是介绍一下,要是没有理解指针的含义这部分可以不看的,影响不大,主要是如果遇到能看懂啥意思就行。
const类型指针有两种:
1. 指针是const
- 指针是const:表示一旦得到某个变量的地址,不能指向其他变量 (指针不可修改)
- int *const q = &i;//q是const
- *q=26;//OK
- q=&j;//ERROR
2. 所指是const
- 所指是const:表示不能通过这个指针去修改那个变量 (通过指针不可修改)
- const int *p = &i;//(*p)是const
- *p=26;//ERROR
- i=26;//OK
- p=&j;//OK
OK是可执行,ERROR是不可执行
数组属于:指针是const
int a[ ] <==> int *const a
在一些循环里数组可以当做地址来用
将函数minmax中的数组 a[ ]改为指针 *a
数组 a[ ]改为指针 *a没有影响是 因为数组就是一种指针;
int a[ ] <= => int *a <= => int *const a