学习数据结构不应停留在伪算法,而应该用编程语言去实现(实现语言必须有指针)
指针
指针的重要性:
指针式C语言的灵魂
定义:
地址
内存单元的编号
从0开始的非负整数
范围:0-ffffffff【4G-1】
指针:
至真就是地址,地址就是指针
指针变量是存放内存胆原地址的变量
指针的本质是一个操作受限的非负整数
分类:
1. 基本类型的指针
2.指针和数组的关系
一维数组中数组名存放数组首地址。
a[3]等价于(a+3)等价于(3+a)等价于3[a]
a+2=a+2*(a所指向的变量的字节数)
指针变量长度为4个字节,用第一个字节的地址表示整个变量的地址。
注:
子函数修改变量值,参数要传递变量的地址。子函数要修改指针变量,参数应该传递指针变量的地址。
内存是CPU唯一能直接访问的大容量存储器
结构体
为什么需要结构体
为了表示一些复杂的数据,而普通的基本类型变量无法满足要求
什么叫结构体
结构体是用户根据实际需要自己定义的复合数据类型
如何使用结构体
创建数据类型:
struct Student
{
int sid;
char name[20];
int age;
}; //分号不能省略
int main(void)
{
struct Student st ={1000,”zhangsan”,10}; //定义结构体变量st
struct Student *pst;
pst = &st;
第一种方式:
st.sid=99
第二种方式:
pst->sid=99; //pst->sid 等价于(*pst).sid 等价于st.sid
printf(“%d %s %d\n”,st.sid,st.name,st.age);
return 0;
}
两种方式:
struct Student st ={1000,”zhangsan”,10}; //定义结构体变量st
struct Student *pst = &st;
1.st.sid
2.pst->sid
pst所指向的结构体变量中的sid这个成员
注意事项
结构体变量不能加减乘除,但可以复制。
普通结构体变量和结构体指针变量作为函数参数的问题
int main(void)
{
struct Student st;
f(&st);
g(st); //耗内存,耗时间 不推荐
g2(&st); //用指针输出 推荐
//printf(“%d %s %d\n”,st.sid,st.name,st.age);
return 0;
}
void g(struct Student st)
{
//printf(“%d %s %d\n”,st.sid,st.name,st.age);
}
void g2(struct Student *pst)
{
//printf(“%d %s %d\n”,pst->sid,pst->name,pst->age);
}
void f(struct Student *pst)
{
(*pst).sid =99;
strcpy(pst->name,”zhangsan”);
pst->age =22;
}
动态内存的分配和释放
int main(void)
{
int a[5] = {4,10,2,8,6};
int len;
printf(“输入要分配的数组的长度:len = “);
scanf(“%d”,len);
int * pArr = (int *)malloc (sizeof(int)*len); //这一行效果与int a[5] 类似
//pArr[]可当做普通数组使用
*pArr=4; //类似于a[0] = 4;
pArr[1] = 10; //类似于a[1]=10;
printf(“%d %d”,*pArr,pArr[1])
free(pArr); //把pArr所代表的的动态分配的20个字节的内存释放
return 0;
}
跨函数使用内存问题
函数调用完,子函数中定义的变量(局部变量)会被释放。
问题:子函数中分配的内存函数结束后还能否继续使用?
例:
main()
{
int *p;
fun(&p);
...
}
int fun(int **q)
{
*q = (int*)malloc(4); //手动申请的内存,函数执行完后不会自动释放,必须手动free才可以释放。
}
C++中:A aa = new A();
等同于C中:A *pa = (A *)malloc(sizeof(A));
(内存不会自动释放)
创建链表例子:
跨函数使用内存例子:
# include <stdio.h>
# include <malloc.h>
struct Student
{
int sid;
int age;
};
struct Student * CreateStudent(void);
void ShowStudent(struct Student *);
int main(void)
{
struct Student * ps;
ps = CreateStudent();
ShowStudent(ps);
return 0;
}
void ShowStudent(struct Student * pst)
{
printf("%d %d\n", pst->sid, pst->age);
}
struct Student * CreateStudent(void)
{
struct Student * p = (struct Student *)malloc(sizeof(struct Student));
p->sid = 99;
p->age = 88;
return p;
}