前言:2017年第一篇博客,祝大家新年快樂??!
1.數(shù)組在內(nèi)存中的分布

我們來分析為什么a[0]=3?在C++中我們知道數(shù)組b中的最大下標(biāo)角為9,當(dāng)我們賦值給b[10]時(shí),即使在數(shù)組b中下標(biāo)10已經(jīng)越界,但是
編譯器還是會(huì)留存四個(gè)字節(jié)的地址給b[10]存放數(shù)值3,而a[0]的數(shù)組的存放地址恰恰是b[10]的存放地址,這也是a[0]為什么是3的原因了。
那我們?cè)趺唇鉀Q這一問題了?C++不同于java,如在java中這么寫程序必然會(huì)報(bào)錯(cuò),這是因?yàn)槌鲞吔绲臄?shù)組無法通過編譯。要在C++中
避免這種尷尬的局面,只好由程序員謹(jǐn)慎的規(guī)范。
2.數(shù)組名與函數(shù)


我們知道數(shù)組在定義的時(shí)候系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)指向該數(shù)組的指針,并且該指針自動(dòng)指向該數(shù)組的第一個(gè)元素。
從上面我們可以看到,在main函數(shù)中我們其實(shí)操作的就是x[2]中的內(nèi)存地址中的值。
3.枚舉常量
定義:把變量的值一一列舉,變量的值只能取其中的一個(gè)。
形式1:
[cpp] view plain copy例子:[cpp] view%20plain copy#include <iostream> using namespace std; enum city {beijing, shanghai, shandong, guangzhou=7, tianjin}; void fn(enum city c) { switch(c) { case 0:cout << "beijing/n" << endl;break; case 1:cout << "shanghai/n" << endl;break; case 2:cout << "shandong/n" << endl;break; case 7:cout << "guangzhou/n" << endl;break; case 8:cout << "tianjin/n" << endl;break; default :cout << "非法城市!/n" << endl;break; } } int main() { enum city c1, c2, c3, c4; c1 = (enum city)2; c2 = shandong; c3 = beijing; c4 = (enum city)4; fn(c1); fn(c2); fn(c3); fn(c4); cout << c1 << " " << c2 << " " << c3 << " " << c4; return 0; } 枚舉常量的使用說明:
1.先定義枚舉類型,在定義枚舉常量,然后使用枚舉常量;
2.枚舉元素是常量,不是變量,所以不能對(duì)枚舉元素進(jìn)行賦值;
3.枚舉元素是常量,其常量值不是列舉的“內(nèi)容”,而是定義時(shí)的次序號(hào):0,1,......,n;
4.枚舉元素值在定義時(shí)可以人為指定;
5.枚舉變量的值只能取定義枚舉類型時(shí)所列舉的元素之一;
6.盡管枚舉元素有值,但是此值并不是整型值,所以不能把整型數(shù)賦值給枚舉變量;
7.枚舉元素不是字符串,可進(jìn)行邏輯判斷比較運(yùn)算。
4.strcat等系列函數(shù)表達(dá)的意義
%20
%20 %204.1%20 strcat函數(shù):是string%20catenate的縮寫,即字符串連接。
字符串連接之后數(shù)值保存在第一個(gè)數(shù)組中,第二個(gè)保持不變。
我們需要注意的是:
1.第一個(gè)數(shù)組的字符長度要比第二個(gè)大,不然會(huì)報(bào)錯(cuò)誤。
2.每個(gè)字符串結(jié)尾處都有一個(gè)結(jié)束標(biāo)志“/0”。當(dāng)通過strcat函數(shù)連接起來的時(shí)候,連接的字符串結(jié)尾處也有一個(gè)
結(jié)束標(biāo)志“/0”,它是第2個(gè)字符串的,而第1個(gè)字符串的結(jié)束標(biāo)志則自動(dòng)取消。
4.2 strcpy函數(shù):是string copy的縮寫,即字符串復(fù)制。
從src地址開始且含有null結(jié)束符的字符串復(fù)制到以dest地址開始的字符串中,并返回指向dest的指針。通俗的講就是將 src字符數(shù)組復(fù)制到dest數(shù)組中,如果dest數(shù)組本身有數(shù)據(jù),會(huì)把src里的數(shù)據(jù)全部復(fù)制到dest中,如果dest中有數(shù)據(jù)小于src地址長度的將會(huì)被覆蓋,而大于src長度的將保留
說明:dest的地址長度要足夠大,不然會(huì)產(chǎn)生溢出。Dest的內(nèi)存長度要大于等于src的內(nèi)存長度。
例子1.利用字符數(shù)組
#include<iostream> Using namespace td;#include<string.h> Int mian(int argc, _TCHAR* argv[]){ Char str1[8];Char str2[6]=”abcdef”;Strcpy(str1,str2);//將str2里面的字符串復(fù)制到str1數(shù)組中Cout<<str1<<endl}輸出結(jié)果是abcdef;
4.3 strcmp函數(shù):是string compare的縮寫,即字符串比較。
比較兩個(gè)字符串。設(shè)這兩個(gè)字符串為str1,str2,若str1=str2,則返回零;若str1>str2,則返回正數(shù);若str1<str2,則返回負(fù)數(shù)。
原型:extern int strcmp(const char *s1,const char * s2);所在頭文件:string.h功能:比較字符串s1和s2。一般形式:strcmp(字符串1,字符串2)說明:當(dāng)s1<s2時(shí),返回為負(fù)數(shù)當(dāng)s1=s2時(shí),返回值= 0當(dāng)s1>s2時(shí),返回正數(shù)即:兩個(gè)字符串自左向右逐個(gè)字符相比(按ASCII值大小相比較),直到出現(xiàn)不同的字符或遇'/0'為止。如:"A"<"B" "a">"A" "computer">"compare"特別注意:strcmp(const char *s1,const char * s2)這里面只能比較字符串,不能比較數(shù)字等其他形式的參數(shù)。4.4 strlen函數(shù):是string length的縮寫,即字符串長度。
功能:計(jì)算字符串s的(unsigned int型)長度
說明:返回s的長度,不包括結(jié)束符NULL。
舉例:
// strlen.c #include <syslib.h> #include <string.h> main() { char *s="Golden Global View"; clrscr(); PRintf("%s has %d chars",s,strlen(s)); getchar(); return 0; } 下面給大家提供幾種實(shí)現(xiàn)strlen函數(shù)的源代碼,供大家參考: -------------------------------------------------1:start------------------------------------ #include <stdio.h> #include <assert.h> typedef unsigned int u_int; u_int Mystrlen(const char *str) { u_int i; assert(str != NULL); for (i = 0; str != '/0'; i++); return i; } ------------------------------------------------1:end-------------------------------------- -------------------------------------------------2:start-------------------------------------- int strlen(const char *str) { assert(str != NULL); int len = 0; while((*str++) != '/0') len++; return len; } ------------------------------------------------2:end ------------------------------------------ ------------------------------------------------3:start------------------------------------------ int strlen(const char *str) { assert(str); const char *p = str; while(*p++!=NULL); return p - str - 1; } -------------------------------------------------4:end----------------------------------------- -------------------------------------------------5:start---------------------------------------- int strlen(const char *str) { assert(str); const char *p = str; while(*p++); return p - str - 1; } -----------------------------------------------6:end----------------------------------------簡單的總結(jié)一下:
以上各種實(shí)現(xiàn)的方式都是大同小異的,有的用的是變量,有的用的是指針。
其中,最后一個(gè)用的是遞歸的方式。其實(shí),在實(shí)現(xiàn)庫函數(shù)的時(shí)候,是規(guī)定不可以
調(diào)用其他的庫函數(shù)的,這里只是給大家一個(gè)方法,不用變量就可以實(shí)現(xiàn)strlen。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注