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、函数返回
- C 字符串 数组
- C:数组与字符串
- C 字符串数组排序
- C数组和字符串
- c数组,字符串相加
- C数组与字符串
- 字符串,字符数组(c/c++)
- 关于C语言字符串数组
- C语言字符串、字符数组
- Objective-c 字符串 数组 转换
- objective c 字符串处理 ,数组
- C 字符数组和字符串
- C语言--数组与字符串
- c语言数组与字符串
- C语言之数组、字符串
- C语言------数组和字符串
- C语言 数组和字符串
- C语言之字符串,数组
- 使用easyui创建tabs组件和动态添加
- 恢复matlab文件关联
- 解决ClickOnce签名过期问题
- java 解析XML
- 采用帮助类的方式更改管理界面网格数据后刷新
- C 字符串 数组
- 数据在SQLLDR的时候提示错误,在逻辑记录结束之前未找到列(使用 TRAILING NULLCOLS)
- PHP扩展应用
- 棋软引擎测试
- 只使用一次的代码,private的构造函数
- 【转】Apache Http Server与Tomcat实现负载均衡和集群
- 卡诺图
- VC++对话框程序打印及打印预览的实现
- 学习struts2建bbs总结一:用powerdesigner建数据库并自动生成测试数据