第2课
某些系统或应用的格式化是伪格式化,只是仅仅擦除存储器的开头的一段字节;
第3课
nano hello.c
#include <stdio.h>
#include <cs50.h>
int main(){
string name = GetString();
printf("hi %s!\n",name);
}
gcc hello.c -lcs50
这里需要理解 gcc -l 的用法,待学习。。。
第4课
vim hello4.c
#include <stdio.h>
int main(){
printf("hello morningcat\n");
}
make hello4
cc hello4.c -o hello4
./hello4
make 底层使用的还是 gcc
或 clang
(缩写为cc
)
#include <stdio.h>
int main(){
int x = 2;
printf("int length:%lu\n", sizeof(x));
}
char 1
int 4
float 4
long 4 【在本机 macxOS Big Sur 11.1 上 long sizeof = 8】
long long 8
double 8
有意思的小程序
#include <stdio.h>
#include <unistd.h>
int main(){
for(int i=0;i<100;i++){
printf(" Percent complete:%3d%%", i);
fflush(stdout);
sleep(1);
}
printf("completed");
}
可惜 fflush(stdout); 在我的系统上并没有出现我想要的效果,并没有刷新
第6课
#include <stdio.h>
#include <string.h>
int
main(int argc, char *args[]) {
printf("%d\n", argc);
for (int i = 0; i < argc; i++) {
for(int j=0,n=strlen(args[i]);j<n;j++){
printf("%c ", args[i][j]);
}
printf("--> %s \n", args[i]);
}
}
第7课 [第三周 1]
- 三目表达式
codition ? true_xx : false_xx;
- C 语言中的常量
#define PI 3.1415926
#define COUNT 333
第8课 [第三周 2]
brew install gdb
[brew 是 macxos下的包管理工具]
遇到问题please check gdb is codesigned - see taskgated(8)
echo “set startup-with-shell off” >> ~/.gdbinit
gcc -g swap.c -o swap
gdb swap
#include <stdio.h>
void swap(int *x, int *y);
int main(void) {
int x = 1;
int y = 2;
swap(&x, &y);
printf("x=%d, y=%d\n", x, y);
return 0;
}
void swap(int * x, int * y) {
int tmp = *x;
*x = *y;
*y = tmp;
}
start 开始调试
break main 在 main 方法处打断点
break 23 在第 23 行处打断点
run 开始到断点处
next or n 下一步
step 进入方法内部
continue 98
print 打印某个变量的值
backtrace
quit
l 查看源码
p x 打印x的值
n 下一步
bt 堆栈
[New Thread 0x2403 of process 2422]
touch ~/.gdbinit
echo "set startup-with-shell off" >> ~/.gdbinit
bubble sort -> 时间复杂度 O( N 2 N^2 N2)
selection sort -> 时间复杂度 O( N 2 N^2 N2)
递归【注意:需要预防栈溢出】
第9课 [第四周 1]
归并排序思想:
On input of n elements:
If n < 2
return;
Else:
Sort left half of elements
Soft right half of wlwments
Merge sorted halves.
其中合并排序[Merge sorted halves]思想:
1.取两个列表的最小值进行比较【左右两个列表已经是有序列表,只需取最左边的值即可】
2.将结果放在新的列表里,并从原列表移除
3.不断重复1,2直至两个列表为空
时间复杂度 O( N ∗ l o g 2 N N*log_2N N∗log2N)
第10课 [第四周 2]
// * 在函数原型中和在函数体的含义是不同的
// 在函数原型中 * 表示指针,即内存地址
// 在函数体中 * 表示取某内存地址中包含的数据,*x表示x指针所指向内存中的值
void swap(int * x, int * y) {
int t = *x;
*x = *y;
*y = t;
}
- & 地址操作符
* 定位符
malloc
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc) {
char s1[] = "hello world";
printf("s1=%s\n", s1);
printf("s1 length=%d\n", strlen(s1));
char *s2 = (char *) malloc(sizeof(char) * (strlen(s1) + 1)); // \0 结尾
if (s2 == NULL)return 1;
int n = strlen(s1);
for (int i = 0; i < n; i++) {
s2[i] = s1[i];
}
s2[n] = '\0';
printf("s2=%s\n", s2);
free(s2);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(int argc) {
int i = 100; // 这里的 i 在`栈`中`main方法所在区域`中的某一块内存中
int *x, *y;
x = (int *) malloc(sizeof(int)); // 这里的 x 是在栈中main方法所在区域中声明了一个指针对象,指向了`堆`中的某一块内存,需要手动释放,否则会造成内存泄漏
*x = 42;
printf("x=%d\n", *x);
y = x;
*y = 13;
printf("x=%d\n", *x);
printf("y=%d\n", *y);
free(x);
// free(y); 同一块内存不能释放两次
// 若不释放内存 则会造成内存泄漏
// int *z = 200;
// 上诉写法是不合法的,因为声明了一个指针但并没有申请内存,直接赋值会有问题
}