最近一直在看网易公开课上的编程范式的公开课,斯坦福的教授讲的真的非常到位,感觉还是要好好学习下C还有汇编,熟悉下计算机的内存机制什么的。

大家都知道关于模板或者说范式的问题,基本在很多高级语言上都有实现,C++,java,C#等等,一方面确实方便了许多,当仍然不可避免的有一些性能上的缺失,就是速度会有所降低,或者是说如果在高级语言中使用模板,会占用更多的内存,因为对于一个模板而言,要实现就必须生成更多的针对不同类型的实例,以满足用户的需求,而且每次实现都是这样,这不可避免的造成了资源上的浪费,但使用模板确实让程序本身的可读性与可维护性大大的提升了,那么要怎么在C这样的相对较为原式的语言中实现呢?

要想在C中实现类似模板的功能,一种可行的思路就是直接进行内存层面上的操作,通过指针实现,下面放上源代码(其实这些都是斯坦福的教授在课中讲的,这里进行再次的讨论与说明,一方面是加强自己的理解,另一方面让没有看过的人有一种新的思路)

 #include <stdio.h>
#include <stdlib.h>
#include<string.h>

实现的函数

 void swap_self(void *vp1,void *vp2,int length)
{
void *p = malloc(length);
memcpy(p,vp1,length);
memcpy(vp1,vp2,length);
memcpy(vp2,p,length);
}

这里用了void*,这个在C中可以被解释成不同类型的指针,但是编译器并不会自动进行解释,就是说编译器并不知道要为void*指向的内容分配多少内存,无论是显式还是隐式,都应对void*进一步进行解释,或者是用malloc进行动态分配内存。

length用来表示要进行的数据类型占用的数据类型是多少个字节。

memcpy则是在内存层面按位进行复制,所以并不关心这段内存上究竟是什么类型的数据,所以这便是一个简单的“模板”。

但这样的“模板”也有本身的缺陷,他并不能完全核对两者的数据类型是否一致,如果vp1是int*,vp2是char*,就会出现问题。

这里需要注意memcpy是将后者按位从前往后从高位到低位进行复制,所以如果后者位数较多,就只有高位的数据得到复制,而忽略低位内存中的数据。

其实关于这一部分的内容还有很多,感觉C和C++中,指针虽然一直被很多人所诟病,但又确实是一种很精髓的东西,用好了真的非常方便。

这是我的第一篇随笔,还不知道该怎么写,今天就写到这里,希望以后能多写写自己的感悟,不断进步。

PS:真的十分推荐斯坦福教授的编程范式的公开课,网易公开课上有,链接如下:

http://open.163.com/special/opencourse/paradigms.html

visual studio中编写C文件只需要建立C++文件,然后将文件名后缀.cpp改为.c就行,但好像不是纯C

visual studio2012在升级win8.1后好像要下载更新包才能正常运行,但先升级win8.1再安装则不存在问题。

编程范式感想(一)——在C中进行对模板功能的实现的更多相关文章

  1. jQuery中的编程范式

    浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了 ...

  2. jQuery 中的编程范式

    浏览器前端编程的面貌自2005年以来已经发生了深刻的变化,这并不简单的意味着出现了大量功能丰富的基础库,使得我们可以更加方便的编写业务代码,更重要的是我们看待前端技术的观念发生了重大转变,明确意识到了 ...

  3. jquery中的编程范式,即jquery的牛逼之处

    转自:http://www.iteye.com/topic/1119283 对jquery理解比较深,积累一下,整理了一下格式,就当练习一下 markdown 语法. 本文将结合jQuery源码的实现 ...

  4. 【编程范式】C语言1

    最近在网易公开课上看斯坦福大学的<编程范式>,外国人讲课思路就是清晰,上了几节课,感觉难度确实比我们普通大学大很多,但是却很有趣,让人能边学边想. 范式编程,交换两个数,利用 void * ...

  5. 编程范式:命令式编程(Imperative)、声明式编程(Declarative)和函数式编程(Functional)

    主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 命令式编程: 命令式编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么. 比如:如果你想在一个数字集合 collec ...

  6. Linux Kernel C语言编程范式

    介绍 不同的编程语言具有不同的抽象原语(如下),有的原语抽象层次低,有的原语抽象层次高.其中函数式.DSL是这几年十分热门的编程语言概念. 过程式抽象原语:变量 对象式抽象原语:对象 函数式抽象原语: ...

  7. 冒号课堂 编程范式与OOP思想

    上篇:编程范式与编程语言 第1课 开班导言 第2课 重要范式 第3课 常用范式 第4课 重温范式 第5课 语言小谈 第6课 语言简评 下篇:抽象机制与对象范式 第7课 抽象封装 第8课 抽象接口 第9 ...

  8. Python3学习之路~6.1 编程范式:面向过程 VS 面向对象

    编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种 ...

  9. Edit Distance问题在两种编程范式下的求解

    本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...

随机推荐

  1. careercup-排序和查找 11.6

    11.6 给定M*N矩阵,每一行.每一列都按升序排序,请编写代码找出某元素. 类似leetcode:Search a 2D Matrix 但是与leetcode中这题不同的是下一行的第一个元素不一定大 ...

  2. Eclipse启动时报需要安装"Java SE 6 Runtime"致无法启动解决方案

    今天心血来潮,把MBP升级到了osx mavericks,然后启动了闲置好久的eclipse,启动时居然报错了: 若要打开Eclipse.app,您需要Java SE 6 runtime,您想现在安装 ...

  3. linux监控程序

    IP内部地址: 方法一:ifconfig |grep 'inet addr'|grep '192.168.1' | awk '{print $2}'| tr -d "addr:" ...

  4. Android应用程序所包含的四种组件和DDMS

    关注用户组件         Activity                               编辑文本 .玩游戏 后台进程               Service           ...

  5. ASP.Net中GridView多层嵌套,用最里层的控件获取到外层GridView

    protected void ddlCode_SelectedIndexChanged(object sender, EventArgs e) { DropDownList ddlCode = (Dr ...

  6. js数组&&字符串&&定时器2

    一.系统时间对象Date 方法 描述 Date() 返回当日的日期和时间. getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31). getDay() 从 Date 对象返回一周 ...

  7. ASP与ASP.NET转换Session数据桥的应用

    背景: 现有公司的产品OA是采用ASP早先的技术开发,需要与目前最新的ASP.NET产品进行数据交互的应用.现有的ASP应用程序往往采用“ASP Sessions”,这是一种经典的ASP内置模式,即允 ...

  8. android 中在CMD中查看sqlite

    今天第一次学习Sqlite,在代码中执行了sql,但是不知道在上面地方才能直观的查看sqlite中的数据,下面是查看资料后的找到的查看方法: 通过上述可以从cmd进入数据库查看原文地址:http:// ...

  9. Unity3D题目,Unity中利用GUI输出九九乘法表

    网上看到的这题,下面贴出源代码 using UnityEngine;using System.Collections; public class c99 : MonoBehaviour//C#脚本名: ...

  10. Js~数组的操作push,pop,shift,unshift

    说几个概念: 队列:先进先出堆栈:先进后出 shift:从集合中把第一个元素删除,返回这个元素的值pop:从集合中把最后一个元素删除,返回这个元素的值 unshift:在集合开头添加一个或者多个元素, ...