浅析C语言中对于char*和char[]的理解
作者: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
sizeof | strlen | |
性质 | 运算符 | 函数 |
功能 | 以字节为单位计算操作数占用的内存大小 | 计算字符串的长度(strlen函数遇到\0就会停止下来,返回\0前出现的字符个数,不包括\0) |
时间 | 编译时 | 运行时 |
参数 | 类型/各种object | const char*\char*\char[] |
返回值 | size_t | size_t |
头文件 | 运算符没有头文件 | string.h |
6、char*和string
区别 | string | char* |
本质 | STL中的一个容器,string封装了char*。 | 指针 |
内存管理 | 由系统管理,除非系统内存池用完,否则不会出现内存问题 | 栈/堆,如果是堆需要手动释放 |
7、总结
1、const在*前修饰指定的类型,const在*之后修饰指针。
2、 读入只能是char [],因为读入需要明确的地址,注意必须标定长度。
总结:char * s 只是一个保存字符串首地址的指针变量,char a[]是许多连续的内存单元,单元中的元素是char型,char * 和 char a[]具有相同的效果,源于字符串的本质,即给一个字符串地址,便可以操作字符串,但char* 和 char a[]的本质属性不一样。
改值还得是char*,因为方便。
Reference
到此这篇关于C语言中对于char*和char[]的理解的文章就介绍到这了,更多相关C语言char*和char[]内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!