将从更低的层面来了解计算机的工作原理
指针实际上只是一个地址,某个变量的地址
#include
int main() {
int n = 50;
int *p = &n;
printf("%p\n",p);
printf("%i\n",*p);
}
如果是8个可以数的更高
string 实际上是char*
几十年前,没有决定创建一个名为string的实际数据类型,字符串实际上只是第一个字符的地址
#include
int main() {
char *s = "hi!";
printf("%s\n",s);
}
在cs50的头文件中,有
typedef char *string;
以这种方式使用自定义数据类型
首先引入数组语法,是因为他是语法糖
#include
#include
#include
int main() {
char *s = get_string("s:");
char *t = get_string("t:");
if(strcmp(s, t) == 0) {
printf("same\n");
}
else {
printf("different\n");
}
}
malloc采用一个参数,即希望为您查找的字节数,并返回该内存块的地址.
如果malloc返回null,则说明没有足够的可用内存
free与malloc相反,用完内存后需要还给操作系统
NULL只是一个地址,实际就是地址零来表示错误
#include
#include
#include
#include
#include
int main() {
char* s = get_string("s:");
if (s == NULL) {
return 1;
}
char* t = malloc(strlen(s) + 1);
if (t == NULL) {
return 1;
}
strcpy(t, s);
// for (int i = 0, n = strlen(s); i <= n; i++) {
// t[i] = s[i];
// }
if (strlen(s) > 0) {
t[0] = toupper(t[0]);
}
printf("%s\n",t);
printf("%s\n", s);
free(t);
return 0;
}
valgrind:检查内存的使用情况
#include
void swap(int* a, int* b);
int main() {
int a = 2;
int b = 3;
printf("before: a = %i, b =%i\n", a, b);
swap(&a, &b);
printf("after: a = %i, b = %i\n", a, b);
return 0;
}
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
如果按值传递不能成功,要通过引用传递(passing by reference)
segmentation fault 分段错误:意味着和内存相关的问题出现了,这些内存段不属于你,没有为其分配空间,例如通过数组甚至通过malloc
csv文件,是一个轻量级的电子表格
每次函数返回指针时,应该检查它是否为空,如果是,根据文档应该退出
#include
#include
int main() {
FILE* file = fopen("phonebook.csv","a");
if (file == NULL) {
return 1;
}
char* name = get_string("Name: ");
char* number = get_string("Number: ");
fprintf(file, "%s,%s\n", name, number);
fclose(file);
}
```c
#include
#include
typedef uint8_t BYTE;
int main(int argc, char* argv[]) {
FILE* src = fopen(argv[1], "rb");
FILE* dst = fopen(argv[2], "wb");
BYTE b;
while (fread(&b,sizeof(b), 1, src) != 0) {
fwrite(&b, sizeof(b), 1, dst);
}
fclose (dst);
fclose(src);
}