一、用数组实现的字符串和用指针实现的字符串
上述str是用数组实现的字符串,而ptr是用指针来实现的字符串。
我们来讨论一下他们所占的内存的大小,str是直接创建一个数组里面存了’A‘ 、’B‘、’C‘、‘、‘\0’。
四个字符每个字符的数据类型是char所占的内存是4个字节。而ptr实现的字符串占几个字节?肯定有大部分认为是1个字节也就是指针的空间大小。其实不然所占据的一个是指针加上字符串的大小;而指针大小是4个字节再加上字符串的4个字节一共8个字节。
我们可以看看他们在内存中的分布。
二 用数组实现的字符串和用指针实现的字符串不同点
赋值的不同
先来看看两段代码
第一段代码中s=“DEF”是错误的。为什么?正确的赋值一共使用的是字符串函数strcpy(s,“DEF”) ;而p=“456”却可以这样来操作。我们直接来了解一下他们的原理吧。str数组是直接创建一个空间来存放字符串,而p是一个指针是用来存放地址的。而p=“456”只是将“456”的地址告诉了让p指向了“456"。而str这样操作的话就会改变数组的地址相当于数组在内存空间中移动了,这是不可能直接实现的。
我们可以用图来形象的说明这一情况
我们在这里可以通俗的理解为p是一个变量,而str是一个常量。变量可变而常量是不能够变化的。
最后我们可以了解一下printf打印字符串的原理。
我们知道数组名其实是首元素的地址。而打印的时候就是将首元素地址交给打印的函数,函数往下打印直到遇到\0,它便会停止。这就是为什么字符串可以直接打印,一般数组需要用循环打印。
三、字符串数组
上面我们了解的用数组实现的字符串和用指针实现的字符串,字符串数组就是将字符串“数组化”来实现的。听上去很高级。通俗的理解就是字符串变成了数组的一个元素。
比如定义一个字符数组char ch[]={'A','B','C'},而我们可以定义一个字符串数组只不过需要用到二维数组char ch2[][5]={"abc","def","ijk"}。至于为什么要用到二维数组你们可以想一下不懂的可以私信来问问我。
我们来看看代码
a是用数组实现的字符串数组,p是用指针来实现的字符串数组。*p[]是一个指针数组用来存放指针的数组,它会分别指向p[0]、p[1]、p[2]。这就是为什么可以用于打印。它也可以像数组一样p[0][[0],来访问每一个字符串元素。我们可以看看他们分布的原理。
今天的分享就到这里有啥子问题可以私信我啦。