C语言之字符串和指针

发布时间:2024年01月14日

?

目录

用数组实现的字符串和用指针实现的字符串

█用数组实现的字符串str

█用指针实现的字符串ptr

注意

用数组和指针实现字符串的不同点

字符串数组

?用数组实现的字符串的数组——二维数组

用指针实现的字符串数组——指针数组

注意


字符串和指针有着紧密·的联系,下面我们就来学习字符串和指针的相似点和不同点。


用数组实现的字符串和用指针实现的字符串

下面我们来看用数组和指针实现的字符串

#include<stdio.h>

int main()
{
	char str[] = "ABC";
	char *ptr = "123";
	
	printf("str=\"%s\"\n", str);
	printf("ptr=\"%s\"\n", ptr);

	return 0;
}

让我们来结合两图来分析它们的异同:

█用数组实现的字符串str

str是char[4]类型的数组,各元素从开头开始依次用‘A’ 'B' 'C' '\0'进行初始化,char数组占据的内存空间和数组元素个数一致,可以通过sizeof(str)求得

█用指针实现的字符串ptr

ptr是指向char型变量的指针变量,它的初始值为字符串字面量“123”,对字符串字面量进行判定,可以得到指向该字符串字面量第一个字符的指针,所以ptr被初始化为指向保存在内存中的字符串字面量“123”的第一个字符‘1’的指针

另外一般情况下,我们把指针p指向字符串字面量“string”的首个字符‘s’,称为“指针p指向string”

需要注意的是指针ptr不可进行如下声明:

	char *ptr = {'1', '2', '3', '\0'};

数组用的{ }形式的初始值,不可以用于单一的变量

从上面的图可以看出,指针ptr和字符串字面量“123”都占用了空间,指针ptr占用的空间为sizeof(ptr),即sizeof(char*)字节,其长度因编译器而异。

请注意,用指针实现的字符串相比于数组需要更多的内存空间。

注意

指针p是指向字符串首个字符的指针,数组str也是指向首个字符的指针(因为数组名会被解释为指向起始元素的指针)

综上,使用下标运算符[ ],可以访问字符串中的各个字符,这是二者的共同点

用数组和指针实现字符串的不同点

先让我们来看下面两段代码:

/*这是一段错误的代码*/
#include<stdio.h>

int main()
{
	char s[] = "ABC";
	printf("s= \"%s\"\n", s);
	s = DEF;
	printf("s= \"%s\"\n", s);

	return 0;
}
/*这是一段正确的代码*/
#include<stdio.h>

int main()
{
	char *p = "123";
	printf("p= \"%s\"\n", p);
    p = "456";
	printf("p= \"%s\"\n", p);

	return 0;
}

?在第一段代码中,目的是将“DEF”赋值给“ABC”的数组,并显示前后赋值的字符串,在进行DEF的赋值过程中会发生错误,所以程序无法执行,因为对数组不能进行赋值,虽然左边的数组名可以被解释为数组起始元素的地址,但依然不能改写其值,否则就会改变数组的地址。

我们用图来解释第二段代码的赋值的原理:

第一个图对应:

char *p = "123";

指针p的初始值为字符串字面量“123”,所以指针p指向字符串字面量“123”的第一个字符‘1’

第二个图对应:

  p = "456";

与上面的解释一样,不过是对其地址上保存的值进行更改而异,指针p指向的字符变为了‘4’

不要误以为是进行了赋值,其实不过是指针的指向发生了变化,因为不再有指针指向123,所以该字符串也不能被访问,也就是说成为了无法清除的垃圾。


字符串数组

在前面我们学习了用数组和指针两种形式来表示字符串,而字符串数组就是将字符串“数组化”来实现的


#include<stdio.h>

int main()
{
	int i = 0;
	char a[][5] = {"MAX", "MIN"};
	char *p[] = {"MAX", "MIN"};
	
	for(;i < 2; i++)
		printf("a[%d] = \"%s\"\n", i, a[i]);
	for(;i < 2; i++)
		printf("p[%d] = \"%s\"\n", i, p[i];
			
			return 0;
}

?用数组实现的字符串的数组——二维数组

数组a是2行5列的二维数组,占用的内存空间是10个字节(行数乘列数),并非所有的字符串长度是一样的,所以数组会产生未被使用的部分。

a[0][0]

a[0][1]

……

……

a[2][4]

a[2][5]

01234
0MAX\0\0
1MIN\0\0

用指针实现的字符串数组——指针数组

指针p是元素类型为char*型,元素个数为2的数组,数组p[0] p[1] 分别指向各字符串字面量的首字符‘M’的指针,因此除了数组p占用的2个sizeof(char*)长度之的空间之外,还占用2个字符串字面量的空间。

字符串字面量中的MAX中的字符,可以从头开始按顺序通过p[0][0] p[0][1]……等来访问,通过连续使用下标运算符[ ],可以像二维数组一样处理指针数组。

注意

因为无法保证初始值的字符串字面量在内存单元时连续保存的,所以在上图中字符串字面量并不是相邻的,并不能想当然的认为“MAX”后面就保存着“M”,否则在有些编译器和运行环境中不能运行。


结语

我也是终于放寒假了,希望在座的各位都能不挂科取得好成绩!!!

文章来源:https://blog.csdn.net/W06164932/article/details/135561535
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。