c语言中为什么栈的初始化时候栈顶指针要指向-1?
这种初始化是用于线性栈的,也就是用一个数组来组成栈,栈顶指针值为当前栈顶元素的下标值。当有数据入栈时,会先执行栈顶指针自加。初始化为空栈,规定空栈的时候指向-1,这样在有第一个元素入栈的时候栈顶指针就可以通过自加指向0元素,从而避免其它判断。
c语言编译是在栈里嘛?
不是。在c/c++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
c语言函数调用规则?
c语言函数的调用规则主要有以下几点:
1.函数调用的前后,栈帧的压栈和弹栈;
2.调用函数时,参数的压栈,返回值的弹栈;
3.局部变量的声明和使用;
4.栈的使用;
5.调用函数的结构,调用函数后的处理。
C语言中如何把两个栈实现一个队列?
伪码 入队: InQueue(elem): while (栈A不空) 栈Bpush(栈Apop); 栈Apush(elem); while (栈B不空) 栈Apush(栈Bpop); 出队 outQueue(): 栈Apop
老师说C语言是面向过程的编程语言,它能使用面向对象编程吗?如何使用?
谢谢邀请。
其实,“面向过程”和“面向对象”只是程序开发中的一种方法,或者说一种思想,大多数现代高级编程语言都能使用这两种编程思想,C语言当然也不例外。
只不过,有些编程语言在语法上支持“对象”,而C语言则没有原生的“对象”语法。不过借助于灵活的指针和结构体语法,在C语言程序开发中使用“面向对象”思想也是很简单的。
malloc() 和 free() 函数
鉴于题主可能是C语言初学者,在开始讨论如何使用C语言进行“面向对象”开发之前,先介绍两个新函数——malloc() 和 free() 。
如果题主看过我之前文章的话,应该明白C语言程序每调用一次函数,系统就会在栈中分配一块栈帧给被调用函数,当函数执行完毕后,这部分栈帧就自动被系统收回了。
malloc() 函数的作用是申请一块指定大小的内存,它的C语言原型如下,成功时返回这块内存的首地址,失败时返回 NULL。
C语言程序中函数的局部变量占用的内存,是函数运行时,自动在其所属栈帧中分配的,所以局部变量会随着函数结束释放。不过,malloc() 向系统申请的内存在堆区里,这部分内存不会随着函数的退出自动释放,需要程序员自己使用 free() 函数释放:
以上这几行C语言代码的意思是向系统申请 5 字节的内存,如果申请成功,就把它释放。
如果在C语言程序退出之前,只 malloc() 而不 free(),程序占用的内存会越来越多,直到最后崩溃退出。这种情况,程序员习惯称为“内存泄漏”。
使用C语言进行“面向对象”编程
相当一部分程序员看不起C语言是因为他们觉得C语言没有“对象”。现在,我们尝试给C语言找一个“对象”。请看:
因为C语言不支持原生的“类”语法,所以我们使用结构体模拟了一个 class,定义了一个“FATHER 类”,它有成员函数 hello()。
上述C语言代码又定义了一个“SON 类”,它有成员函数 hello(),也有成员变量 count(),还有一个“父类”father。接下来,定义“FATHER类”和“SON类”的 hello 函数,相关C语言代码如下:
如何让这两个函数与我们定义的“类”产生联系呢?我们定义“构造函数”:
上述C语言代码首先使用 malloc() 为 son 在堆中申请一块内存,这保证了 son 在程序结束之前都不会被释放。同样的,为 father 也申请了一块内存。
接着,把它们各自的函数传递给结构体里面定义的函数指针,这样便定义好了“类”son。有了构造函数,再来定义“析构函数”,相关C语言代码如下:
析构函数的主要作用就是释放 malloc() 的内存,防止内存泄漏。至此,我们就使用C语言实现了“类”的封装,测试一下:
上述C语言代码是典型的“面向对象”风格:程序使用 SON 类实例化了一个 son 对象,son 调用了自己的成员函数,也调用了从“父类”继承而来的函数。编译并执行这段C语言代码,发现输出与预期一致。
应该注意的是,从表达式 son->hello(son) 可以看出,C语言没有类的支持,所以需要显式的把 son 指针传给 hello。但是,“father类”和“son类”里都可以使用 hello 做函数名,这说明C语言的“类”也对封装有很好的效果。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。