前言
指针阶段,需要用心来学习,快可能会导致慢的效果。应该先从整体上学习指针的知识体系,再接着去学习一级指针、二级指针、多级指针,甚至于指针数组、数组指针,最后才能有基础去学习更加复杂难懂的函数指针、指针函数。
一、 指针细节归纳
-
指针是一种变量,会占用4个字节的内存空间,空间存放的是其他内存空间的地址。
-
*ptr操作的是内存空间。申明时,*表示申明的变量是指针;使用时,*表示使用的是指针所指的空间的值;
*ptr=
表示给内存赋值->内存写入,=*ptr
表示从内存读取数据 -
牢记指针变量不等于指针所指向的内存块,如图所示:
-
注意:指针指向谁,就把谁的地址给指针,不停的给指针赋值就是不停地改变指针指向(此时并没有给指针赋值,所以和对应的内存空间没有关系)
-
间接赋值是指针存在的最大的意义。一般而言:常用高级指针来更改低一级指针的值。比如:int a; int* ptr1; int** ptr2;(函数调用时,用实参取地址传给形参,形参运算结束后把值传给实参。)
-
指针必须与内存联系起来学习、思考。
主调函数可以把堆区、栈区、全局区地内存地址传给被调用函数地形参==是输入形参,被调用函数只能返回栈区、全局区数据(因为被调用函数一旦执行完毕就被析构了),被调用函数地形参运算后赋给实参地地址==输出形参
小记
更新于2020.10.28
二、一级指针&一维数组
1、一级指针
指针变量的本质是存放内存地址的变量,而我们通常看到的变量 例如:int a=10,这里的a其实就是一块四字节的内存块的别名。
2、一维数组
一维数组在内存中就是一串连续的内存块,数组名就是其内存首地址,可以通过它随机遍历每个元素,甚至每个字节的内容。
3、两者的联系
指针和数组有着天然的对应关系。具体的关系见下图代码所示:
int *ptr=NULL;
int num[5]={1,2,3,4,5};
ptr=#//此时,记住ptr本质是指针,但却可以用数组的方式来使用。
//比如:ptr+3,ptr++,随机访问数组内容。
4、强调的点——指针++、–的偏移量
注意一点即可:字节是内存的最小单元,但是类型决定一切。换句话说:指针是什么类型,++或者–就偏移这种类型的字节长度