文章目录
General Question
-
怎么交作业?
方法①:用Cyberduck在本地与CSE Vlab之间传输文件
1. 下载Cyberduck
2. 如何设置Cyberduck方法②:使用scp指令
在CSE与Mac之间传输文件
从服务器传输文件至本地
scp zID@cse.unsw.edu.au:服务器文件路径 本地目标路径
从本地将文件传至服务器
scp 本地文件路径 zID@cse.unsw.edu.au:服务器路径
从本地文件夹传至服务器
scp -r 文件夹/目录 zID@cse.unsw.edu.au:服务器路径
按下回车后输入你的密码关于scp指令还可以参考这个视频(需翻墙):如何使用scp命令在本地环境与服务器之间传输文件、文件夹?
更多关于远程连接CSE的问题请移步UNSW CSE Home Computing
-
有意思的vim小游戏,帮你熟悉vim操作:VIM大冒险
Programming in C
- 在for循环中迭代n个元素,控制语句被执行n次,条件判断语句会被执行(n+1)次,所以一句迭代n个元素的for循环包含n+(n+1)次操作。
file.c
:.c
文件即储存代码的源文件。
file.h
:h代表head,每个c文件都跟着一个h文件,h文件的作用是放着c文件中函数的声明,结构体的定义,宏的定义等。
file.o
:o代表output,o文件是目标文件。每个c文件的源码经过编译都会形成一个目标文件(二进制文件),多个目标文件链接后才能形成可执行文件。- 一元运算符
*
是间接寻址或间接引用运算符。当它作用与指针时,将访问指针所指向的对象。
int *p;
这样声明是为了便于记忆。该声明语句表名表达式*p
的结果是int类型,或者说int表示的是*p
这个表达式的类型。C 语言设计的本意并不是把int*
作为类型声明。它的设计本意是解一个方程,从表达式*p
的类型是int
反向推出未使用*
操作的p是个int指针(指向int型变量的地址)。
虽然int* p;
这种写法对于编译器来说和int *p
没有区别(编译器忽视空格),但相比推荐的int *p;
写法,它容易让人在定义语句中,误认为类型修饰符(*
或&
)作用于本次定义的全部变量。
因为int*
放在一起好像是这条语句中所有变量的 共同类型一样。其实恰恰相反,基本数据类型是int
而非int*
,*
只是修饰了p而已,对于该语句中的其他变量,*
并不产生任何作用:
解决这个问题的好办法是:每个变量的声明独立成行,每行只定义一个变量,既方便注释,也避免上述的混淆int* p1, p2; // p1是指向int的指针,p2是int int *p3, *p4; // p3和p4都是指向int的指针
Struct 结构体
- 结构体是C编程中另一种用户自定义的可用的数据类型(int和char等这类是已经定义好的基本数据类型),它允许您在一个结构体中存储不同类型的数据项。
- 为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct tag { member-list member-list member-list ... } variable-list;
tag
是结构体标签。
member-list
是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。我们使用成员访问运算符.
来访问结构的成员,如Books.title
variable-list
结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。
一般情况下,tag
member-list
variable-list
这 3 部分至少要出现 2 个。 - 数组用来储存相同类型数据项的变量,您可以定义一个结构体数组——一个储存了多个相同结构体的数组。
- 结构体内存大小对齐原则(这个部分有问题,待修改,请勿参考)
- 结构体变量的首地址能够被其最宽基本数据类型(结构体是符合数据类型,不是基本类型)成员的大小所整除。
- 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding)。即结构体成员的末地址减去结构体首地址(第一个结构体成员的首地址)得到的偏移量都要是对应成员大小的整数倍。
- 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在成员末尾加上填充字节(padding)。
- eg:求下面结构体实际占用空间大小
struct eg { char [13]; int a