前言:2017年第一篇博客,祝大家新年快樂!!
1.數組在內存中的分布

我們來分析為什么a[0]=3?在C++中我們知道數組b中的最大下標角為9,當我們賦值給b[10]時,即使在數組b中下標10已經越界,但是
編譯器還是會留存四個字節的地址給b[10]存放數值3,而a[0]的數組的存放地址恰恰是b[10]的存放地址,這也是a[0]為什么是3的原因了。
那我們怎么解決這一問題了?C++不同于java,如在java中這么寫程序必然會報錯,這是因為超出邊界的數組無法通過編譯。要在C++中
避免這種尷尬的局面,只好由程序員謹慎的規范。
2.數組名與函數


我們知道數組在定義的時候系統會自動創建一個指向該數組的指針,并且該指針自動指向該數組的第一個元素。
從上面我們可以看到,在main函數中我們其實操作的就是x[2]中的內存地址中的值。
3.枚舉常量
定義:把變量的值一一列舉,變量的值只能取其中的一個。
形式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.枚舉元素是常量,不是變量,所以不能對枚舉元素進行賦值;
3.枚舉元素是常量,其常量值不是列舉的“內容”,而是定義時的次序號:0,1,......,n;
4.枚舉元素值在定義時可以人為指定;
5.枚舉變量的值只能取定義枚舉類型時所列舉的元素之一;
6.盡管枚舉元素有值,但是此值并不是整型值,所以不能把整型數賦值給枚舉變量;
7.枚舉元素不是字符串,可進行邏輯判斷比較運算。
4.strcat等系列函數表達的意義
%20
%20 %204.1%20 strcat函數:是string%20catenate的縮寫,即字符串連接。
字符串連接之后數值保存在第一個數組中,第二個保持不變。
我們需要注意的是:
1.第一個數組的字符長度要比第二個大,不然會報錯誤。
2.每個字符串結尾處都有一個結束標志“/0”。當通過strcat函數連接起來的時候,連接的字符串結尾處也有一個
結束標志“/0”,它是第2個字符串的,而第1個字符串的結束標志則自動取消。
4.2 strcpy函數:是string copy的縮寫,即字符串復制。
從src地址開始且含有null結束符的字符串復制到以dest地址開始的字符串中,并返回指向dest的指針。通俗的講就是將 src字符數組復制到dest數組中,如果dest數組本身有數據,會把src里的數據全部復制到dest中,如果dest中有數據小于src地址長度的將會被覆蓋,而大于src長度的將保留
說明:dest的地址長度要足夠大,不然會產生溢出。Dest的內存長度要大于等于src的內存長度。
例子1.利用字符數組
#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里面的字符串復制到str1數組中Cout<<str1<<endl}輸出結果是abcdef;
4.3 strcmp函數:是string compare的縮寫,即字符串比較。
比較兩個字符串。設這兩個字符串為str1,str2,若str1=str2,則返回零;若str1>str2,則返回正數;若str1<str2,則返回負數。
原型:extern int strcmp(const char *s1,const char * s2);所在頭文件:string.h功能:比較字符串s1和s2。一般形式:strcmp(字符串1,字符串2)說明:當s1<s2時,返回為負數當s1=s2時,返回值= 0當s1>s2時,返回正數即:兩個字符串自左向右逐個字符相比(按ASCII值大小相比較),直到出現不同的字符或遇'/0'為止。如:"A"<"B" "a">"A" "computer">"compare"特別注意:strcmp(const char *s1,const char * s2)這里面只能比較字符串,不能比較數字等其他形式的參數。4.4 strlen函數:是string length的縮寫,即字符串長度。
功能:計算字符串s的(unsigned int型)長度
說明:返回s的長度,不包括結束符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; } 下面給大家提供幾種實現strlen函數的源代碼,供大家參考: -------------------------------------------------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----------------------------------------簡單的總結一下:
以上各種實現的方式都是大同小異的,有的用的是變量,有的用的是指針。
其中,最后一個用的是遞歸的方式。其實,在實現庫函數的時候,是規定不可以
調用其他的庫函數的,這里只是給大家一個方法,不用變量就可以實現strlen。
新聞熱點
疑難解答
圖片精選