最近在看数据结构 顺便总结了下指针。上学的时候老师总说C语言的灵魂就是指针,理解了指针才是真正掌握了C语言,现在看来确实是没错的。
为什么会有指针
指针为什么会诞生呢?我们一直用的数组不好吗?
我们是一开始就接触数组的,所以有一种先入为主的感觉,可是数组也有自己的缺点,数组在查询的时候是很快的,时间复杂度是常数级别O(1)的。但是要是插入和删除呢?时间复杂度还会是常数级别吗?
举例:int a[5] = {1,2,3,4,5}
如果我要在2和3之间插入一个数字,要怎么做呢?是不是应该先把3,4,5向后移一位,然后在插入进去。这样时间复杂度是多少呢?答案是O(n)。是不是比查询的时候慢多了呢?是的,就是慢了很多,所以需要改善它, 指针就这样诞生了。
指针的定义
- 指针就是地址,地址就是指针
- 指针的本质是一个操作受限的非负整数
地址的定义:地址就是内存单元的编号,从0开始的非负整数
范围:0---FFFFFFFF[0-4G-1] (地址线是32位,刚好控制2的32次)
指针变量
指针变量是存放内存单元地址的变量-----简单来说就是存放地址的变量
来看下图定义一个指针变量:
接下来我们来看看代码
int c = 76;
//定义名字为pointer的指针变量
int * pointer;
//将变量的C的地址赋值给指针变量 pointer
//赋值后,称指针变量 pointer指向了变量c
pointer = &c;
我们有时会问 能不能写成 pointer = c;绝对不行!因为pointer是存放地址的变量,所以只能存在地址
指针变量如何访问变量的值?
既然指针变量中存放的是“某个变量的地址”可否通过“指针变量”访问 “它所指向的变量” ?
答案是:可以的,可以利用 指针运算符 * 实现。我们来看段代码
//比如:
int c = 76;
int * pointer = &c;
printf("%d\n", *pointer); //打印出76
//则 *pointer 为 pointer所指向的存储单元的内容
//pointer 所指向的存储单元的内容 是 “变量C” 为76
所以总结
指针变量也是变量,只不过它存放的不能是内存单元的内容,只能存放内存单元的地址。
普通变量前不能加*
常量和表达式前不能加&
答疑
有的小伙伴可能还看到过一种定义 int **pointer
这种就是指向指针的指针了,哈哈听上去拗口,看看伪代码
int main()
{
int * p;
func(&p);//传递的是指针变量的地址
}
void func(int **q) {}
看明白了吗,指针变量也是有自己的地址的,所以传递的时候是传递了指针变量的地址过去,就变成了指向指针的指针。
致谢
感谢你看完这篇文章,有什么不对的地方欢迎指出,谢谢🙏
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。