好哒,让我们接着上一次的问题开始~~
指针时,无法修改字符串内容,因为这个字符串放在内存的常量区,而内存的常量区时只读
但是如果用数组的方式定义,会在储存于内存常量区之后在栈上分配空间、容纳字符串,
区别在于:用数组定义的方式会产生副本,而指针的定义只是让指针指向内存常量区的地址,所以,数组方式才可以修改
所以,建议把指针初始化为字符串字面量时,使用const限定符
2.字符串数组
首先,字符串就很像一个数组,又来了个数组的数组,嘿嘿,那不就是二维数组嘛
下面附上一个代码,大致熟悉熟悉字符串的二维数组的规则:
#include <stdio.h>
#define SLEN 40
#define LIM 5
int main ()
{
const char *mytalents[LIM]={
"Adding numbers swiftly",
"Multiplying accurately",
"Stashing data",
"Following instructions to the letters",
"Understand the c language"
};
char yourtalents [LIM][SLEN]={
"Walking in a straight line",
"Sleeping",
"Watching television",
"Mailing letters",
"Reading email"
};
puts("Let's compare talents.");
printf("%-36s %-25s\n","My talents","Your talents");
for(int i=0;i<LIM;i++)
{
printf("%-36s %-25s\n",mytalents[i],yourtalents[i]);
}
printf("\nsizeof mytalents:%zd,sizeof yourtalents %zd\n",sizeof(mytalents),sizeof(yourtalents));
return 0;
}
使用一个下标时,表示一个字符串
使用两个下标时,代表一个字符
mytalents数组是一个内含5个指针的数组,共占40字节
yourtalents数组是一个内含5个数组的数组,每个数组内含40个char类型的值,共占用200字节
所以二者类型并不相同
字符串数组分配内存的使用率较低,即每个元素的大小必须相同,而且必须是能储存最长字符串的大小
但指针指向的字符串字面量不能更改
各有利弊,按需使用
3.指针和字符串
#include <stdio.h>
int main ()
{
const char * mesg="Don't be a fool!";
const char * copy;
copy=mesg;
printf("%s\n",copy);
printf("mesg=%s &mesg=%p value=%p\n",mesg,&mesg,mesg);
printf("copy=%s ©=%p value=%p\n",copy,©,copy);
return 0;
}
第二项显示两个指针的地址即指针mesg和copy分别储存的地址
最后一项显示两个指针的值即它们的储存地址,相同就说明它们都指向同一个位置
所以说明,并没有拷贝数组
下面的话,我们就要学习字符串函数喽