字符串与其声明

一、定义

1、字符串

        字符串是以空字符(\o)结尾的char数组。

2、字符串常量

        字符串常量是指位于一对双引号之中的任何字符,双引号里的字符加上编译器自动提供的结束标志\0字符,作为一个字符串存储在内存中。字符串常量属于静态存储类。

PS.静态存储类:若在一个函数中使用字符串常量,即使多次调用了这个函数,这个字符串在整个程序运行的过程中只存储了一次,整个引号中的内容作为指向字符串存储位置的指针。

二、字符串的声明。

1、普通字符串的声明

(1)、以数组形式声明。

const Char heart[15]=”i love tillie!”;

        指定数组大小时,一定要确保数组元素数比字符串长度至少多1,未被使用的元素自动初始化为0。数组的大小必须是整形常量,而不是运行时得到的变量。

(2)、以指针形式声明。

Char *head=”i love millie!”;

        其作用和char head[]相同。

(3)说明。

        说明:若字符串之间没有间隔或者间隔是空格,ANSIC会将其串联起来。例如:

Char greeting[50]=”Hello,and” “how are” “you” “today”;

Char greeting[50]=”Hello,and how are you today”;

        以上两者是相等的。若想在字符串中使用双引号,可以在双引号前加上反斜线。

2、数组和指针声明的区别。

        以下列程序进行分析:

Char heart[]=”i love tillie!”;
Char *head=”i love millie!”;

数组指针
类型heart是地址常量,不能更改

head是个变量

标识下一个元素

可使用heart+1来标识下一个元素,但是不能++heart.。

可使用heart+1来标识下一个元素,也可以用++heart.。
赋值不允许用指针给常量赋值。

可以用常量名给指针赋值,head=heart。

存储

数组初始化就是从静态存储区把一个字符串复制给数组。

针初始化只复制字符串的地址

更改元素

heart是常量,但是数组中的元素是变量,因此可以改变heart中存储的信息,方法是访问单个数组元素:heart[7]=’M’;或者*(heart+7)=’M’。

不允许用指针进行这样的操作,因为存储方式不同,因此初始化一个指向字符串文字的指针时使用const修饰符。

共同点:两者都可以使用数组符号和指针运算符。

3、字符串数组。

(1)、以指针形式建立字符串数组。

const char *shuzu[5]={“Adding numbers swiftly”,
                        “Multiplying accurately”,
                        “Stashing data”,
                        “following instructions to the letter”,
                        “understanding the c language”};

        shuzu是一个由五个指向char的指针组成的数组。也就是说,mytal是个一维数组,而且数组里的每一个元素都是一个char类型的地址。第一个指针是shuzu[0],它指向第一个字符串的第一个字符。第二个指针是shuzu[1],它指向第二个字符串的开始。

        mytal实际上不存放字符串,只存放字符串的地址(字符串存在程序用来存放常量的那部分内存中)。shuzu[0]就是第一个字符串,*shuzu[0]==shuzu[0][0]是第一个字符串的第一个字符。

(2)、以二维数组的形式建立字符串数组。

Char shuzu_2[5][81];

        这里的shuzu是一个5个元素的数组,每一个元素本身又是一个81个char的数组。在这种情况下,字符串本身也存储在数组里。

(3)、两者的区别

        a、二维数组建立了一个所有行的长度都相同的矩形数组,但是指针数组建立的是不规则数组,每一个长度都由初始化字符串决定,不浪费任何存储空间。

        b、shuzu和shuzu_2的类型不同,shuzu是指向char的指针数组,存放5个地址;但shuzu_2是char数组的数组,存放5个完整的字符数组。

4、指针和字符串        

int main(void)
{
    char *mesg="don't be a fool!";
    char *copy;
    
    copy=mesg;
    printf("%s  %p  %p\n",mesg,&mesg,mesg);
    printf("%s  %p  %p\n",copy,&copy,copt);
    return 0;
}

输出结果:don't be a fool!  0x0012ff48  0x0040a000
         don't be a fool!  0x0012ff44  0x0040a000

        &copy输出的是指针的地址,%p是输出地址的转义字符。最后一项是指定指针的值,指针的值是指针中存放的地址,也由此看出字符串没有被复制,只是产生指向同一个字符串的第二个指针。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值