学前服用
动画版的这个听完再去看书上的实例真的很不错!www.bilibili.com/video/BV1MJ…
前言
刚升本科学校开了一门数据结构,自己在b站往后学了一下发现不搞懂C语言的指针很难去理解,于是我又重温经典C Primer Plus
这本书写的真的很细致,加上看书和看优质的b站视频,我对指针有了一点简单的了解
纸上得来终觉浅,绝知此事要躬行
好了,开始奥里给了~
资源在这
它来了,它来了。C语言的灵魂!
没错它就是指针
上干货!!!
一、什么是指针
从根本上看,指针是一个值为内存地址的变量,如int类型的值是整数
char类型的值是字符
指针变量的值就是内存地址
二、 指针的用法
把指针作为函数参数使用,以及为何这样用
假设一个指针变量名是ptr,可以编写如下语句:
ptr = &pooh; //把pooh的地址赋给ptr
对于这条语句,我们说ptr“指向”pooh。
ptr和&pooh 的区别是ptr是变量,而&pooh是常量。或者,ptr是可修改的左值,而&pooh是右值。
当然还可以把ptr指向别处: ptr = &bah; //把ptr指向bah,而不是pooh 现在ptr的值是bah的地址。要创建指针变量,先要声明指针变量的类型。假设想把ptr声明为储存int类型变量地址的指针,就要使用下面的新运算符。
2.1 间接运算符 *
假设已知 ptr指向bah,
如下所示:
ptr = &bah;然后使用间接运算符* (indirection operator)找出储存在 bah 中的值,该运算符有时也称为解引用运算符(dereferencing operator)。不要把间接运算符和二元乘法运算符(*)混淆,虽然它们使用的符号相同,但语法功能不同。
val = *ptr;//找出ptr指向的值
语句ptr = &bah;和val = *ptr;放在一起相当于下面的语句;
val = bah
我的理解:
指针变量里面存放的是内存地址,既然是存放,那就有对于的取出操作,怎么取出?就在指针变量前面加上*即可!
小总结:
地址运算符:&
后面跟一个变量名时,&给出该变量的地址
示例:
&nurse表示变量nurse的地址
地址运算符:*
后跟一个指针名或地址时,*给出存储在指针指向地址上的值
示例:
nurse = 22;
ptr = &nurse; //指向nurse的指针
val = *ptr; //ptr指向的地址上的值赋给val
以上三条语句的结果是把22赋给val
2.2 声明指针
声明指针变量时,必须指定指针所指向变量的类型。咋听着这么绕呢?
用我的理解来说就是:
指针的变量类型要和指针所指向变量的类型一样,指针值的变量是啥类型,指针变量就是啥类型
例如:
int * pi; // pi是指向int类型变量的指针
char * pc; // pc是指向char类型变量的指针
float * pf, * pg; // pf、pg都是指向float类型变量的指针
类型说明符表明了指针所指向对象的类型,星号(*)表明声明的变量是一个指针。int * pi;声明的意思是pi是一个指针,*pi是int类型
这个图是从上往下看,能简单理解下使用指针的过程
*和指针名之间的空格可有可无。通常,程序员在声明时使用空格,在解引用变量时省略空格。
2.3 使用指针在函数间通信
#include <stdio.h> void interchange(int * u,int * v);//声明在函数里传入一个int类型指针u和int类型指针v int main(void) { //解决交换函数的问题 int x = 5, y = 10; printf("Originally x = %d and y = %d.\n", x, y); interchange(&x,&y); //把地址发送给函数 printf("Now x = %d and y = %d.\n",x ,y); return 0; } void interchange(int * u, int * v) { int temp; temp = *u; *u = *v; *v = temp; }
程序分析
首先看函数调用,
interchange(&x,&y);这里的两个参数,不是x和y的值,而是x和y的地址
后来就是通过一个temp变量进行变量的地址交换
小总结:
变量:名称、地址和值
编写程序时,可以认为变量有两个属性:名称和值(还有其他性质,如类型,暂不讨论)。
计算机编译和加载程序后,认为变量也有两个属性:地址和值。地址就是变量在计算机内部的名称。
简而言之,普通变量把值作为基本量,把地址作为通过&运算符获得的派生量,而指针变量把地址作为基本量,把值作为通过*运算符获得的派生量。