蘇寧面試題,筆試題回顧
指標的優點:
方便好用,可以有效的對變數進行底層操作,直接操作變數的地址。非常好用,使程式碼變的更簡潔。
常用於:
引數傳遞,在子函式中,修改傳遞進來的引數的值(而不是他的拷貝的值),必須傳遞指標,還有引用。
動態記憶體分配,有時候我們不可能知道我們到底要多少個變數,這時候我們就需要來動態的建立變數,就需要指標。
設計資料結構,資料結構是離不開指標的,無論是連結串列,樹還是圖。
指標的初始化,如果定義了一個指標,但是沒有初始化的話,那麼該指標可能是任意值,所以沒有初始化的指標是極為不安全的
①,資料傳遞時,如果資料塊較大,這時候可以使用指標傳遞地址而不是實際資料,即提高了傳輸速度又節省了大量記憶體。
②,資料轉換,利用指標靈活的型別轉換,可以用來做資料型別轉換
③,字串指標,使用最方便切最常用的。
④,函式指標,可以用在大量分支處理的例項中,建立一個函式指標資料,進行散轉。
⑤,在資料結構中,連結串列,樹,圖都離不開指標。
C++中字串和字元陣列的區別
字串可以用字元陣列與字串變數兩種方式來儲存,效果類似。
一、用字元陣列來儲存字串:
char st1[100],st2[100] ; //字元陣列說明
cin>>st1>>st2;
long a,b;
輸入:hello, world
則st1={‘h’,’e’,’l’,’l’,’o’,’,’,’\0’}
st2={‘w’,’o’,’r’,’l’,’d’,’\0}
字元’\0’為字串結束標誌
1. 字元陣列長度
strlen(st1);
//如a=strlen(st1);b=strlen(st2); 則a=6,b=5
2. 字元陣列比較
不能直接比較,st1>st2是錯誤的,要用strcmp()函式
strcmp(st1,st2);
//st1=st2相等則輸出0,st1<st2輸出-1,st1>st2輸出1
strncmp(st1,st2,n); 把st1,st2的前n個進行比較。
3. 連線字元陣列
不能直接用st1=st1+st2;用strcat()函式
strcat(st1,st2);
//將st1和st2連線後賦給st1,本例連線後st1為”hello,world”
strncat(st1,st2,n); n表示連線上st2的前n個給st1,在最後不要加'\0'。
4. 替換
strcpy(st1,st2); //用st2的值替換st1的值,字元陣列不能如此賦值st1=st2或st1[]=st2[]都是錯誤的
本例中st1值被替代為”world”
strncpy(st1,st2,n);
n表示複製st2的前n個給st1,在最後要加'\0'。
5. 其他函式
strchr(st1,ch) //ch為要找的字元。如strchr(st1,’e’);會截取出st1中以字母’e’開頭的字串,要用string型別的來儲存,如string c1; c1=strchr(st1,’e’); 則c1為”ello”
strspn(st1,st2);
//返回st1起始部分匹配st2中任意字元的字元數。本例中”hello,”中的第一個字元’h’不能在”world”中找到匹配字元,因此返回值為0。如st1=”rose”;st2=”worse”;則返回值為4,因為rose在worse中都能找到匹配字元。
strrev();
//顛倒字串
二、用字串來儲存字串
string str1,str2; cin>>str1>>str2;
//如輸入“hello, world”則str1=”hello,” str2=”world”
可直接賦值: str1=str2;
1. 字串長度
len
= str1.length();
2. 字串比較
可以直接比較,即str1>str2;str1==str2;等
3. 連線
可以直接連線,即str1
+= str2;等
4. 字串提取
str2
= str1.substr(); //str2值被賦值為str1
str2
= str1.substr(pos1); //如str2=str1.substr(2);則str2=”llo”;
str2=str1.substr(pos1,len1);
//提取指定位置指定長度的字串,如str2=str1.substr(1,2) ;則str2=”el”
5. 字串搜尋
where
= str1.find(str2); //返回str2是在str1中的最先被找到的位置
where
= str1.find(str2,pos1); pos1是從str1的第幾位開始。
where
= str1.rfind(str2); 從後往前搜。
6. 插入字串
不是賦值語句。
str1.insert(pos1,str2);
//如str1.insert(2,str2)則str1=”heworldllo,”
str1.insert(pos1,str2,pos2,len2);
str1.insert(pos1,numchar,char);
numchar是插入次數,char是要插入的字元。
7. 替換字串
str1.replace(pos1,str2);
str1.replace(pos1,str2,pos2,len2);
8. 刪除字串
str.erase(pos,len)
str.clear();
9. 交換字串
swap(str1,str2);
注意:1.要包含標頭檔案#include<cstring>
2.在有些場合下用字元陣列char st1[100]比string st2還好用些,可根據具體情況作不同選擇。
3.在讀入一個含有空格的字串時用cin是不行的(cin讀字串或字元陣列時,自動以空格或回車作為分格符
字串陣列和指標的初始化的區別:
char amessage[] = "now is the time"; /* an array */
char *pmessage = "now is the time"; /* a pointer */
陣列的內容是可變的,但是地址是始終不變的;指標p**中的內容是不可變的(不能被修改,是常量),但地址可變。
char astr[]="aaa"//這是個字元陣列,只含有3個字元
char *pstr="aaa"//這是個字串,含有4個字元,3個字元加一個'\0'
輸出的結果strlen()長度都是3,strlen()計算字串的長度,忽略結束符'\0'
①,字串要比字元陣列多一個空間,用來存放結束符'\0'
②,字元陣列是不用存放\0的,所以分配的字元位數,只要strlen(p)就行,不用加1.
用字元陣列,和字元指標變數,都可以實現字串的儲存和運算。
區別:1,字串指標變數本身是一個變數,用於存放字串的首地址,而字串本身也是存放在以該首地址為首的一塊連續的記憶體空間中,並以'\0'作為串的結束。字元陣列由若干個陣列元素組成,可以用來存放整個字串。
字串型別:
使用string類,必須包含標頭檔案,<string>
string st("aaa")
返回長度:st.size()
string st2
堅持是否為空:st2.empty()
複製字串:st2(st)
st2=st
比較是否相等:if(st2==st)
將兩個字串連線成一個字串:string st3=st2+st1;
st1+=st2;直接加到第一個上
C常用字串函式:
str系列
①char * strtok(char * s,const char *delim)
分解字串為一組標記串。s為要分解的字串,delim為分隔符字串。
第一次呼叫時,strtok必須給與引數s字串,往後的呼叫則將引數置換成NULL。每次呼叫成功則返回被分割成片段的指標。當沒有被分割的串時候返回NULL.
②char * strstr(const char * str1,const char *str2)
從字串str1中,尋找str2第一次出現的位置,不比較結束符NULL,沒有找到則返回NULL
③char * strchr(const char *str,char ch)
查詢字串str中首次出現字元ch的位置。返回首次出現ch位置的指標,如果str中不存在ch,則返回NULL。
④char * strcpy(char * dest,const char *src)
把src所指由NULL結束的字串複製到dest所指的陣列中。src和dest所指記憶體不能重疊,且dest有足夠的空間來容納src的字串。返回指向dest結尾處字串的指標。
⑤char * strcat(char * dest,const char *src)
功能:把src所指的字串新增到dest結尾處。(覆蓋dest結尾處的\0)並新增新的\0
說明:src和dest所指內吋區域不可重疊,切dest必須有足夠的空間來容納src的字串。返回指向dest的指標。
⑥int strcmp(const char * str1,const char * str2)
功能:比較字串str1,和str2
當s1<s2時,返回<0.
s1=s2時,返回=0
s1>s2時,返回>0
7,size_t strlen(const char *str)
計算str的長度,不包括結束符NULL。
mem系列:
①void * memset(void * ptr,char value,size_t num)
功能:把ptr所指記憶體區域的前num個位元組設定成字元value。返回指向ptr的指標,可用於變數的初始化等操作。
3.memcpy
void * memcpy ( void * destination, const void * source, size_t num );
類似 strncpy。區別:拷貝指定大小的記憶體資料,而不管內容(不限於字串)。
關係資料庫的幾種設計正規化介紹 1、第一正規化(1NF) 在任何一個關係資料庫中,第一正規化(1NF)是對關係模式的基本要求,不滿足第一正規化(1NF)的資料庫就不是關係資料庫。 所謂第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(1NF)中表的每一行只包含一個例項的資訊。例如,對於圖3-2 中的員工資訊表,不能將員工資訊都放在一列中顯示,也不能將其中的兩列或多列在一列中顯示;員工資訊表的每一行只表示一個員工的資訊,一個員工的資訊在表中只出現一次。簡而言之,第一正規化就是無重複的列。 2、第二正規化(2NF) 第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。第二正規化(2NF)要求資料庫表中的每個例項或行必須可以被唯一地區分。為實現區分通常需要為表加上一個列,以儲存各個例項的唯一標識。如圖3-2 員工資訊表中加上了員工編號(emp_id)列,因為每個員工的員工編號是唯一的,因此每個員工可以被唯一區分。這個唯一屬性列被稱為主關鍵字或主鍵、主碼。 第二正規化(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上一個列,以儲存各個例項的唯一標識。簡而言之,第二正規化就是非主屬性非部分依賴於主關鍵字。 3、第三正規化(3NF) 滿足第三正規化(3NF)必須先滿足第二正規化(2NF)。簡而言之,第三正規化(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字資訊。例如,存在一個部門資訊表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等資訊。那麼在圖3-2的員工資訊表中列出部門編號後就不能再將部門名稱、部門簡介等與部門有關的資訊再加入員工資訊表中。如果不存在部門資訊表,則根據第三正規化(3NF)也應該構建它,否則就會有大量的資料冗餘。簡而言之,第三正規化就是屬性不依賴於其它非主屬性。