- C编程教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境搭建
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整型提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策
- C语言 - 决策
- C语言 - if语句
- C语言 - if...else语句
- C语言 - 嵌套if语句
- C语言 - switch语句
- C语言 - 嵌套switch语句
- C语言中的循环
- C语言 - 循环
- C语言 - while循环
- C语言 - for循环
- C语言 - do...while循环
- C语言 - 嵌套循环
- C语言 - 死循环
- C语言 - break语句
- C语言 - continue语句
- C语言 - goto语句
- C语言中的函数
- C语言 - 函数
- C语言 - 主函数
- C语言 - 按值调用函数
- C语言 - 按引用调用函数
- C语言 - 嵌套函数
- C语言 - 变参函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - 返回语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 将数组传递给函数
- C语言 - 从函数返回数组
- C语言 - 变长数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 将指针传递给函数
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void指针
- C语言 - 悬空指针
- C语言 - 解引用指针
- C语言 - 近、远和巨型指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言中的结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点(.)运算符
- C语言 - 枚举(enum)
- C语言 - 结构体填充和压缩
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入和输出
- C语言 - 文件I/O (文件处理)
- C预处理器
- C语言 - 预处理器
- C语言 - 编译指示
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类别
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言中的字符指针和函数
什么是C语言中的字符指针?
字符指针存储字符类型或字符数组(字符串)第一个字符的地址。当您处理字符串时,字符指针非常有用。
C语言中没有字符串数据类型。“char”类型的数组被视为字符串。因此,char类型数组的指针代表一个字符串。然后可以将此char指针作为参数传递给函数来处理字符串。
声明字符指针
字符指针指向字符或字符数组。因此,要声明字符指针,请使用以下语法:
char *pointer_name;
初始化字符指针
声明字符指针后,需要用字符变量的地址对其进行初始化。如果有字符数组,只需提供字符数组的名称或其第一个元素的地址即可初始化字符指针。
字符的字符指针
以下是初始化字符类型字符指针的语法:
char *pointer_name = &char_variable;
字符数组的字符指针
以下是初始化字符数组(字符串)字符指针的语法:
char *pointer_name = char_array; /*or*/ char *pointer_name = &char_array[0];
字符指针示例
在下面的示例中,我们有两个变量字符和字符数组。我们正在获取两个指针变量来存储字符和字符数组的地址,然后使用字符指针打印变量的值。
#include <stdio.h> int main() { // Declare two variables char x = 'P'; char arr[] = "TutorialsPoint"; // Declaring character pointers char *ptr_x = &x; char *ptr_arr = arr; // Printing values 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)。
声明char类型的指针并为其赋值第0个位置的字符地址:
char *ptr = &arr[0];
请记住,数组的名称本身就是第0个元素的地址。
char *ptr = arr;
可以使用指针而不是数组变量(无方括号)来声明字符串。
char *ptr = "Hello";
这会导致字符串存储在内存中,其地址存储在ptr中。我们可以通过递增ptr来遍历字符串。
while(*ptr != '\0'){ printf("%c", *ptr); ptr++; }
访问字符数组
如果使用%s格式说明符打印字符数组,可以使用字符指针的名称来实现。但是,如果要访问字符数组的每个字符,则必须在字符指针名称之前使用星号(*),然后递增它。
示例
这是完整的程序代码:
#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
示例
或者,将ptr以%s格式传递给printf()来打印字符串。
#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()函数返回字符串的长度,即字符串中的字符数。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
实际上,strlen()函数根据如下所示的用户定义函数str_len()计算字符串长度:
#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()函数
赋值运算符(=)不用于将字符串值赋值给字符串变量,即char指针。相反,我们需要使用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
在内部,strcpy()函数在用户定义的str_cpy()函数中实现以下逻辑:
#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中对应字符的ASCII值时,函数返回正整数。这意味着str1按字母顺序出现在str2之后,就像在字典中一样。
- 当str1中第一个不匹配的字符的ASCII值小于str2中对应字符的ASCII值时,函数返回负整数。这意味着str1按字母顺序出现在str2之前,就像在字典中一样。
示例1
以下示例演示如何在C程序中使用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
您可以使用用户定义的函数str_cmp()获得类似的结果,如下面的代码所示:
#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++; } // If both strings are equal, return 0 return 0; }
运行此代码时,它将产生以下输出:
Both strings are identical
str_cmp() 函数比较两个字符串中相同索引处的字符,直到其中一个字符串的字符耗尽或找到相等的字符。
当检测到相同索引处字符不相等时,返回其ASCII值之差。如果循环终止,则返回“0”。