1. 简介

char *类型的字符串和char []类型的字符数组在 C 语言中经常用到,它们的主要区别在于如何定义和使用。char *类型的字符串是一个指向字符数组的指针,指针的值为第一个字符的地址,字符串中的每个字符都是用连续的内存单元存储的。在 C 语言中,我们通常使用双引号来定义字符串,例如:

char *str = "hello";

这里的 str 是一个指向字符数组的指针,指向以字符 'h' 开始的内存空间,后面依次存储了字符 'e'、'l'、'l' 和 'o',最后以一个 '\0' 结尾。在使用指针指向的字符串时,我们通常使用指针访问字符串的每个字符,例如:

char *str = "hello";
char c = str[0]; // 访问字符串的第一个字符

char []类型的字符数组是一种定长数组,存储指定长度的字符序列,数组中的每个元素都是一个 char 类型的变量。在 C 语言中,我们通常使用中括号来定义字符数组,例如:

char arr[] = {'h', 'e', 'l', 'l', 'o', '\0'};

这里的 arr 是一个长度为 6 的字符数组,它包含了字符 'h'、'e'、'l'、'l' 和 'o',最后以一个 '\0' 结尾。在使用字符数组时,我们可以通过下标访问数组中的每个元素,例如:

char arr[] = {'h', 'e', 'l', 'l', 'o', '\0'};
char c = arr[0]; // 访问数组的第一个元素

需要注意的是,char * 类型的字符串和 char [] 类型的字符数组在很多情况下可以相互转换,但它们是不同的数据类型,需要根据实际情况进行选择和使用。

  1. char * 和char[]的不同点

  1. 类型不同

char * 是一个指针类型,用于表示一个指向字符数组开头的指针,而 char[] 是一个字符数组类型,用于表示一个字符数组。

  1. 指向的内容能否修改

char * 声明的字符串常量在内存中是以只读的方式存储的,不能被修改,而 char[] 声明的字符数组可以被修改。

在C语言中,使用双引号引起来的一串字符叫做字符串常量,它在内存中是以只读的方式存储的,不能被修改。在下面的代码中,尝试将字符串常量 "hello" 中的第一个字符 'h' 修改为 'a',这样的操作是非法的,因为字符串常量是只读的,任何试图修改它的操作都会导致未定义的行为。如果需要修改字符串中的内容,应该使用字符数组而不是字符串常量。

char str[] = "hello";
str[0] = 'a'; // 将字符串中的第一个字符 'h' 替换为 'a'

如果要将字符串中的字符替换成其他字符,应该先将其拷贝到一个字符数组中,然后再对字符数组进行修改。例如:

char str[] = "hello";
str[0] = 'a'; // 将字符串中的第一个字符 'h' 替换为 'a'

这样就可以安全地修改字符串中的字符了。

  1. 是否支持指针运算

char * 可以进行指针运算,如 ++、--、+、- 等操作,而 char[] 不支持这些操作。

假设有一个 char * 指针变量 str,它指向一个字符串 "hello",那么可以使用如下方式进行指针运算:

char *str = "hello";
char c = *(str + 1); // 通过指针运算访问字符串的第二个字符

在这个例子中,指针变量 str 加上 1,指向了字符串中的第二个字符,然后使用 * 运算符来访问该字符的值。

  1. 是否可以动态分配内存

char * 可以进行动态分配内存,如使用 malloc() 分配内存空间,而 char[] 声明的字符数组大小在编译时就已经确定,无法动态改变大小。

下面的代码演示了如何使用 malloc 分配一个大小为 10 字节的字符数组,并将其用作字符串:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {char *str = (char*) malloc(10 * sizeof(char));strcpy(str, "hello");printf("%s\n", str);free(str);return 0;
}

在上面的代码中,使用 malloc 分配了 10 个字符的内存空间,并将其转换为 char * 类型。然后使用 strcpy 函数将字符串 "hello" 复制到分配的内存空间中,最后使用 printf 函数输出该字符串,并使用 free 函数释放分配的内存。

  1. 是否可以修改指向性

在函数参数中,char * 表示一个指向字符数组的指针,可以被修改,而 char[] 表示一个字符数组,不能被修改,即 char[] 实际上是一个指向字符数组的指针,但它是一个常量指针,所以不能被修改。

char * 类型的变量可以被修改,它指向的字符数据可以被修改,而 char[] 类型的变量则是一个常量指针,不能被修改。例如,下面的代码是合法的:

char str1[] = "hello";
char *str2 = "world";str2 = str1;  // 可以修改指针指向的位置
str2[0] = 'a'; // 可以修改指针指向的位置上的字符数据

但是下面的代码是不合法的:

char str1[] = "hello";
char str2[] = "world";str2 = str1; // 不可以修改数组指针的指向
str2[0] = 'a'; // 可以修改数组指针指向的位置上的字符数据
  1. char * 和 char[]转换

下面是一个将字符数组和字符串互相转换的程序,你可以根据需要进行调整:

#include <stdio.h>
#include <string.h>void arrayToString(char *arr, char *str, int length) {// 将字符数组转换为字符串int i;for (i = 0; i < length; i++) {str[i] = arr[i];}str[length] = '\0';
}void stringToArray(char *str, char *arr, int length) {// 将字符串转换为字符数组int i;for (i = 0; i < length; i++) {if (i < strlen(str)) {arr[i] = str[i];} else {arr[i] = '\0';}}
}int main() {char arr[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\0'};char str[100];arrayToString(arr, str, sizeof(arr));printf("String: %s\n", str);char arr2[100];stringToArray(str, arr2, sizeof(arr2));printf("Array: %s\n", arr2);return 0;
}

这个程序中,arrayToString()函数将字符数组转换为字符串,stringToArray()函数将字符串转换为字符数组。在main()函数中,我们先定义了一个字符数组arr,然后调用arrayToString()函数将其转换为字符串并打印输出。接着,我们调用stringToArray()函数将字符串转换为字符数组,并打印输出转换后的字符数组。

char *字符串和char[]的区别相关推荐

  1. C++ 字符串、string、char *、char[]、const char*的转换和区别

    1.字符串 字符串本质就是一串字符,在C++中大家想到字符串往往第一反应是std::string(后面简称string) 字符串得从C语言说起,string其实是个类,C语言是没有class的,所以C ...

  2. char str[]与char *str的区别

    一个具体例子: main() {char *p="abc123ABC";//char p[]="abc123ABC"int i=0;while(*(p+i)!= ...

  3. char s []和char * s有什么区别?

    在C语言中,可以在这样的声明中使用字符串文字: char s[] = "hello"; 或像这样: char *s = "hello"; 那么区别是什么呢? 我 ...

  4. char[]数组与char *指针的区别

    char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...

  5. char s[] 和 char *s 的区别

    第一种: char *a 与char a[] 的区别 char *d = "hello" 中的a是指向第一个字符'a'的一个指针:char s[20] = "hello& ...

  6. 数据库中char varchar nchar nvarchar的区别

    数据库中char varchar nchar nvarchar的区别 我们在进行数据库的设计的时候,很多情况下表中的字段都是用的是字符串类型的数据,其中就有四种选择char varchar nchar ...

  7. char str[] 和 char *str 的区别

    char* get_str(void) { char str[] = {"abcd"}; return str; } char str[] = {"abcd"} ...

  8. C++中 char *s 和 char s[] 的区别

    原因 刚好看到给main传递参数,书上(C++Primer)说" int main(int argc, char *argv[])也可以写成 int main(int argc, char ...

  9. char *a 与char a[] 的区别和char** argv与char *argv[]区别

    char *a 与char a[] 的区别 char *a = "hello" 中的a是指向第一个字符'a'的一个指针 char a[20] = "hello" ...

最新文章

  1. 在linux中安装软件会出的问题,linux中安装程序出现的问题
  2. rndis ethernet gadget 驱动 安装方法
  3. args和kwargs以及argv用法
  4. 堆栈图解CSAPP Bomb Lab实验解析
  5. linux简介ubuntu,Linux文件系统简介(基于Ubuntu)
  6. Linux 异步通知
  7. [翻译] TGLStackedViewController
  8. 关联Left Outer Join的第一条记录
  9. Cisco无线AP在复杂企业环境配置指南
  10. 关于以主机命名的网站集
  11. 质性数据分析软件NVivo教程:自动编码情绪如何运作?
  12. 18.06.27 16年期末11:张三丰的传人
  13. 网络骇客入门之UDP编程
  14. 精美的mac屏保需要?试试Aerial 2.1.3汉化版支持big sur!
  15. MySQL数据库实验(四):E-R图实例讲解
  16. 为什么登出网页浏览器重定向到/login?logout
  17. php ses 发送邮件,php – 无法使用Amazon SES发送电子邮件
  18. android camera2 API流程分析
  19. 非oracle用户连接数据库出现ORA-12514
  20. HTML中的表格和表单

热门文章

  1. classin安卓手机安装条件_classin软件
  2. 程序解码错误:Accept-Encoding“: “gzip, deflate, br
  3. PHP采集器querylist
  4. Halcon学习---光学字符识别(OCR)
  5. Huffman和Priority_queue 解决POJ 1521
  6. 天若OCR文字识别 v1.2.0
  7. SQL:数据库的设计
  8. java设备台账管理系统myeclipse定制开发mysql数据库网页模式java编程jdbc
  9. python模拟实现链表_python实现链表
  10. UI设计规范之圆角有哪些优势?为什么我们使用圆角?如何使用?