写给前端程序员的C语言

本文从前端程序员的角度出发,深入讲解C语言中的数组、字符串和指针。讨论了数组的连续空间特性,二维数组的概念,以及字符串的表示和操作,包括字符串与数字的关系、字符串的计算。此外,文章还详细阐述了指针的用法,包括为何需要指针、使用指针的常见错误,以及指针与数组、const的关系。通过对C语言基础知识的解读,帮助前端开发者理解C语言底层原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果我还从C语言写 Hello World 写起,我估计你会疯掉。总不能所有的都要来一遍叭,所以这篇文章的顺序不会按教科书的形式来讲,而是站在前端程序员与JavaScript语言和C语言对比的角度来讲。

先从数组说起。

数组

连续空间

我们知道数组在内存里是连续的空间,但是我们如何知道它是连续的呢?

例如下面这个例子:

const arr = [1,2,3]

我们如何知道在内存中 arr[0]arr[1] 的地址是相连的呢?

我们可以C语言来看:

#include <stdio.h>

int main(int argc, char const *argv[])
{
   
	int arr[] = {
   1,2,3};
	printf("%p\n",&arr[0] ); # 0x7ffeee3d697c
	printf("%p\n",&arr[1] ); # 0x7ffeee3d6980
}

注:& 是C语言里面取地址的操作符。

我们看到地址是以十六进制的形式打印出来的,数组 arr 里的第0个元素和第一个元素之间相差了 4 个字节,那么是不是所有的间隔都是相差 4 个字节呢?我们来看下。

int main(int argc, char const *argv[])
{
   
	int arr[] = {
   1,2,3};
	printf("%p\n",&arr[0] ); # 0x7ffee120497c
	printf("%p\n",&arr[1] ); # 0x7ffee1204980
	printf("%p\n",&arr[2] ); # 0x7ffee1204984
	printf("%p\n",&arr[3] ); # 0x7ffee1204988
}

我们看到结果是显然的,这说明数组在内存中是占据连续空间的。数组中的元素是按顺序进行排列的。

这有什么用吗?似乎不影响我们搬砖🧱 ,但是我相信你理解,从C的角度看待我们从js看不到的现象是有用的。

在javascript中,数组内可以放入任意类型的元素:

const arr =  [1,'2',{
   'a':'b'}];

而在C语言中是不支持在数组中放入不同类型元素的,在C语言中对于数组的定义是具有相同类型的一组元素,在定义数组时我们首先要在前面规定数组中的元素类型:

char arr = {
   "1" , "2"};

二维数组

二维数组可以看成一个矩阵,从矩阵角度看待矩阵,我们就可以做很多的事情了,除了搬砖,我们可以用矩阵做科学计算,如果你了解R语言的话,就知道这是多么的常用了。

例如 a[3][5],可以表示一个三行五列的矩阵。

那么二维数组应该如何定义呢?

int arr[][3] = {
   
        {
   1,2,3},
        {
   4,5,6},
        {
   7,8,9},
};

行数可以不用指定,C语言的编译器会自动计算,但是列比较指定。

#include <stdio.h>

int main(int argc, char const *argv[])
{
   
	int arr[][3] = {
   
		{
   1,2,3},
		{
   4,5,6},
		{
   7,8,9},
	};

	printf("%d\n", arr[0][1]); # 2
}

字符串

字符串与数字

我们知道其实在计算机内部,字母也是用数字来表示的,不过这如何在C语言中体现呢?

#include <stdio.h>

int main()
{
   
    /* code */
    char a = 49;
    char b = '1';
    if(a == b){
   
        printf("相等\n");
    }else{
   
        printf("不相等\n");
    }
    return 0;
}

我们发现上述的结果是相等,这很奇怪,如果是在javascript中,这是不可能的。

Object.is(49,'1');  // false

结果明显会是false。但是我们可以通过字符串的 charCodeAt() 方法,得到字母所对应的ASCII码,我们将字符串 1 转换成数字再和 49 来对比一下:

Object.is('1'.charCodeAt() ,49) // true

我们发现结果其实是相等的,一点都不惊讶这种差异,因为只是C语言体现的更直接,而javascript为我们进行了封装。

但其实在C语言中,我们把字符 1 以整数形式和以字符的形式输出,得到的结果是不同的:

#include <stdio.h>

int main()
{
   
    /* code */
    char a = '1';
    printf("%d\n", a);  // 49
    printf("%c\n", a); // 1
    return 0;
}

其实和javascript是可以对应的,以数字输出时就是数字 1,而以字符输出时是 49

字符串计算

#include <stdio.h>

int main()
{
   
    /* code */
    char a = 'a';
    char b = a + 1;
    printf("%c\n", b); // b
}

大写字母转小写字母:

#include <stdio.h>

int main()
{
   
    /* 大写字母与对应小写字母之间的距离 */
    int distance = 'a' -  'A'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值