在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。
一、字符数组
1.一般方法字符数组初始
char parr[] = "zifuchuanshuzu";
char charr[] = { 'z','i','f','u','c','h','u','a','n','s','h','u','z','u' };
这是字符数组初始化的两种方式,但是这两种方式其实是不等价的;他们的数组长度不同。
char szBuffer[1024] = {0}; char szBuffer[1024] = {_T('\0')};
以上两种方法是等价的,均是将字符数组szBuffer初始化为空字符串。
因为'\0'是字符串的结束标志,其ASCII码为0。
然而char szBuffer[1024] = {'0'};
则是将字符数组初始化为字符'0'。
在C语言编程中,当我们声明一个字符串数组的时候,常常需要把它初始化为空串。总结起来有以下三种方式:
第(1)(2)种方式是将str数组的所有元素都初始化为'\0',而第(3)种方式是只将str数组的第一个元素初始化为'\0'。如果数组的size非常大,那么前两种方式将会造成很大的开销。
所以,除非必要(即我们需要将str数组的所有元素都初始化为0的情况),我们都应该选用第(3)种方式来初始化字符串数组。
2.字符操作函数
char szBuffer[1024];
ZeroMemory(szBuffer,1024);
ZeroMemory(szBuffer,size0f(szBuffer));
char szBuffer[1024]; memset(szBuffer, 0, 1024); memset(szBuffer, 0, sizeof(szBuffer));
(1)ZeroMemory
声明:void ZeroMemory( PVOIDDestination,SIZE_T Length );
参数:Destination :指向一块准备用0来填充的内存区域的开始地址。
Length :准备用0来填充的内存区域的大小,按字节来计算。
返回值:无
作用:ZeroMemory只是将指定的内存块清零。
(2)memset
需要的头文件 <memory.h> or <string.h>
函数原型:void *memset(void *s, int ch, unsigned n); void *memset(void *s, int c, size_t n);
作用:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
ZeroMemory和memset的区别:
(1)ZeroMemory是微软的SDK提供的,memset是属于CRun-time Library提供的。因此ZeroMemory只能用于Windows系统,而memset还可用于其他系统。
(2)ZeroMemory是一个宏,只是用于把一段内存的内容置零,内部其实是用 memset实现的,而memset除了对内存进行清零操作,还可以将内存置成别的字符。
(3)如果程序是Win32程序而且不想连接c运行时库,就用ZeroMemory;如果需要跨平台,就用memset。
所以,如果ZeroMemory和memset用于清零操作,其本质是一样的。
3.省略数组大小
有初始化的数组定义可以省略方括号中的数组大小。
例如,下面的代码中数组定义为5个元素:
int a[]={2,4,6,8,10};
编译时必须知道数组的大小。通常,声明数组时方括号内的数字决定了数组的大小。有初始化的数组定义又省略方括号中的数组大小时,编译器统计花括号之间的元素个数,以求出数组的大小。
例如,下面的代码产生相同的结果:
static int a1[5]={1,2,3,4,5};
static int a2[]={1,2,3,4,5};
让编译器得出初始化数组的大小有几个好处。它常常用于初始化一个元素个数在初始化中确定的数组,提供程序员修改元素个数的机会。
在没有规定数组大小的情况下,怎么知道数组的大小呢?用sizeof和for
staticint a[]={1,2,4,8,16};
for(int i=0; i<(sizeof(a)/sizeof(int)); i++)
cout <<a[i] <<"";
在定义数组的场合,无论如何,编译器必须知道数组的大小。
二、字符指针
在C语言中我们也可以使用字符指针来存储字符串。
char* str="zifuchuanshuzu";
C语言对字符串常量是按照字符数组来处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时,只是把字符串首地址赋值给str。
输出:
printf("%s\n",str);
系统首先输出str指向的字符,而后自加1,直至遇到’\0’;与数组的输出方式相同。
字符指针的赋值
char *str; str="zifuzhizhen";
对于字符指针这种赋值方式是正确的。与字符数组不同。
总结:
c中字符数组初始化有:字符数组、字符指针。
1.字符数组:
(1)
char str[10] = "";
char str[10] = {0};
char str[10] = {'\0'}
//上面三种效果相同
char str[10]; str[0] = '\0'; //只将str数组的第一个元素初始化为'\0'
(2)
函数操作:ZeroMemory和memset
2.字符数组
C语言对字符串常量是按照字符数组来处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时,只是把字符串首地址赋值给str。
完