写一个可变数组案例(包含堆栈方法介绍)

栈和函数返回

堆栈概念

定义:我们将所有变量使用的内存称为,而将为分配的内存区称为。举例说明比如main函数的局部变量(argc和argv)都在栈中。使用malloc()是动态分配是在堆中。
(个人理解:因为main函数中的两个变量已经定义,malloc()函数是对未分配内存进行申请)

  • 未已分配内存
    在未分配的内存区域,我们可以使用块为单位请求使用。
  • :-已分配内存
    只能由分配了这块的原始代码使用。
  • 堆栈:平时大家说的“”堆栈“”主要是指 (已经分配)
  • 元素:栈中的数据成为元素。
  • 入栈:push,只允许向栈中压入元素。
  • 出栈:pop,从栈中删除一个元素。
  • 先进后出(Last in,frist out,LIFO)

4种形式的栈

在这里插入图片描述
个人理解:由于这版名词说明的有点专业,本人就是喜欢庸俗的表达。(只详细介绍第一种)

  • “满”递增堆栈:即堆栈从高地址向下增长,SP指向储存单元保存的最后入栈的数据。
    ”的话指SP指向的储存单元将保存下个入栈的数据。

写一个可变数组

需求分析

  • 初始化函数
  • 设置数组大小函数
  • 获取数组长度函数
  • 获取数组一个数据函数
  • 设置数据内一个数据函数
  • 清除函数

结构体定义

struct _IntArray{ 
	int *pBuffer; 
	size_t count; 
}; 

定义指针和计数变量

函数编写以及详解(.c)


#include <malloc.h> 
#include "stackadt.h"

struct _IntArray{ 
	int *pBuffer; 
	size_t count; 
}; 

初始化函数

IntArray * IA_ini() 
 { 
 	IntArray *pIntArray = malloc(sizeof(IntArray)); 
 
	 pIntArray -> pBuffer = 0; 
		pIntArray -> count = 0; 
	 return pIntArray; 
 } 

清除函数

 void IA_cleanup(IntArray *pThis) 
 { 
	 free(pThis -> pBuffer); 
	 pThis -> pBuffer = 0; 
	 free(pThis); 
 } 

设置数组大小函数

void IA_setSize(IntArray *pThis, size_t size) 
{ 
    pThis -> count = size; 
    pThis -> pBuffer = (int *)realloc(pThis -> pBuffer, size * sizeof(int)); 
} 

这边使用realloc函数
相当于重新申请内存

获取数组长度函数

 size_t IA_getSize(IntArray *pThis) 
 { 
	 return pThis -> count; 
 } 

设置数据内一个数据函数

bool IA_setElem(IntArray *pThis, size_t index, int value) 
{ 
    if (index >= pThis -> count) return false; 
    pThis -> pBuffer[index] = value; 
    return true; 
} 

获取数组一个数据函数

bool IA_getElem(IntArray *pThis, size_t index, int *pValue) 
{ 
    if (index >= pThis -> count) return false; 
    *pValue = pThis -> pBuffer[index]; 
    return true; 
}

.h文件

#ifndef STACKADT_H
#define STACKADT_H

 #include <stdbool.h> 
 #include <stddef.h> 
 
 typedef struct _IntArray IntArray; 
 
 
 IntArray * IA_ini(); // ?? IntArray 
 void IA_cleanup(IntArray *pThis); // ?? IntArray 
 void IA_setSize(IntArray *pThis, size_t size); // ????????
 size_t IA_getSize(IntArray *pThis); // ????????
 bool IA_setElem(IntArray *pThis, size_t index, int value); // ??????
 bool IA_getElem(IntArray *pThis, size_t index, int *pValue); // ??????



#endif

结果分析

#include <stdio.h> 
#include "stackadt.h" 
int main()
{
	 IntArray *pIntArray; 
	 const size_t count = 10; 
	 int temp = 0;  
	 int i = 0;
	 pIntArray=IA_ini(); 
	 IA_setSize(pIntArray, count); 
	 
	 for ( i = 0; i < count; i++) 
	 IA_setElem(pIntArray, i, (int)i * 2); 
	 
	 for ( i = 0; i < count; i++)
	 { 
		 IA_getElem(pIntArray, i, &temp); 
		 printf("%d ", temp); 
	 } 
		IA_cleanup(pIntArray); 
		 return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值