1

image
最近在看数据结构 顺便总结了下指针。上学的时候老师总说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次)

指针变量

指针变量是存放内存单元地址的变量-----简单来说就是存放地址的变量
来看下图定义一个指针变量:
image

接下来我们来看看代码

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) {}

看明白了吗,指针变量也是有自己的地址的,所以传递的时候是传递了指针变量的地址过去,就变成了指向指针的指针。

致谢

感谢你看完这篇文章,有什么不对的地方欢迎指出,谢谢🙏


hpinke
125 声望3 粉丝

A better you a big world