掌握 C 语言字符指针与函数用法
什么是 C 语言中的字符指针?
字符指针存储字符类型的地址,或字符数组(字符串)首字符的地址。在字符串操作中,字符指针非常实用。
C 语言没有专门的字符串数据类型。"char" 类型的数组被视为字符串,因此指向 char 类型数组的指针即代表一个字符串。该字符指针可作为参数传递给函数以处理字符串。
声明字符指针
字符指针指向字符或字符数组,声明语法如下:
char *pointer_name;
初始化字符指针
声明后,需用字符变量的地址初始化。若是字符数组,直接用数组名或首元素地址初始化即可。
指向单个字符
初始化指向字符类型的指针语法:
char *pointer_name = &char_variable;
指向字符数组(字符串)
初始化指向字符数组的指针语法:
char *pointer_name = char_array; /*或*/ char *pointer_name = &char_array[0];
字符指针示例
下例声明一个字符变量和一个字符数组,用两个指针分别存储其地址,并通过指针打印值。
#include <stdio.h> int main() { // 声明变量 char x = 'P'; char arr[] = "TutorialsPoint"; // 声明字符指针 char *ptr_x = &x; char *ptr_arr = arr; // 打印值 printf("Value of x : %c\n", *ptr_x); printf("Value of arr: %s\n", ptr_arr); return 0; } 输出
运行代码,输出如下:
Value of x : P Value of arr: TutorialsPoint
深入理解字符指针
字符串可声明为数组:
char arr[] = "Hello";
字符串是以空字符 \0 结尾的字符数组,上例数组最后一个元素即为 \0。
声明 char 类型指针,指向数组第 0 个元素地址:
char *ptr = &arr[0];
数组名本身就是第 0 个元素的地址,故也可写作:
char *ptr = arr;
字符串也可直接用指针声明(无方括号):
char *ptr = "Hello";
这会将字符串存入内存,并将其地址赋给 ptr。通过递增 ptr 可遍历字符串:
while(*ptr != '\0'){ printf("%c", *ptr); ptr++; } 访问字符数组
用 %s 格式符打印字符数组时,直接使用指针名即可;若需逐字符访问,需在指针名前加星号 * 并递增指针。
示例 1:逐字符打印
#include <stdio.h> int main(){ char arr[] = "Character Pointers and Functions in C"; char *ptr = arr; while(*ptr != '\0'){ printf("%c", *ptr); ptr++; } } 输出
Character Pointers and Functions in C
示例 2:直接打印字符串
#include <stdio.h> int main(){ char arr[] = "Character Pointers and Functions in C"; char *ptr = arr; printf("%s", ptr); } 输出
Character Pointers and Functions in C
字符指针相关函数
string.h 头文件定义了多个字符串处理库函数,如求长度、复制、比较等,这些函数均使用 char 指针作为参数。
strlen() 函数
strlen() 返回字符串长度(字符数)。原型:
int strlen(char *)
示例 1:打印字符串长度
#include <stdio.h> #include <string.h> int main(){ char *ptr = "Hello"; printf("Given string: %s \n", ptr); printf("Length of the string: %d", strlen(ptr)); return 0; } 输出:
Given string: Hello Length of the string: 5
示例 2:自定义实现字符串长度计算
#include <stdio.h> #include <string.h> int str_len(char *); int main(){ char *ptr = "Welcome to Tutorialspoint"; int length = str_len(ptr); printf("Given string: %s \n", ptr); printf("Length of the string: %d", length); return 0; } int str_len(char *ptr){ int i = 0; while(*ptr != '\0'){ i++; ptr++; } return i; } 输出:
Given string: Welcome to Tutorialspoint Length of the string: 25
strcpy() 函数
不能用赋值运算符 = 给字符指针赋字符串值,需用 strcpy(),原型:
char * strcpy(char * dest, char * source);
示例 1:使用 strcpy()
#include <stdio.h> #include <string.h> int main(){ char *ptr = "How are you doing?"; char *ptr1; strcpy(ptr1, ptr); printf("%s", ptr1); return 0; } strcpy() 返回目标字符串指针 ptr1。
How are you doing?
示例 2:自定义实现字符串复制
#include <stdio.h> #include <string.h> void str_cpy(char *d, char *s); int main(){ char *ptr = "Using the strcpy() Function"; char *ptr1; str_cpy(ptr1, ptr); printf("%s", ptr1); return 0; } void str_cpy(char *d, char *s){ int i; for(i = 0; s[i] != '\0'; i++) d[i] = s[i]; d[i] = '\0'; } 输出:
Using the strcpy() Function
函数将源字符串逐字符复制到目标,直到遇到空字符 \0,最后在目标数组末尾添加 \0。
strcmp() 函数
不能用常规比较运算符(<, >, == 等)比较字符串,需用 string.h 中的 strcmp(),原型:
int strcmp(char *str1, char *str2)
strcmp() 有三种返回值:
- 两字符串完全相同,返回
0。 - str1 第一个不匹配字符的 ASCII 值大于 str2 对应字符,返回正整数,表示 str1 在字典序中排在 str2 之后。
- str1 第一个不匹配字符的 ASCII 值小于 str2 对应字符,返回负整数,表示 str1 在字典序中排在 str2 之前。
示例 1:使用 strcmp()
#include <stdio.h> #include <string.h> int main(){ char *s1 = "BASK"; char *s2 = "BALL"; int ret = strcmp(s1, s2); if (ret == 0) printf("Both strings are identical\n"); else if (ret > 0) printf("The first string appears after the second string \n"); else printf("The first string appears before the second string \n"); return 0; } 输出:
The first string appears after the second string
将 s1 改为 "BACK" 再运行,输出:
The first string appears before the second string
示例 2:自定义实现字符串比较
#include <stdio.h> #include <string.h> int str_cmp(char *str1, char *str2); int main(){ char *s1 = "The Best C Programming Tutorial Available Online"; char *s2 = "The Best C Programming Tutorial Available Online"; int ret = str_cmp(s1, s2); if (ret == 0) printf("Both strings are identical\n"); else if (ret > 0) printf("The first string appears after the second string\n"); else printf("The first string appears before the second string\n"); return 0; } int str_cmp(char *str1, char *str2) { while (*str1 != '\0' && *str2 != '\0') { if (*str1 != *str2) { return *str1 - *str2; } str1++; str2++; } // 两字符串相等返回 0 return 0; } 输出:
Both strings are identical
str_cmp() 比较两字符串同一索引处的字符,直到任一字符串结束或字符相等。发现不等字符时返回其 ASCII 码差值;循环正常结束返回 0。
C语言
- C# 命名空间完全指南:避免命名冲突、using 指令与嵌套命名空间
- C++ 类模板实战指南:编写灵活的类型无关代码
- 掌握 C# while 与 do-while 循环:语法、示例与最佳实践
- C# 异常处理完全指南:try-catch-finally、异常类型、自定义异常与最佳实践
- C 语言自增自减运算符完全指南:用法、优先级与最佳实践
- 掌握 C++ break 语句:跳出循环与 switch 的核心控制流
- C++ 流精通:cout、cin、cerr、clog 实战指南
- C 语言 Typedef 详解:自定义类型名简化代码
- 掌握 C 语言结构体柔性数组成员实现动态数据处理
- 精通 C# ArrayList:动态数组全方位实战教程
- C# 数组完全指南:声明、初始化、访问与多维数组
- C++ char 类型完全指南:声明、ASCII 码、输入输出与字符串转换