从TypeScript到C语言:前端初窥C语言之门

C语言初探:从几个基本方法认识指针

作为一个前端,平时一一直使用TypeScript来写代码,今天来学习了解一下C语言。

  • TS和C语言两者都是静态类型语言,需要在编译阶段进行类型检查。

  • C语言需要通过编译器将源代码编译成机器码,然后才能执行。而TypeScript需要将代码编译成JavaScrip在运行时通过浏览器或Node.js解释执行。

下面通过实现几个字符串的方法来初窥C语言之门:

认识指针

C语言中使用指针来处理内存和数据传递,而TypeScript中使用引用来处理对象和数据传递

指针是一个变量,用于存储另一个变量的内存地址。通过指针,我们可以访问和操作存储在内存中的数据。

先看下面的的代码,运行会输出什么:

rust 复制代码
const char str[] = "HelloWorld";

printf("%p\n", &str);

& 在这里是取地址符号,这里会打印出str的首地址。

再看下面的代码,会输出什么:

arduino 复制代码
int main()
{
    const char str[] = "HelloWorld";

    printf("%d\n", *str);

    return 0;
}

这段代码会打印出数字 72,在C语言中,字符常量(比如 'H')实际上是使用ASCII码值来表示的。ASCII码是一个标准的字符编码系统,将字符映射到了数字值。在ASCII码中,字符 'H' 对应的值是 72。因此,代码中的 *str 实际上是获取了字符串 str 的第一个字符 'H' 的ASCII码值,然后通过 printf 函数输出这个值,即 72。

计算字符串长度strlen

原理:定义一个变量,在遇到终止符 '\0' 前循环递增变量,同时指针向后指向下一个字符。

arduino 复制代码
/**
 * 计算字符串长度
 */
size_t strlen(const char *str)
{
    if (str == NULL)
    {
        return 0;
    }

    int length;

    while (*str != '\0')
    {
        length++;
        str++; // 指针后移
    }

    return length;
}

调用

输出字符串长度10(不包括 '\0' )。

arduino 复制代码
 const char str[] = "HelloWorld";

 size_t len = strlen(str);
    
 printf("%zu\n", len);

字符串拼接strcat

原理:先保存原始指针,再循环移动 dest 指针到目标字符串的末尾,再将 src 字符串的内容复制到 dest 字符串的末尾,在遇到src字符串的终止符时停止并在末尾加上 '\0' 即可。

arduino 复制代码
/**
 * 字符串拼接
 */
char *strcat(char *dest, const char *src)
{
    if (dest == NULL || src == NULL)
    {
        return NULL;
    }

    char *origin = dest;

    while (*dest != '\0')
    {
        dest++; // 将指针指向末尾
    }

    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
    }

    *dest = '\0';

    return origin;
}

调用

信心满满的运行,结果居然什么都没有输出??额,咋回事呀?

arduino 复制代码
char *res = strcat("iknow", "uknow");

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

检查了一下代码,发现写习惯TS了,直接就这样调用了 strcat("iknow", "uknow");,疏忽了字符串空间的申请,导致后面的字符拼接不上去, 见谅~

重新修改了一下,申请了一个足够的空间就可以正确拼接输出 'iknowuknow' 了:

arduino 复制代码
char dest[100] = "iknow";

char *res = strcat(dest, "uknow");

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

字符串复制strcpy

原理:先保存dest原始指针,随后循环将src的字符不断赋值给 dest,指针向后不断移动,直到遇到src的终止符,最后加上 '\0'

有了刚才的经验,写这个函数已经轻车熟路了:

ini 复制代码
/**
 * 字符串复制
 */
char *strcpy(char *dest, const char *src)
{
    if (dest == NULL || src == NULL)
    {
        return NULL;
    }

    char *origin = dest;

    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
    }

    *dest = '\0';

    return origin;
}

调用

打印dest输出了 ursmilekillmyheart 说明复制成功了:

arduino 复制代码
char dest[100] = "iknow";

char *res = strcpy(dest, "ursmilekillmyheart");

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

字符串比较strcmp

原理:先对空指针进行处理,然后指针向后,返回字符间的差值,为0就说明字符串一致。

arduino 复制代码
/**
 * 字符串比较
 */
int strcmp(const char *s1, const char *s2)
{
    if (s1 == NULL || s2 == NULL)
    {
        if (s1 == s2)
        {
            return 0;
        }
        else if (s1 == NULL)
        {
            return -1;
        }
        else
        {
            return 1;
        }
    }

    while (*s1 != '\0' && *s2 != '\0')
    {
        if (*s1 != *s2)
        {
            return (*s1 - *s2);
        }
        s1++;
        s2++;
    }
    return (*s1 - *s2);
}

调用

调用后输出0:

ini 复制代码
const char *str1 = "Huawei";
const char *str2 = "Huawei";

int res = strcmp(str1, str2);

printf("%d", res);

TS和C语言有诸多相似之处,感谢Typescript,极大的方便了我的学习和开发,拓展了我的思维,加深了我对语言的认识。这几个函数自己手动实现很适合作为学习指针的练习,通过对指针的操作我们可以访问字符串的每一个字符并实现一些方法。

初步探索C语言的精彩世界,为今后的学习和开发之路提供一些启发。

文章结束啦~

相关推荐
奶香臭豆腐17 分钟前
C++ —— 模板类具体化
开发语言·c++·学习
不想当程序猿_23 分钟前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先
cdut_suye35 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
捕鲸叉1 小时前
C++软件设计模式之外观(Facade)模式
c++·设计模式·外观模式
只做开心事2 小时前
C++之红黑树模拟实现
开发语言·c++
程序员老冯头3 小时前
第十五章 C++ 数组
开发语言·c++·算法
程序猿会指北4 小时前
【鸿蒙(HarmonyOS)性能优化指南】启动分析工具Launch Profiler
c++·性能优化·harmonyos·openharmony·arkui·启动优化·鸿蒙开发
无 证明8 小时前
new 分配空间;引用
数据结构·c++
别NULL12 小时前
机试题——疯长的草
数据结构·c++·算法