二维数组总结

在刷leetcode时有道关于二维数组的题目,由于工作中较少写这块代码,对部分基础理解不足,现将学习C程序设计语言一书中关于二维数组的内容进行总结。

书中以一个日期转换函数为被背景问题,针对闰年与非闰年,可以写出二维数组的形式:

static char daytab[2][13]={

{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};

关于上述数组有几点需要解释:

首先将数组元素声明为char类型,每月天数最大值在127以内,因此可以使用char类型。

第一个元素为0,是......

结构体比较

如果有人问你能否比较两个结构体变量,你该如何回答?

在回答这个问题之前,需要了解以下知识:

什么是字节对齐?

在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。

为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”. 比如4字节的int型,其起始地址应该位于4字节的边界......

尾递归

若函数在尾位置调用自身(或是一个尾调用本身的其他函数等等),则称这种情况为尾递归。尾递归也是递归的一种特殊情形。尾递归是一种特殊的尾调用,即在尾部直接调用自身的递归函数。对尾递归的优化也是关注尾调用的主要原因。尾调用不一定是递归调用,但是尾递归特别有用,也比较容易实现。

尾递归在普通尾调用的基础上,多出了2个特征:

1.在尾部调用的是函数自身 (Self-called);

2.可通过优化,使得计算仅占用常量栈空间 (Stack Space)。

优化尾递归的分析与示例def recsum(x):

if x == 1:

return x

else:

return x + recsum(x......

gcc编译阶段

电话面试被问到一个很基础很底层的问题,可是一时间不知道如何回答,总结网上的相关内容并加以验证,如果针对文章内容有任何疑问,欢迎留言讨论。

gcc编译流程分为4个步骤,分别为:

预处理(Pre-Processing)

编译(compiling)

汇编(Assembling)

链接(Linking)

示例代码main.c

#include ......

C语言宏assert

assert宏

/* assert example */

#include <stdio.h> /* printf */

#include <assert.h> /* assert */

void print_number(int* myInt) {

assert (myInt!=NULL);

printf ("%d\n",*myInt);

}

int main ()

{

int a=10;

int * b = NULL;

int * c = NULL;

b=&a;

print_number (b);

print_number (......

C语言特性C99介绍

本文将持续介绍C99中新增特性,由于工作环境在C89,因此学习C99中新增特性,本文将持续更新.

C99中的布尔值

C99提供了_Bool型,所以在这一版本中,布尔变量可以声明为_Bool flag;

除了_Bool类型的定义,C99还提供了一个新的头该头文件提供了bool宏,用来代表_Bool,同时还提供了true 和 false分别代码1和0.

示例程序:

#include <stdio.h>

int main()

{

_Bool flag = 0;

printf("%d\n",flag);

return 0;

}

输出0

#inc......

C语言宏max

在leetcode刷题LeetCode C 实现110. Balanced Binary Tree时有如下两个宏:

#define max(a,b) (((a) > (b))?(a):(b))

#define max(a,b) ((a) > (b))?(a):(b)

在编写代码时我写成了后者,在检查了代码之后提交始终失败,gdb调试时发现max这个宏存在问题。

1 + max(a, b)

相当于:

1 + ((a) > (b))?(a):(b)

考虑运算符优先级+大于?:,从右到左,因此相当于

(1 + ((a) > (b))) ? (a) : (......

标准库函数qsort使用误区

问题要从刷leetcode说起350. Intersection of Two Arrays II,在使用标准库函数qsort对数组进行排序,然后对两个已排序的数组求出其共有部分,可是提交后发现存在一个用例不过,截图如下:

完整提交代码如下:

int compare (const void * a, const void * b)

{

ret......

unsigned char与signed char区别

今天有同事问我unsigned char与char有啥区别,我结合自己的理解与前段时间看的深入理解计算机系统一书进行总结。

首先signed char与unsigned char都占一个字节,但是他们表示的数据范围不同,unsigned char 范围[0-255],signed char的范围是[-128 127],char的范围也是[-128,127].验证程序如下:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef unsigned char * byte_p......

printf格式控制

本文记录在学习linux c编程中遇到的printf相对新奇少见的用法,常见用法在此不一一罗列。

/* Listing 12-1 */

#include <fcntl.h>

#include "tlpi_hdr.h"

#define MAX_LINE 100

int

main(int argc, char *argv[])

{

int fd;

char line[MAX_LINE];

ssize_t n;

fd = open("/proc/sys/kernel/pid_max", (argc > 1) ? O_RDWR : ......