字符数组初始化

时间:2022-09-21 19:51:23

在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) char str[10]="";
(2) char str[10]={'\0'};
(3) char str[10]; str[0]='\0';

第(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。

                                         完