c++指针学习
为何学习指针呢?qwq因为用结构体实现的链表需要指针(看不懂)。
1、何为指针
指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。
2、内存数据的规律
1.计算机中所有数据都是以二进制储存的。
2.数据类型决定了占用内存的大小
3.占据内存的地址就是地址值最小的那个字节的地址 如数组a[10],则数组a的地址为a[0]的地址。
3、指针变量
指针变量就是用来保存指针的对象,我一般理解为保存地址。
如果说指针变量p保存了变量a的地址,我们称p指向了变量a。
我认为指针变量本身也是变量,所有指针变量的地址也可以被指向。
4、创造指针变量
1 | T *p[10]; |
5、获取对象地址
指针保存地址,要想获得地址,需要取地址符(&)。
1 | int add(int a,int b); |
我们发现&有时用,有时不用。
小结:
1.数组名的值就是首个元素的值(数组在内存中连续储存)。
2.函数名的地址就是这个函数的地址。
3.字符串字面值常量作为右值时,就是这个字符串对应的字符数组的名称,也就是字符串的地址 。
6、解析地址对象
如果指针指向了一个地址,则允许使用接应用符(*)来访问对象,如下:
1 | int age = 19; |
对于结构体和类 则使用->符号访问内部成员:
1 | struct Student |
7、指针的状态
指针的值(地址)总会是下列四种状态之一:
1.指向一个对象的地址
2.指向紧邻对象的下一个空间 用于迭代器和指针的运算 如end()就不是指向最后一个元素而是最后一个元素的下一个
3.空指针 NULL(0)
4.无效指针(野指针) 不是很懂搜到的记录一下
无效指针:指针变量的值是NULL,或者未知的地址值,或者是当前应用程序不可访问的地址值,这样的指针就是无效指针,不能对他们做解指针操作,否则程序会出现运行时错误,导致程序意外终止。
任何一个指针变量在做解地址操作前,都必须保证它指向的是有效的,可用的内存块,否则就会出错。坏指针是造成C语言Bug的最频繁的原因之一。
未经初始化的指针就是个无效指针,所以在定义指针变量的时候一定要进行初始化。如果实在是不知道指针的指向,则使用nullptr或NULL进行赋值。
8、指针之间的赋值
1 | int *p = &a; |
p与p1地址不同但指向的内存地址相同。