1、什么是指针?
指针就是地址,那么什么是地址:内存单元的编号
内存里面有很多单元,每个单元有8位(8个0,或8个1) 一个字节8个 ,00000000--一个单元编号 (地址)
int main(void) { int * p; int i =3; p=&i; }
p:指针变量,可以存放其它变量地址
p:保持了I的地址,因此 p指向I
p不是i ,i也不是p,更准确的说,修改p的值不影响i的值,修改i的值不影响p 的值
如果一个指针变量指向了普通变量,则,*p指针变量就完全等同于 普通变量
注意: 变量 p 和 i , int i = 3 则 2000H地址存放的是3,而 p是地址变量,则 存放的是 i 的地址 2000H
*p指的是以p的内容为地址的变量
2、指针与数组
:一位数组名 是一个指针常量 , 存放的是一位数组第一个元素的地址
int [] a ; &a[0] =a1、确定一个数组需要的变量?
a :数组名 也就是第一a[0]的地址
通过首个地址 确定数组的值
2、下标和指针的关系?
p[3]=*(p+3);
a [ 3 ] 等价于 指针 *(a+3) :a 是第一个元素的地址
3、sizeof(数据类型)的函数的基本应用
指针变量所占字节数 4个
理解 :
1、p,q,r 存放的地址 都存 第一个地址
2、一个X 有8个字节 ,每个字节有八位
3、*q ,*p,*r :找到第一个字节编号, 再通过 数据类型 获取长度
4、为什么指针变量的长度是4, 地址线32个 ,每个地址编号都要用32个0或1表示,那么久需要4个字节 八位
传统数组的缺陷:
1、不能主动释放内存,只能由函数执行完以后自动释放
2、长度必须是常整数
3、数组一旦定义,其长度就不能更改,数组长度在运行过程中不能自动扩充或者减少
int * p = (int *)malloc(4);
1、要是侵入malloc.h的头文件
2、4表示请求系统为本程序分配4个字节
3、malloc函数只能返回第一个字节地址
4、需要强制转换(int * 告诉别人长度为4),
5、一共分配8个字节(int * p 有8个,malloc(4)分配了4个)
6、p 本身所占的内容是静态分配,p所指向的内存是动态分配的
free(p)
表示把p所指向的内存给释放掉
动态实现数组:
int a[5] :如果int 占4个字节,那么本数组总共包括20个字节,每4个字节代表一个变量
int len ;
int * pArr
pArr = (int *)malloc(4 * len *);
静态内存和动态内存的比较
静态内存是由系统自动分配,由系统自动释放
静态内存是在栈中分配的
动态内存是由程序员手动分配,手动分配
动态内存是在堆分配的(因为不是在栈中,所以可以跨函数使用)
结构体:
为了解决复杂的定义而存在
就是通过多个数据类型组成一个新的数据类型用来表示类
怎样使用结构体
赋值和初始化
如何去除结构体变量中的每一个成员
结构体变量的运算
结构体变量和结构体变量指针作为参数传递的问题
动态构造存放学生信息的结构体
找到结构体的地址, 再赋值,最后通过 pst -->age = 88赋值
pst -->age = 88 :在计算机内部会转换为*pst.age = 888