1.操作申请的堆内存必须使用
2.值传递是按值传递,修改被传递的对象必须通过对象的指针来完成
3.数据总线:数据信息传送,位数与电脑int值相等
地址总线:位数决定了CPU可以直接追寻
32位232KB,4G
地址总线(指针)=数据总线(int整型)
8个位,一个字节来访问,小于一个字节的用位操作
数组:int double char
指针:int数据类型,double数据类型,char数据类型
int保存整型,char存储字符
任何程序数据载入内存后,在内存中有地址=指针//只看最后一个*号,前面的只不过是type类型
为了保存一个数据在内存中的地址=指针变量
指针理解为int整型,只不过它存放的变量为内存地址而不是普通数据
P即第P个字节,但不能进行加减乘除
指针指向数据的存放位置
TYPE *P P是指向TYPE的指针
指针类型长度为4
占用字节数大于1,则其变量的地址就是地址值最小的字节的地址
从低地址到高地址
栈区,堆区,静态数据区,方法区
不同区域区有不同的生命周期:num是main函数中的局部变量,因此当main函数被启动时,被分配在栈内存上,当main执行结束时,消亡
内存在逻辑上会被划分为:栈区,堆区,静态数据区,方法区
TYPE *P
P++
不是+1,而是加sizeof(Type)
指针变量:用来保存指针的变量就是指针变量
也是一种变量,指针变量也符合前面变量和内存主题中的特性(类型和值)
指针的类型:决定了这个指针指向的内存的字节数并如何解释这些信息,不同类型的指针对相同指针的值解析不同(字节数不同)得到不同的数据
指针的值:地址为…指针的值就为…
指针变量也是一种程序数据,也有自己的指针,形成制针的指针
在变量名前写一个*来变成对应类型的指针变量,必要时加()来避免优先级的问题
int a//int类型变量a
int *a//int*变量a
int arr[3] 包含3个int元素的数组
int (*arr)[3] //指向包含3个Int元素的数组的指针变量(对应变量类型的指针变量
int*p_int 指向int类型变量的指针
double*p_double 指向idouble 类型变量的指针
struct Student *p_struct //结构体类型的指针
int(*p_func)(int,int)指向返回类型为int,有两个int形参的函数的指针
int**p_pointer //指向整型变量指针的指针
&取得一个变量的值
特俗情况不取地址:
1.数组名的值就是这个数组的第一个元素的地址
2.函数名的值就是这个函数的地址
3.字符串字面值常量作为右值时,就是这个字符串对应的字符数组的名称,也就是这个 字符串在内存中的地址
p=p+1的意思是让p指向原来指向的内存块的下一个相邻的相同类型的内存块
指针变量用来解地址,读数据
浅拷贝:
int*p1=& num;
int*p3=p1;
(p1.p3共享数据num)
空指针(Null)
任何程序数据都不能存储在地址为0的内存块中,它是被操作系统预留的内存块
Null指针用于表示特定的指针目前并未指向任何东西。一个用于在某个数值的函数可能返回一个(指向查找到的数组元素的指针),如果没找到,则返回一个Null指针。
内存的动态分布:Null用来避免内存被多次释放,造成经常性的段错误,在free或者delete内存分配的动态后,都应该立即把指针置空,避免出现