目录:

  1. array
  2. '\0' 与 EOF
  3. 二维字符数组(字符串数组)

1. array:

参考:C 数组

参考:C 字符串

参考:C笔记之NULL和字符串结束符'\0'和EOF

总结:【个人理解,可能不全面】数组对于数字型和字符型有不同,数字数组就是实际长度,而字符型数组需要增加一个 '\0',所以对于数字数组可以这样定义  int num[] = {, , , , }; ,而字符型数组需要预先定义长度,否则没有 '\0' 会出错,需要这样定义 char str[6] = {'h', 'e', 'l', 'l', 'o'};或者 char str[] = "hello",会自动添加 '\0'。

#include <stdio.h>
#include <string.h> int main(void)
{
char *r = "hello";
char s[10] = {'h','e','l','l','o'};
char ss[] = {'h','e','l','l','o'};
char t[] = "hello"; int num[] = {1, 2, 3, 4, 5}; printf ("r = %s\ns = %s\nss = %s\nt = %s\n", r, s, ss, t);
printf ("The length of r is %ld.\n", sizeof(r)); // address
printf ("The strlen of r is %ld.\n", strlen(r)); // actual length
printf ("The length of s is %ld.\n", sizeof(s)); // s[10] with '\0'
printf ("The length of ss is %ld.\n", sizeof(ss)); // print with error
printf ("The length of t is %ld.\n", sizeof(t)); // t[6] with '\0'
printf ("The strlen of t is %ld.\n", strlen(t)); // actual length
printf ("The length of num is %ld.\n", sizeof(num)/sizeof(num[0])); // actual length for (int i = 0; i < sizeof(num)/sizeof(num[0]); i++) {
printf("%d\n", num[i]);
} /* r = hello*/
/* s = hello*/
/* ss = hellohello ----error----*/
/* t = hello*/
/* The length of r is 8.*/
/* The strlen of r is 5.*/
/* The length of s is 10.*/
/* The length of ss is 5. ----without '\0'----*/
/* The length of t is 6.*/
/* The strlen of t is 5.*/
/* The length of num is 5.*/
/* 1*/
/* 2*/
/* 3*/
/* 4*/
/* 5*/ return 0;
}

2. '\0' 与 EOF 的区别

参考:C语言中EOF是什么意思?

前者作为字符串的结尾标志

后者作为文件的结尾标志

如下所示:(0,与 -1)

#include <stdio.h>
#include <stdlib.h> int main(){
printf("\'\\0\' is %d\n", '\0');
printf("EOF is %d\n", EOF); /* '\0' is 0*/
/* EOF is -1*/ return 0;
}

3. 二维字符数组(字符串数组)

多维字符数组可以用双星号来表示

参考:C语言的字符串数组

参考:指向指针的指针

#include <stdio.h>
#include <stdlib.h> int main(){
// str is the pointer of array which is still pointer
char *str[] = {"alex", "bn", "lee"}; // str[0] means the first array (e.g. "alex")
printf("The first string is %s.\n", str[0]);
// str + 1 means the pointer of second array
// add * in front of it, then it will become the pointer of chars
// and it can be printed as string
printf("The second string is %s.\n", *(str + 1));
// Just like above one
// *(str + 2) means the pointer of chars (e.g. "lee")
// *(str + 2) + 1 means the pointer of the second character
// *((str + 2) + 1) means element of that pointer
printf("The second character of the third string is %c.\n", *(*(str + 2) + 1)); /* outputs:*/
/* The first string is alex.*/
/* The second string is bn.*/
/* The second character of the third string is e.*/ return 0;
}

双星号:不能直接定义信息,需要指向

#include <stdio.h>
#include <stdlib.h> int main(){
// str is the pointer of array which is still pointer
char *str_o[] = {"alex", "bn", "lee"};
// you can't assignment **str directly since it can only be used for string (* to array)
// but you can define a **str point to str_o
char **str = str_o; // str[0] means the first array (e.g. "alex")
printf("The first string is %s.\n", *str);
// str + 1 means the pointer of second array
// add * in front of it, then it will become the pointer of chars
// and it can be printed as string
printf("The second string is %s.\n", *(str + 1));
// Just like above one
// *(str + 2) means the pointer of chars (e.g. "lee")
// *(str + 2) + 1 means the pointer of the second character
// *((str + 2) + 1) means element of that pointer
printf("The second character of the third string is %c.\n", *(*(str + 2) + 1)); /* outputs:*/
/* The first string is alex.*/
/* The second string is bn.*/
/* The second character of the third string is e.*/ return 0;
}

4. typedef & struct

struct 基本格式如下:(注意最后的 semicolon)

 struct date {
int day;
int month;
int year;
}; // struct date will become one thing
struct date birthday;

typedef 可以将一个整体的东西用一个新的字符串表示

typedef struct {
int a;
int b;
} Pair;
...
Pair x; or typedef struct date Date Date d;

struct 中的指针使用

// pointerstruct.c
#include <stdio.h> typedef struct {
int name;
int salary;
} Worker; // Worker is now a type, like char and int int main(void) {
Worker w, *wp; // define variables with the new type wp = &w;
*wp.salary = 125000; // generates a compiler error (see below)
*(wp.salary) = 125000; // so does this (same as previous line) w.salary = 125000; // is probably what you want
(*wp).salary = 125000; // or you can use the pointer, but this looks kludgy
wp->salary = 125000; // this is the 'sexy' way to use pointers return 0; // being lazy, should be EXIT_SUCCESS
}

简化如下:

structTypeName  s, *sp;
sp = &s; // then the following are equivalent: s.element
(*sp).element
sp->element

5. Makefile

An example of a rule in a Makefile is:

ex1: ex1.c ex1.h
dcc -O3 -o ex1 ex1.c

It is important to note that dcc above is preceded by a tab (and not spaces).

Every file in UNIX has a timestamp, which is the time it was created or last modified.

  • If you type in the command make, then make will compare the timestamps of each of the files in the dependencies with the target.

  • If any of these dependency files is newer than the target, make will execute the command again (which usually makes the target again).

  • If none of the files is newer, make simply reports that the target is up to date.

You can have multiple targets. Below we show three targets:

all: ex1 ex2

ex1: ex1.c ex1.h
dcc -O3 -o ex1 ex1.c ex2: ex2.c ex2.h
dcc -O3 -o ex2 ex2.c

You can then type make ex1 or make ex2 as you wish.

If you type simply make, then the default is to make the first target only, which in this case is all, which in turn has as its dependencies the other two targets. This command will make either or both the executables if they are older than their course code.

You can generalise the Makefile by defining and using variables, such as:

CC=dcc
CFLAGS=-O3 all: ex1 ex2 ex1: ex1.c ex1.h
$(CC) $(CFLAGS) -o ex1 ex1.c ex2: ex2.c ex2.h
$(CC) $(CFLAGS) -o ex2 ex2.c

The variables will be substituted when the Makefile is executed.

You can also add a target to clean up your directory after you have finished:

CC=dcc
CFLAGS=-O3 all: ex1 ex2 ex1: ex1.c ex1.h
$(CC) $(CFLAGS) -o ex1 ex1.c ex2: ex2.c ex2.h
$(CC) $(CFLAGS) -o ex2 ex2.c clean:
rm -f ex1 ex2 ex1.o ex2.o core
  • the clean target has no dependencies, and here removes the executable, the object files, and core dumps

  • the command make clean will execute the rm instruction

  • the -f switch means that rm will not complain if any files are do not existent

6. 链表(Linked List)

  typedef struct node {
int data;
struct node *next;
} LinkedL;

or

  typedef struct node {
int data;
struct node *next;
} *LNode, *LinkedL;

列表遍历,可以通过 for 语句或者 while 语句,判别条件都是最后是否为 NULL

// traverse the list (of 2 elements)
for (LinkedL *p = n1; p != NULL; p = p->next) {
printf("%d\n", p->data);
} // or LinkedL *p = n1;
while (p != NULL) {
printf("%d\n", p->data);
p = p->next;
}

7. struct 内存空间

看里面最大的为基准来考虑,就是如果最大为 1 byte,则此为单元,如果 8 bytes 最大,则以此为单元,不满足的需要 padding。

#include <stdio.h>
#include <stdlib.h> struct somedata1 {
char age; // 1 byte
char weight; // 1 byte
char gender; // 1 byte
}; // aligns to 3 bytes struct somedata2 {
int age; // 4 bytes
char *weight; // 8 bytes
char gender; // 1 byte
}; // aligns to 24 bytes struct somedata3 {
int age; // 4 bytes
int weight; // 4 bytes
char gender; // 1 byte: either 'f' or 'm'
}; // aligns to 12 bytes int main() { printf("somedata1: %ld\n", sizeof(struct somedata1));
printf("somedata2: %ld\n", sizeof(struct somedata2));
printf("somedata3: %ld\n", sizeof(struct somedata3)); /* outputs:*/
/* somedata1: 3*/
/* somedata2: 24*/
/* somedata3: 12*/ return 0;
}

【423】COMP9024 Revision的更多相关文章

  1. 【434】COMP9024 Exercises Revision

    目录: Week01 Week02 Week03 Week04 Week05 Week06 Week07 Week08 Week09 Week10 01. Week01 数字通过 #define 来定 ...

  2. 【433】COMP9024 复习

    目录: 01. Week01 - Lec02 - Revision and setting the scene 02. Week02 - Lec01 - Data structures - memor ...

  3. 【411】COMP9024 Assignment1 问题汇总

    1. 构建 Makefile 文件后运行错误,undefined reference to 'sqrt' 实际上是没有链接math数学库,所以要 $gcc test.c –lm //-lm就是链接到m ...

  4. 【432】COMP9024,Exercise9

    eulerianCycle.c What determines whether a graph is Eulerian or not? Write a C program that reads a g ...

  5. 【403】COMP9024 Exercise

    Week 1 Exercises fiveDigit.c There is a 5-digit number that satisfies 4 * abcde = edcba, that is,whe ...

  6. 【LeetCode】数学(共106题)

    [2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...

  7. 【LeetCode】423. Reconstruct Original Digits from English 解题报告(Python)

    [LeetCode]423. Reconstruct Original Digits from English 解题报告(Python) 标签: LeetCode 题目地址:https://leetc ...

  8. 【原】低版本MyEclipse整合高版本Tomcat

    [使用工具] 1.MyEclipse_6.0.1GA_E3.3.1_FullStackInstaller 2.Tomcat 7.0 [问题描述] 直接在MyEclipse中整合,因为这个版本的MyEc ...

  9. 通用js函数集锦<来源于网络/自己> 【一】

    通用js函数集锦<来源于网络/自己>[一] 1.返回一个全地址2.cookie3.验证用户浏览器是否是微信浏览器4.验证用户浏览器是否是微博内置浏览器5.query string6.验证用 ...

随机推荐

  1. MySQL进阶19--函数的创建(举例)/设置mysql的创建函数的权限/查看(show)/删除(drop) / 举4个栗子

    /*MySQL进阶19 函数 存储过程和函数:都类似于java中的方法; 存储过程和函数通用好处: 1.提高代码的重用性 2.简化操作 好处: 减少操作次数,减少了编译次数,减少了和服务器的连接次数, ...

  2. MySQL进阶16 - 视图的创建/修改/删除/更新--可更新性的不适用条件

    #进阶16 : 视图 /* 含义: 虚拟表,和普通表一样使用;(从5.1开始使用的:)是通过表动态生成的数据 创建语法: create view 视图名 as 查询语句; ---------- 作用: ...

  3. What is URL Encoding and How does it work?

    Introduction A URL (Uniform Resource Locator) is the address of a resource in the world wide web. UR ...

  4. PL/SQL 使用控制流程

    一.条件分支语句 1.if判断 IF <布尔表达式> THEN PL/SQL 和 SQL语句 END IF; 2.if else判断 IF <布尔表达式> THEN PL/SQ ...

  5. 数据库概念 MySQL语法

    数据库概念 将保存的数据部分,存到一个公共的地方,所有的用户涉及到数据相关都必须来这个公共地方查找 MySQL 本质就是一款基于网络通信的应用软件,任何基于网络通信的软件底层都是socket 可以把M ...

  6. pip 安装包 不行 自己下载whl 包自己安装

    https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

  7. Python爬虫:BeautifulSoup用法总结

    原文 BeautifulSoup是一个解析HTML或XML文件的第三方库.HTML或XML文件可以用DOM模型解释.一般包含三种节点: 元素节点 - 通常指HTML 或 XML的标签 文本节点 - 标 ...

  8. 070_Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本

    #!/bin/bash#使用 trap 命令可以拦截用户通过键盘或 kill 命令发送过来的信号#使用 kill -l 可以查看 Linux 系统中所有的信号列表,其中 2 代表 Ctrl+C#tra ...

  9. 三十六.MHA集群概述 、 部署MHA集群 测试配置

    1.准备MHA集群环境 准备6台虚拟机,并按照本节规划配置好IP参数 在这些虚拟机之间实现SSH免密登录 在相应节点上安装好MHA相关的软件包   使用6台RHEL 7虚拟机,如图-1所示.准备集群环 ...

  10. Crontab 定时任务格式参数

    crontab 定时执行 任务 格式: * * * * *-) 小时(-) 日(-) 月份(-) 星期(-6) 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条 ...