C语言指针 与字符串的学习
字符數組? ?元素是單個單個的字符? ? ? ? ? ? ? ? ? ? ? ? ?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;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
?
?
?
?
總結
以上是生活随笔為你收集整理的C语言指针 与字符串的学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop3 Hive Spark
- 下一篇: SqlServer Split功能函数