对字符串和字符数组自己的理解

这几天看了很多关于字符串和字符数组方面的书与资料,下面自己来总结一下:

在C语言中,是没有字符串这个概念的(C++有),但是它又不得不去用到,怎么办呢?用字符数组来代替!

一、首先,先来说说字符数组的定义与初始化

字符数组的初始化有两种方式:且这两种方式等价!

①:char a[] = {'h','e','l','l','o','\0'};      //逐个赋值,这里要注意的是数组内
                                               //的元素不能超过数组的空间大小!通常可以省略数组长度!

②:char b[] = "hello";                         //整体赋值

二、给字符数组的赋值也是有讲究的

我们知道,定义一个变量的时候,可以在定义的时候直接初始化,也可以先定义,再给其赋值;

这里字符数组也是如此!

在给字符数组赋值的时候,可以单字符赋值的方式,例如;

char a[10];
char ch='a';
for( i=0;i<10;i++ )
     a[i]=ch+i ;                 //可通过数组下标引用数组元素,完成赋值
char *p;
for( p=a; p<a+10; p++ )
    *p=ch++;                     //通过指针对数组相应元素赋值

或者也可以使用字符串赋值的方式(使用string.h头文件中的字符串操作函数进行赋值),例如;

char a[];
strcpy(a,"hello");
sprintf(a,"%s","hello");

而不能用

char c[];                    c = "hello";   这样是错误的

 

数组在定义时,可以同时进行初始化,但定义完成后,就不能按初始化的形式对其赋值了,如:

char a[]="hello";     //这样可以

a="hello";             //这样是错误的!a是数组名,是一个静态数据:数组首地址值,可以看作是个常数,不能再被改变。

三、求字符数组的大小问题(求字符串长度的问题)

这个问题曾经也是困惑我许久的,现在写下来,让自己平时没事多看看!

首先要知道在实际应用中人们关系的更多的是有效字符串的长度,而不是字符数组的长度!因此,为了测定有效字符串的长度,即实际长度,C语言规定了一个“字符串结束标志”,以字符'\0'代表。在遇到第一个‘\0’是,字符串结束,由它前面的字符组成字符串!

系统对字符串常量也是自动加上一个'\0'作为结束符,例如;“hello”共有5个字符,但却在内存中占有6个字节,这就是因为包含了'\0'结束符(系统自主加的),这点也可以通过sizeof关键字可以验证!

有个'\0'结束符之后,在程序中往往检测'\0'的位置来检测字符串是否结束,而不是根据数组的的空间大小来决定字符串的长度!

而在这类问题中,遇见最多的便是sizeof运算符(关键字)和strlen函数了

sizeof与strlen是有着本质的区别的,其中之一,便是sizeof使用来求数据类型所占的空间大小,而strlen是用来求字符串的长度的,字符串以'\0'结尾!

(1)sizeof是C语言中的一个单目运算符,而strlen是一个函数,用来计算字符串的长度

(2)sizeof求的是数据类型所占空间的大小,而strlen是求字符串的长度

下面来看一个栗子:

#include <stdio.h>
#include <string.h>

int main()
{
	char a[] = "hello";
	char b[] = {'h','e','l','l','o'};
	char c[] = {'h','e','l','l','o','\0'};
	
	printf("%ld\n",sizeof(a));		    //6
	printf("%ld\n",strlen(a));		    //5
	
	printf("%ld\n",sizeof(b));	            //5
	printf("%ld\n",strlen(b));		    //因为没有加'\0'结束符,故长度不确定
	
	printf("%ld\n",sizeof(c));	            //6
	printf("%ld\n",strlen(c));	            //5
	
	return 0;
}
	

由此可以很清楚的看出来strlen函数求得是字符串的长度,是从第一个字符到找到结束符为止的,而字符串中是默认加了结束符'\0'的,因此可以用strlen测得数组a和数组b的长度,而数组b的长度就是不确定的,因为strlen找不到结束符!sizeof求得是类型空间的大小,而指针就是地址,地址的长度当前是由地址总线的位数决定的,当系统地址总线长度为32位时,占4字节;sizeof(a)、sizeof(b)、sizeof(c)求得是数组空间的大小,即数组所占内存空间的字节数,数组b是以单个元素赋值的,没有'\0'结束符,所以所占空间的大小为5字节!

四、字符串的表示形式

前面说的都是以字符数组的形式来表示字符串,那么还有别的方式来表示字符串吗?有!

在C语言中,有两种方式来表示和存放字符串!

①:用字符数组存放一个字符串

char a[] = "hello";

②:用字符指针指向一个字符串

char *str = "hello";

对于第二种表示方法,有人认为str是一个字符串变量,以为定义时把字符串常量"hello"直接赋给该字符串变量,这是不对的。
C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给str。
两种表示方式的字符串输出都用

printf("%s\n",str);

%s表示输出一个字符串,给出字符指针变量名str(对于第一种表示方法,字符数组名即是字符数组的首地址,与第二种中的指针意义是一致的),则系统先输出它所指向的一个字符数据,然后自动使str自动加1,使之指向下一个字符...,如此,直到遇到字符串结束标识符 " \0 "。

需要注意的是:

字符数组是由若干个元素组成的,每个元素里存放一个字符;字符指针里存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中!(是字符串的首地址)

说到这里就讲讲字符指针变量初始化与赋值
 

1、char *str = "hello";        //初始化

2、char *str;                  //赋值

   str = "hello";

这两种方式是等价的,对于字符数组的初始化,上面说的很详细,这里就不在重复了!

小结:

1、如果定义了一个字符数组,那么它有确定的内存地址;而定义一个字符指针变量时,因为并未指向某个确定的字符数据,因此可以多次赋值

2、char a[] = {'1','2','3','4','5','6'};

这种方法定义时,系统不会自动在字符串的末尾加上字符串结束符;此时用sizeof()函数可以正确求出其所占的内存大小;但用strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的。所以,采用该方法定义时,一般人为地加上\0,即char a[]={‘1’,’2’,’3’,’4’,’5’, ‘\0’}

3、无论是静态,局部还是全局数组只有在定义时才能初始话,否则必须通过其它方法,比如循环操作实现。

4、再用字符指针定义时:

只能采用字符串的方式来初始化即:char *a = "hello";

但是可以用字符串常量来进行初始化和赋值即:char *a; a = "hello"是可以的!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值