天天看点

【学习记录】关于char*和char[]的一些问题。

知识点:

1、char* 表示字符指针类型,当其指向一个字符串的第一个元素时,它就可以表示这个字符串。

如char* s=“abcde”;中,"abcde"是长度为5的字符数组常量,其最后一个元素是’\0’,而这句代表执行的结果是将s指向了"abcde"的第一个字符’a’,str后面的连续内存依次存放’b’,‘c’,‘d’,‘e’,’\0’.

2、关于初始化

char * str1= (char*)calloc(sizeof(char)*4);
str1 = "abc";
char * str2 = "def"
char str3[] = "gh"
           

①str1表示开辟一个长度为4的字符数组,str1指向这块空间,可以叫做空间1,str1=“abc"做了两件事,新建一个字符串"abc”(这个字符串的空间不同于空间1),然后让str1指向"abc"这个字符串,此时str1指向的是一个常量字符串,内容是不可以更改的,任何更改的操作都会报错,而原来开辟的空间1也会被挂起。

②str2初始化也做了两件事,创建一个新的字符串"def",是一个常量,创建一个名为str2的指针,指向"def"头部。也不可对其内容进行更改。

③str3的初始化表示创建一个字符数组,把’g’‘h’’\0’一次填进去,是可以更改的。

一个题目:

已知:char *s=“abcde”; 则sizeof(s)、sizeof(*s)、strlen(s)的值依次是多少?

答案应该是:4 1 5

#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
	char *s = "abcde";
	cout << strlen(s) << " ";
	cout << sizeof(s) << " ";
	cout << sizeof(*s) << " ";
	cout << s + 2 << endl;
	return 0;
}
           

输出是:

5 4 1 cde
           

顺便输出了一下s+2的值,不是只有c哦,而是到’\0’之前都会输出。

继续阅读