C 字符串 数组

来源:互联网 发布:mac怎么换桌面壁纸 编辑:程序博客网 时间:2024/06/05 04:02

一、 字符数组的初始化
  字符数组可以在定义时进行初始化.有两种初始化方法.
 
  方法1:逐个字符赋给数组中各元素.这种方法最容易理解
  (1)如果大括号内提供的初值个数(即字符个数)大于数组长度,则编译时将出错.
  如果初值个数小于数组长度,则只将这些字符赋给前面的数组元素,其余的元素自动赋空字符(即'\0')
   char c[5]={ 'H','a','p','p','y' }; //把5个字符分别赋给c[0]至c[4].
   char c[10]={ 'h','e','l','l','o' }; 
   --------------------------------------------------------------------------------
  c[0]=h ,   c[1]=e ,   c[2]=l ,     c[3]=l ,    c[4]=o
  c[5]=\0,   c[6]=\0,   c[7]=\0,   c[8]=\0,   c[9]=\0
   --------------------------------------------------------------------------------

  (2)如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值字符个数决定数组大小
    char c[]={ 'p','r','o','g','r','a','m' };
    char trinangle[3][5]={ { ' ',' ','o' },{ ' ','o','o','o' },{ 'o','o','o','o','o' } };
   
  方法2:用字符串常量来给字符数组初始化
   char c[]={"Good idea"};
    等价于 char c[]={ 'G','o','o','d',' ','i','d','e','a','\0' };
    不等价于 char c[]={ 'G','o','o','d',' ','i','d','e','a' };
    前者长度为10,后者长度为9.
    '\0'代表ASCII码为0的字符,它是一个"空操作符",即使什么也不 做.C语言用它来作为字符串结束标志,作用是便于测定字符串的实际长度,
    例如有一个字符串,其中第10个字符为'\0'则此字符串的有效字符为9个.也就是说,在遇到字符'\0'时,表示字符串结束,由它前面的字符组成字符串实际长度.
  strlen与sizeof区别:http://blog.csdn.net/dy_learning/article/details/6269388

   C语言允许在初始化一个一维字符数组时,省略字符串常量外面的大括号.例如:
  char c[]={ "I love China" };
  可直接写成:
  char c[]="I love China";

  初始化
     将数组每一项初始化为0
   char a[10] = {0};
   char c[51]; memset(c,0,sizeof(c));
  
二、拷贝  
 memcpy一次读取所有源数据,然后一次传到目标地址,速度快。
 strcpy需要逐个字符判断是否结束符,是一次读一个字节,比memcpy慢。
 sprintf可能会有检测输出格式的步骤,所以可能更慢。  
 
 int a[10];
 int b[10]={0,1,2,3,4,5,6,7,8,9};
 memcpy(a,b,10*sizeof(int));

三、其他
(1)怎样将字符数组 转换为字符指针
 char bb[]={1,2,3,4,5};
 char *p=bb;

(2)

char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什么错?
"AAA"是字符串常量。s是指针,指向这个字符串常量(指向字符串的首地址),所以声明s的时候就有问题。
cosnt char* s="AAA";
然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

s现在指向静态存储区,p未重新赋值前,任何对p指向内容的修改都会引发运行时错误 

(3)
用两种方法传递参数,一种可以,一种却不可以,麻烦高手指点是为什么的呢?
char test[16] = "110";
char *ptest = test;
.....
int funtion(char *ptest)


char *ptest = "110";
.....
int funtion(char *ptest)
 
解析:
首先对于字符串直接量,比如这里的"110",编译器编译后会将它们放入只读节中:
.section .rdata,"dr"
LC1:
.ascii "110\0"
.text
这样在运行该程序时,会将只读节映射到只读的段中。如果运行时更改只读段中的数据,则会出现“一般保护性异常”,通常程序会abort。
再说char *ptest = "110"; 要先搞清楚=两边的类型,左边是一个char*类型的指针,右边是一个字符串常量,它所代表的类型是char const*, char const*是不能直接赋值给char*的,如果你用gcc编译器,会出现一个警告:
warning: deprecated conversion from string constant to 'char*'
这就像C++中,const& 不能赋值为非const&一样。不过编译器没有把它当成一个错误,而是一个警告。这时ptest就指向了处于只读节中的数据。
再看看char test[16] = "110";这代表什么呢? test[16]是个char类型的数组,这条代码的作用是将处于只读节中的数据copy到了一份在test[16]数组中了。

你的函数原型是funtion(char s[]),实际上对于编译器而言,它等价于function(char* s),如果形参或实参是数组,它都会转化为指针。当你这样调用function(test)时,实参test是一个数组类型,这时它会退化成char*传递过去。
#######################################################

1、数组拷贝

2、函数 传参

3、函数返回

原创粉丝点击