char *与char []类型的区别

时间:2022-08-18 18:48:47

参考文章:char *s 和 char s[] 的区别小结

char *s1 = "hello";
char s2[] = "hello";

 

【区别所在】

char *s1 的s1是指针变量,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,但当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
char s2[]的s2 是数组对应着一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改变

 

【内存模型】
       +-----+     +---+---+---+---+---+---+
   s1: |  *======> | h | e | l | l | o |\0 |
       +-----+     +---+---+---+---+---+---+
       +---+---+---+---+---+---+
   s2: | h | e | l | l | o |\0 |
       +---+---+---+---+---+---+


示例代码:

#include <iostream>

int main()
{
	char *s1 = "hello";
	char s2[] = "hello";
	char *s3 = s2;				//★注意这句必须要★
	char **s4 = &s3;			//s2(char[])要用两步才能完成赋值 
	char **s5 = &s1;			//s1(char*) 只需一步
	char(*s6)[6] = &s2;			//&s2等价于char(*)[6]:指向包含6个char型元素的一维数组的指针变量

	printf("s1=[%s]\n", s1);
	printf("s2=[%s]\n", s2);
	printf("s3=[%s]\n", s3);
	printf("s4=[%s]\n", *s4);	
	printf("s5=[%s]\n", *s5);
	printf("s6=[%s]\n", s6);	

	printf("\n size of s1: %d \n", sizeof(s1));
	printf("\n size of s2: %d \n", sizeof(s2));

	system("pause");

	return 0;
}

运行结果如下:

char *与char []类型的区别


注:字符串比较不能使用等于号,只能使用strcmp函数;相同则返回0,反之返回非零值。


#include<iostream>
#include<string>

using namespace std;

char str[20] = { "hello hdu" };
char *pstr;

int main()
{
	pstr = str;
	cout << *str << endl;		// h
	cout << *pstr << endl;		// h
	*pstr++ = 'Y';			
	cout << *str << endl;		// Y
	cout << *pstr << endl;		// e
	cout << *(pstr-1) << endl;	// Y
	cout << *(pstr--) << endl;	// e
	system("pause");
	return 0;
}