字符数组 元素是单个单个的字符 char cdata[ ] ={ ' a ', 'b' , 'c' ,'d' , 'e' }; 字符串 末尾隐藏 ' \0 ' char cada[ 100 ] ={ ' \ 0 ' }; 置0 表达式1 char cdata [ 12 ] ="mydm sz "; 表达式2 char *pchar ="mydm sz"; 表达式1与2的区别在于 : 1中cdata是地址变量,可以修改对应的字符串里的单个字符内容 2中 pchar是地址常量,字符串是个整体,无法被修改,只有整体概念,无单个字符概念 表达式1与2的区别在于: sizeof( p ) 在os中一个地址8位/4位 sizeof(cdata) 数组的所有空间 strlen(cdata)有效数据的空间
字符串相关操作: char cdata [ 128 ] ={ ' \0 ' }; scanf( " %s " , cdata ); char *pchar = "mydm sz" ; puts(pchar) ; putchar( ' A ' ); puts(" Done! " ) ;
表达式1下的sizeof和strlen char cdata[ 121 ] ="mydmsz"; sizeof 标识符 数组开辟的总空间大小 strlen函数 数组开辟的有效数据的空间大小 常见的API函数 < stdblib.h >
1.malloc函数
p =( void *)malloc(12) 在堆上开辟空间,使指针不野。
2.realloc在原本p的内存上开辟newlwn空间 char *p=( char *) malloc( num) ; int len= strlen("yyyyyyyyyyy "); int newlwn =len-num+1; realloc (p, newlen ) 换成情形1可以实现用户根据自己的输入开辟对应的空间,扩容对应的空间。
3.free函数
free ( p ) 清除malloc开辟空间,特别是已经成了悬空的内存空间
<string.h>
1.memset 字符串在情景1下才能这样用(用sizeof) char str[10]; memset(str, '\0', sizeof(str)); 在情景2下只能用单独的数字 p =( void *)malloc(12) memset( p, '\0' ,12或者num ) ; 2.strcopy ( strncopy ) 用后面的(其中几个字节)把前面覆盖 函数。指针1和指针2齐头并进。
strncmp while(*des && *src && ( *des=*src )&&count ) 进入if条件同理
若count大于元函数的大小 用count--耗尽,下面*des被赋结束标志后立即返回函数值bak,防止最下面*des被再次赋结束标志。
3.strcat 指针1先走,找到自己的\0之后,指针二的内容覆盖到\0上 ,两指针各自前行 最终出现两个结束\0标志,实际上上是一个\0,赋值后与while里的0比较不满足条件,指针不自增,即跳出条件的\0把原本被赋值的\0给覆盖了(用的是 (*a++=*b++)!='\0' )
另一种方式 借助strcopy(cdata+strlen(cdata) , p );
4.strcmp 比较函数 对应长度对应字符不相等时跳出 while(*des && *src && ( *des=*src ) ) while里有指针时,条件侧重' \0 ' 不满足条件 if(*des || *src ) 进入条件进行各自对应的相加,注意这之前需将指针归位
<assert.h>断言函数 assert(des!= NULL && src!=NULL ) 当条件不满足时,打印提示信息并将中指程序向下的运行
本章结的总要思想
1.(*a++=*b++ ) !=' \0' ; 自增运算第一位,但指针++放在所有操作进行完之后,即先两个解引用完,在进行赋值,在进行条件的判断,只有当前面的操作进行完之后,指针才会++
2.while中有指针时 '\0' 就是0,即不满足条件 while(*des);
3.while(*src)
{ *des =*src; 情况A des++; src++;
} *des ='\0';
情况B while( (*des++ =*src++) !='/0' ); *des='/0'; 看似两个结束标志,实则指针未移动,条件的结束标志把 *src赋给*des的结束标志 覆盖
if(des==NULL|| src==NULL){
return 0; }