【数据结构郝斌】2、预备知识

学习数据结构不应停留在伪算法,而应该用编程语言去实现(实现语言必须有指针)

指针

指针的重要性:
  指针式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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值