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语言的精彩世界,为今后的学习和开发之路提供一些启发。
文章结束啦~