首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CS50_week4 Memory

CS50_week4 Memory

原创
作者头像
greatak
修改于 2024-09-23 01:26:43
修改于 2024-09-23 01:26:43
11300
代码可运行
举报
文章被收录于专栏:cs50cs50
运行总次数:0
代码可运行
代码语言:c
代码运行次数:0
运行
AI代码解释
复制
int n = 50;

pointer 变量占 8bytes

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
string s = "HI!";

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <cs50.h>

int main(void)
{
    string s = "HI!";
    printf("%p\n", s);
    printf("%p\n", &s[0]);
}

s是string "HI!"的指针;那么s[0], s[1], s[2]...组成的array s也是指针?

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <cs50.h>

int main(void)
{
    string s = "HI!";
    printf("%p\n", s);
    printf("%p\n", &s[0]);
    printf("%p\n", &s[1]);
    printf("%p\n", &s[2]);
    printf("%p\n", &s[3]);

}

每个元素s[i]只占一个byte
每个元素s[i]只占一个byte
代码语言:c
代码运行次数:0
运行
AI代码解释
复制
string s = "HI!";
代码语言:c
代码运行次数:0
运行
AI代码解释
复制
 char *s = "HI!";

string s ↔ char *s 等效

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main(void)
{
    char *s = "HI!";
    printf("%s\n", s);

}

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
typedef uint8_t BYTE;
代码语言:c
代码运行次数:0
运行
AI代码解释
复制
typedef char *string;

pointer arithmetic

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main(void)
{
    char *s = "HI!";
    printf("%c", *s);
    printf("%c", *(s + 1));
    printf("%c\n", *(s + 2));

}

s[1] ↔ *(s + 1) compiler translate it as

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <cs50.h>

int main(void)
{
    string s = get_string("s: ");
    string t = get_string("t: ");

    if (s == t)
    {
        printf("Same\n");
    }
    else
    {
        printf("Different\n");
    }
}

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
char *s = get_string("s: ");
char *t = get_string("t: ");

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
string s = get_string("s: ");
string t = s;

t[0] = toupper(t[0]);

printf("%s\n", s);
printf("%s\n", t);

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    char *s = get_string("s: ");
    char *t = malloc(strlen(s) + 1);

    for (int i = 0, n = strlen(s); i <= n; i++)
    {
        t[i] = s[i];
    }

    if (strlen(t) > 0)
    {
        t[0] = toupper(t[0]);
    }

    printf("%s\n", s);
    printf("%s\n", t);
}

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
char *s = get_string("s: ");
char *t = malloc(strlen(s) + 1);//memory allocate

if (t == NULL)//not enough memory available
{
    return 1;
}
代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    char *s = get_string("s: ");
    if (s == NULL)
    {
        return 1;
    }

    char *t = malloc(strlen(s) + 1);//memory allocate

    if (t == NULL)//not enough memory available
    {
        return 1;
    }

    strcpy(t, s);

    if (strlen(t) > 0)
    {
        t[0] = toupper(t[0]);
    }

    printf("%s\n", s);
    printf("%s\n", t);

    free(t);//opposite of malloc,释放memory
}

NULL is the adrress zero.

valgrind

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *x = malloc(3 * sizeof(int));
    x[0] = 72;
    x[1] = 73;
    x[3] = 33;
    free(x);
}

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
int main(void)
{   
    int *x;  
    int *y; 

    x = malloc(sizeof(int));                    

    *x = 42;
    *y = 13;    

    y = x;        

    *y = 13;   
}

y没有assign a value, so y maybe 0, or 1000, or etc.

*y就到了某个不知道的memory的地方。

passing by reference

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main(void)
{
    char s[4];
    printf("s: ");
    scanf("%s", s);
    printf("s: %s\n", s);
}

File I/O

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    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
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdint.h>

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);
}
代码语言:c
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main() {
    int num = 1;
    printf("%03d\n", num); // 使用%03d格式化输出,表示至少打印3位,不足的前面补零
    return 0;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C/C++ 文件与指针操作笔记
实现结构块读写: 在定义结构块的时候,不应使用指针变量,因为指正无法被转储到文件中.
王瑞MVP
2022/12/28
8690
5.1 C/C++ 使用文件与指针
C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。
王瑞MVP
2023/10/10
3710
5.1 C/C++ 使用文件与指针
【C语言】《C语言基础指南!》- 史上最全!
C语言由丹尼斯·里奇(Dennis Ritchie)在1972年开发,用于操作系统和系统级软件的开发。它是由B语言发展而来,成为Unix操作系统的核心语言。
LuckiBit
2024/12/11
8950
c基础
基本数据类型以及打印 void main() { int i = 100; double d = 200; float f = 200; long l = 200; short s = 100; char c = 'D'; // 字符串 char * printf("i = %d\n" ,i); printf("d = %lf\n" ,d); printf("f = %f\n" ,f); printf("l = %ld\n" ,l); printf("s = %d\n" ,s
曾大稳
2018/09/11
1.1K0
c基础
【C语言】常用函数汇总表
通过这些表格和示例,你可以掌握C语言中各类常用函数的功能和使用方法。如果你需要进一步深入了解某个函数或需要更多示例,随时告诉我!
LuckiBit
2024/12/11
6190
【C语言】常用函数汇总表
C语言常用函数表
任何一门语言的重点绝对不是语法或词汇(等效于编程的接口),它的唯一用途是沟通。因此编程语言是为了让计算机服务于我们而存在的。因此我们知其然,但不记其所以然,只要知道它的用途就可以了。
Homqyy
2024/08/23
2430
CS50_week3 Algorithms
greatak
2024/09/06
680
CS50_week5 Data Structures
Thecreate_familyreturning a pointer to thepersonin the youngest generation
greatak
2024/09/27
1150
C语言函数大全--f开头的函数(下)
如果文件顺利打开后,指向该流的文件指针就会被返回;否则文件打开失败则返回 NULL,并把错误代码存在 error 中。
huazie
2025/01/18
3050
C语言函数大全--f开头的函数(下)
(21)从strerror到strtok:解码C语言字符函数的“生存指南2”
当你写下strcpy(dest, src)这行看似无害的代码时,是否意识到自己正在操作系统的血管里进行一场没有安全绳的高空走钢丝?在C语言的世界里,字符串从来都不是温顺的数据羔羊,而是戴着可爱面具的"内存刺客"——那些优雅的str开头的函数库,既是程序员最亲密的工具,也是引发段错误(Segmentation Fault)的经典元凶。
折枝寄北
2025/02/28
1341
C和指针学习
这个名字是编译器默认的输出名。如果要修改可执行文件的名字可以加-o参数:gcc -o myexec main.c
Java架构师必看
2021/07/13
3870
C语言函数大全--f开头的函数(上)
注意: 如果文件中的一行,不足 n-1 个字符,则读完该行就直接结束。如若该行(包括最后一个换行符)的字符数超过 n-1,则 fgets 只返回一个不完整的行,但是,缓冲区总是以 NULL 字符结尾,对 fgets 的下一次调用会继续读该行。函数成功将返回 stream,失败或读到文件结尾返回 NULL。因此不能直接通过 fgets 的返回值来判断函数是否是出错而终止的,应该借助 feof 函数或者 ferror 函数来判断。
huazie
2025/01/17
3490
C语言函数大全--f开头的函数(上)
C语言读写文件
FILE *fopen(const char *path, const char *mode);
全栈程序员站长
2022/09/05
3.6K0
C语言经典编程题100例 91~100
98、从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存。输入的字符串以!结束。
C you again
2022/08/22
2K0
C语言经典编程题100例 91~100
基础IO_系统文件IO | 重定向【Linux】
打开文件,本质是进程打开,所以,进程知道自己在哪里,即便文件不带路径,进程也知道。由此OS就能知道要创建的文件放在哪里。
小志biubiu
2025/08/22
1320
基础IO_系统文件IO | 重定向【Linux】
理解 C 语言:从基础到高级的全面介绍
C 语言由 Dennis Ritchie 于 1972 年在贝尔实验室开发。它是从 B 语言和 BCPL 语言派生而来的,目的是为 Unix 操作系统提供一种高效、灵活的编程工具。C 语言的特点包括:
洁洁
2024/09/13
2360
c语言基础学习10_文件操作02
============================================================================= ============================================================================= 涉及到的知识点有: 六、stat函数 七、fread 和 fwrite函数 八、fopen的a模式说明 九、fopen的b模式说明 十、sftp传输文件时的说明 十一、fopen的其他模式简要说明 十二、实现二进制文件的拷贝 十三、fseek函数 十四、ftell函数 十五、fflush函数 十六、remove函数 和 rename函数 (文件删除函数和文件改名函数) 十七、通过fwrite将结构体保存到二进制文件中 课堂练习 ============================================================================= ============================================================================= 六、stat函数
黑泽君
2018/10/11
1.9K0
string头文件中常用函数
strlen是一个库函数所包含的头文件为#include<string.h>,这里我们可以在C plusplus上找到strlen所包含的头文件以及strlen传入后函数所生成的一个参数
如烟花般绚烂却又稍纵即逝
2024/11/26
2310
string头文件中常用函数
标准I/O (二).缓冲型IO库函数
UNIX/Linux 的缔造者们将数据的 来源和目标 都抽象为 文件,所以在 UNIX/Linux 系统中 一切皆文件
franket
2021/09/16
5780
从0开始写c语言课设 - plus studio
管理系统是C语言课设的经典项目,但是在chatGPT已经兴起的今天依然有不少同学因课设而困扰,本文将从0开始写一个简单的药店管理系统。
plus sign
2024/02/28
2360
相关推荐
C/C++ 文件与指针操作笔记
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档