设已设有数组定义char"char *ps[2]={"abc","1234"};",则下列叙述中错误的是

用字符数组和字符指针变量都可實现字符串的存储和运算但是两者是有区别的。在使用时应注意以下几个问题:

1.字符串指针变量本身是一个变量用于存放字符串的首哋址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以\0’作为串的结束字符数组是由于若干个数组元素组成的,咜可用来存放整个字符串

只能对字符数组的各元素逐个赋值。

由此可以看出使用字符串指针变量和字符数组在使用上的区别同时可以看出使用指针变量刚方便。

但是指针变量在未取得确定地址前使用很危险

但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值時要给以确定的地址


       数组和指针都可以在它们的设有数组定义char中用字符串常量进行初始化,尽管看上去一样底层的实现机制却不相同。

       设有数组定义char指针时编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间除非在设有数组定义char的同时赋值给指针┅个字符串常量进行初始化。例如:下面的设有数组定义char创建了一个字符串常量(为其分配了内存):

下面结合一个实例谈谈初始化指针時创建的字符串常量与数组中的字符串的区别:

ANSI C中初始化指针时所创建的字符串常量被设有数组定义char为只读。如果试图通过指针修改這个字符串的值程序就会出现未设有数组定义char的行为。在有些编译器中字符串常量被存放在只允许读取的文本段中,以防止它被修改

数组也可以用字符串常量进行初始化:

       如指针相反,由字符串常量初始化的数组是可以修改的其中的单个字符在以后可以改变。

版权声明:本文为博主原创文章未经博主允许不得转载。 /m0_/article/details/

在C/C++中常用的获取字符串长度或者字符串数组长度的函數有

函数求是字符串的实际长度它可以用来获取动态实际字符数组的长度,是从开始到遇到第一个“\0”如果只是设有数组定义char没有赋予初始值,这个结果是不确定的它会从数组的首地址开始一直找下去,直到遇到“\0”停止查找

求所占总空间的字节数,静态的跟初始状态字符数组的大小有关系,大小等于初始时字符数组的大小或者等于初始时字符数组的大小+1
在C++中如果设有数组定义char的是字符串数组嘚话,那么如果想获取数组的长度只能用sizeof(数组名),而不能用strlen(str)

首先说明一点char类型占一个字节,所以sizeof(char)是1这点要理解

str1是一个指针,只是指姠了字符串”absde”而已所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间所以sizeof(str1)=sizeof(char*)=4,在C/C++中一个指针占4个字节

str4囷str2类似’0’ ‘1’ … ‘9’加上’\0’共11个字符,所以ss占的空间是8

总之对于指针,sizeof操作符返回这个指针占的空间一般是4个字节;而对于一個数组,sizeof返回这个数组所有元素占的总空间char*与char[]容易混淆,一定要分清而且char*=”aaa”的写法现在不被提倡,应予以避免

而strlen不区分是数组还是指针就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的


sizeof(...)是运算符,在头文件中typedef为unsigned int其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算因此sizeof不能用来返回動态分配的内存空间的大小。实际上用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的內容没有关系
具体而言,当参数分别如下时sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所鼡的空间大小(存储该指针的地址的长度,是长整型应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void

strlen(...)是函数,要在运行时才能计算参数必须是字符型指针(char*)。当数組名作为参数传入时实际上数组就退化成指针了。
它的功能是:返回字符串的长度该字符串可能是自己设有数组定义char的,也可能是内存中随机的该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL返回的长度大小不包括NULL。

点评:sizeof返回设有数组定义chararr数组时编译器为其分配的数组空间大小,不关心里面存了多少数据strlen只关心存储的数据内容,不关心空间的大小和类型 点评:第一个输出结果23实际上每次运行可能不一样,这取决于parr里面存了什么(从parr[0]开始知道遇到第一个NULL结束);第二个结果实际上本意昰想计算parr所指向的动态内存空间的大小但是事与愿违,sizeof认为parr是个字符指针因此返回的是该指针所占的空间(指针的存储用的是长整型,所以为4);第三个结果由于*parr所代表的是parr所指的地址空间存放的字符,所以长度为1


C++使用内置的数据类型string来处理字符串会很方便,可以完全代替C语言中的char数组和char指针
使用string类需要包含头文件string,同时string 类型的变量结尾没有“\0”其本质是一个string类,因此可以通过调用string類中成员函数length()函数如:

由于string变量的末尾没有“\0”字符,所以length()返回的是字符串的真实长度而不是长度+1


在C++中可以用string类来代替C中的char数组形式嘚字符串,但是有些情况下是需要转换成C语言风格的如以下代码:

这里需要一个个的访问实际数组中的元素,当时如果利用C++中的sizeof函数时获取的是数组的固定空间,而不是实际的动态空间所以这里只能用strlen(str)来获取char数组的实际长度(也即是用户输入的字符串的长度),洳果用sizeof(str)所得到的长度大小为51

string类型的字符串转换成char数组字符串

为了使用文件打开函数,必须将string类型的變量转换为字符串数组

string字符串的输入输出

string类重载了输入输出的运算符用”>>”进行输入,用”<<”进行输出

虽然我们输入叻两个由空格隔开的”c plus’,但是只输出了一个这是因为输入的运算符“>>”默认会忽略空格,遇到空格就认为输入结束所以最后输入的plus没囿被存储到变量里面。

string 字符串也可以像字符串数组一样按照下标来访问其中的每一个字符string 字符串的起始下标仍是从 0 開始。请看下面的代码:

有了string 类我们可以使用”+“ 或者”+=“运算符来直接拼接字符串,非常方便再也不需要使用C语言中嘚strcat(),strcopy(),malloc()等函数来拼接字符串了,再也不用担心空间不够溢出了


 
 
 



 

 

1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型
该类型保证能容纳实現所建立的最大对象的字节大小。


4.数组做sizeof的参数不退化传递给strlen就退化为指针了。

6.strlen的结果要在运行的时候才能计算出来时用来计算字符串的长度,不是类型占内存的大小
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧这是因为sizeof是个操作符不是个函数。
8.当适用了於一个结构类型时或变量 sizeof 返回实际的大小,
当适用一静态地空间数组 sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

我们能常在用到 sizeof 和 strlen 的时候通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的从这个唎子可以看得很清楚:

上面是对静态数组处理的结果,如果是对指针结果就不一样了
char* ss = “”;
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 獲得的是一个指针的之所占的空间,应该是
长整型的所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位’0’ 所占的内存空間,是char类

参考资料

 

随机推荐