C 语言指针详解
理解指针这一概念是学习 C 语言和 C++ 的重中之重,对于编程初学者,由于不熟悉计算机程序的运行原理,如果用 C 语言作为入门,将会在指针的理解上陷入泥潭。所以尽管现在的大学教育都纷纷将 C 语言作为通识课程,但是我还是认为这门语言并不适合刚接触编程的同学。
不过话又说回来,C 是一门非常值得掌握的语言,原因就在于它足够接近底层,它能让程序员对硬件有足够的掌控,却又不似汇编那样太过底层。
这篇文章的目的就是记录下个人对于指针的理解,并希望能对后人以启发帮助。
基本类型
首先看如下一段代码
//c1.c
#include <stdio.h>
int main() {
int a = 1;
printf("%d\n", a);
printf("%d\n"...
点我阅读更多...算法题:零钱兑换
问题描述与分析
感觉是一道经典的算法题,笔试面试屡试不爽。如果想把一些钱换成零钱,请问有多少兑换种方法?当然可以具体点,比如有 w 元钱,想用 k 种面额的币来兑换(k种面额可以不全部用完)。如果没有掌握一定的技巧,拿到这题是一脸蒙蔽的。首先我们需要将问题表述数学化一点:
设共有 k 种面额的纸币,分别值 \(v_i, (i = 1,,k)\),需要兑换的钱为 w ,求总的兑换方法数量 \(N_{k,w}\)。
这道题的关键是将 \(N_{k,w}\) 拆分成两个部分:
一部分是使用 \(k-1\) 种纸币兑换 \(w\) 元钱的方法数量 \(N_{k-1,w}\)
另一部分用 \(k\) 种纸币兑换成 \(w-v_k\) 这么多钱的方法数量 \(N_{k, w-v_...
点我阅读更多...
笔记-Java(JDK 1.9) StringBuffer 与 StringBuilder 的区别
StringBuffer 与 StringBuilder 都是为了更高效的操纵字符串而生,原因在于 String 类是不可变量,对其进行任何修改都会产生新的对象,而 StringBuffer 和 StringBuilder 则能够有效避免这一问题。但既然区分了两个类,就说明它们之间存在差别。
查看源码,发现 StringBuffer 与 StringBuilder 都继承 AbstractStringBuilder。下面从源码层面来对比两者
StringBuffer
StringBuilder
public StringBuffer(int capacity)
public Strin...
点我阅读更多...UDP 协议校验和计算
UDP 协议不具备差错恢复机制,但能通过校验和判断网络传输是否出现丢包。UDP 的校验和由三部分内容求和得到,分别是伪首部、首部以及数据报文,如下图所示
为了弄清楚这些字段究竟是什么东西,下面我们使用 wireshark 来抓取一个 UDP 包来详细分析。为了制造这个 UDP 包,使用如下代码来向某 ip 地址发送一段数据(这个 ip 不一定非得实际存在,我们只需要观察基于 UDP 协议封装的数据,所以只要能被 wireshark 获取就行)
import java.io.IOException;
import java.net.*;
/**
* Created by wangx on 2017/10/19.
*/
public class Client {
p...
点我阅读更多...Java 本地调用连接 Intel 数学核心库
纯 Java 语言实在算不上一种高性能的数值计算语言,当然抽象层次越高,效率一般越低,也没什么好抱怨的。如果有相当大的数值计算需求,那么我们可以将这部分代码用 C/C++ 来实现,再通过 Java 来调用,将能很好地提升 Java 程序的性能。
Intel@reg Math Kernel Library 是 Intel 公司开发的高性能数学函数库,作为例子,这里我们只讨论 BLAS 这块,其他部分根据说明文档和例子去操作就可以了。BLAS 全称是 Basic Linear Algebra Subprograms,即基本线性代数子程序,它本身只定义了三个层次的线性代数计算函数接口,其中
是向量与向量的计算,例如点积、向量求和等,
是矩阵与向量的计算,如矩阵向量乘法等,
...
点我阅读更多...