浅析C语言中对于char*和char[]的理解

 更新时间:2023年02月06日 15:00:54   作者:ZSYL  
char * s 只是一个保存字符串首地址的指针变量,char a[]是许多连续的内存单元,单元中的元素是char型,char * 和 char a[]具有相同的效果,源于字符串的本质,这篇文章主要介绍了C语言中对于char*和char[]的理解,需要的朋友可以参考下

C语言对于char*和char[]的理解

1、char*和char[]的共同点

都是指针,指向第一个字符所在的地址,C语言指针可以代替数组使用。

指针也是一种变量,只不过它的内存单元中保存的是一种标识其他位置的地址,而地址也是整数,在32位平台下,就是32位,4个字节

指针的指向是指 指针变量所保存的其他的地址单元中 所存放的数据类型

int *ptr; //ptr指针保存的地址所在内存单元中的数据类型是整型
float *p; //这个p指针指向的内存地址存放的元素类型就是浮点型

而不管指向的数据类型是哪种,其实对于指针本身的值永远是整型,因为它保存的地址就是整数。

2、char*的用法

3、char[]的用法

//char[]
char a[20] = "aaa";
char b[] = "bbbbb";
char c[] = {'s','t','r','i','n','g','\0'};
char d[] = {"dddd"};
 
//一般这样初始化
char num[20] = {0};
//初始化的目的是为了添加\0,否则\0会跑到莫名其妙的地方导致很多错误。
//ASCII码中0对应的是nul符,即\0。这一行的意义就是给0~19都赋\0。

4、怎么输出char*地址

虽然指针名就代表的是地址,但在输出时需要加&,仅限cout。

const char* p = "ppp"; 
cout<<&p<<endl; //地址 方法一
cout<<(void*)p<<endl;//地址 方法二
cout<<p<<endl; //ppp
const char* a = "ppp";
printf("%p \n", a); //16进制地址,不过 %p的输出格式并不统一,有的编译器带0x前缀,有的不带
printf("%#X \n", a);//16进制地址,前缀统一是0x
printf("%s \n", a);  //ppp

5、strlen和sizeof

sizeofstrlen
性质运算符函数
功能以字节为单位计算操作数占用的内存大小计算字符串的长度(strlen函数遇到\0就会停止下来,返回\0前出现的字符个数,不包括\0)
时间编译时运行时
参数类型/各种objectconst char*\char*\char[]
返回值size_tsize_t
头文件运算符没有头文件string.h

6、char*和string

区别stringchar*
本质STL中的一个容器,string封装了char*。指针
内存管理由系统管理,除非系统内存池用完,否则不会出现内存问题栈/堆,如果是堆需要手动释放

7、总结

1、const在*前修饰指定的类型,const在*之后修饰指针。

2、 读入只能是char [],因为读入需要明确的地址,注意必须标定长度。

总结:char * s 只是一个保存字符串首地址的指针变量,char a[]是许多连续的内存单元,单元中的元素是char型,char * 和 char a[]具有相同的效果,源于字符串的本质,即给一个字符串地址,便可以操作字符串,但char* 和 char a[]的本质属性不一样。

改值还得是char*,因为方便。

Reference

Link
Link

到此这篇关于C语言中对于char*和char[]的理解的文章就介绍到这了,更多相关C语言char*和char[]内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • QT实现多文件拖拽获取路径的方法

    QT实现多文件拖拽获取路径的方法

    这篇文章主要为大家详细介绍了QT实现多文件拖拽获取路径的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 浅谈 C++17 里的 Visitor 模式

    浅谈 C++17 里的 Visitor 模式

    Visitor模式经常用于将更新的设计封装在一个类中,并且由待更改的类提供一个接受接口,其关键技术在于双分派技术,本文主要介绍 C++17 里的 Visitor 模式的相关资料,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • C++实现字符串类型相互转换的代码示例

    C++实现字符串类型相互转换的代码示例

    在C/C++编程中,字符串是非常基础且常用的数据类型,但是由于不同的编程语言或标准库可能采用不同的字符串类型,因此在不同的应用场景下可能需要进行字符串类型的相互转换,本文将介绍如何在C/C++中将char*,std::string,QString,CString/MFC String相互转换
    2023-06-06
  • C++元编程语言初步入门详解

    C++元编程语言初步入门详解

    这篇文章主要为大家介绍了C++元编程语言初步入门的详解示例,文中包含详细的基本概念及运用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • C++实现通讯录管理系统

    C++实现通讯录管理系统

    这篇文章主要为大家详细介绍了C++实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C/C++利用筛选法算素数的方法示例

    C/C++利用筛选法算素数的方法示例

    这篇文章主要给大家介绍了关于利用C/C++筛选法算素数的相关资料,文中给大家列举了普通枚举法和筛选法两种方法实现的方法示例,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-12-12
  • 老程序员教你一天时间完成C语言扫雷游戏

    老程序员教你一天时间完成C语言扫雷游戏

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏初级版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++ 迷宫游戏实现代码

    C++ 迷宫游戏实现代码

    这篇文章主要介绍了C++ 迷宫游戏实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++ const修饰变量和修饰函数介绍

    C++ const修饰变量和修饰函数介绍

    这篇文章主要介绍了C++ const修饰变量和修饰函数介绍,本文直接用实例来讲解各自的作用,并总结了各自的使用技巧,需要的朋友可以参考下
    2015-03-03
  • C++标准库封装的vector数组

    C++标准库封装的vector数组

    这篇文章主要介绍了C++标准库封装的vector数组,vector创建的对象包含众多封装好的函数,想了解其相关资料的小伙伴可以参考下面文章内容,希望对你的学习有所帮助
    2022-03-03

最新评论