1. 程式人生 > >C語言學習(四)在學習C語言時遇到的一些細節方面的問題

C語言學習(四)在學習C語言時遇到的一些細節方面的問題

strlen與sizeof的區別: 
strlen用來求字串的長度用的(不算最後的NULL)而sizeof是用來求指定變數或者變數型別等所佔記憶體大小用的比如strlen("nihao")它的結果是5而sizeof(int)它的結果是4也就是說int型佔四個位元組。它與是不是字元無關。  
一維陣列的位元組=sizeof(變數或者變數型別)*陣列的長度 
二維陣列的位元組=sizeof(變數或者變數型別)*陣列的行長*陣列的列長  
scanf函式用空格、TAB、回車作為輸入資料的分隔符,因此該函式無法輸入帶分隔符的字串。例如:This is a dog結果是This 。字串的輸出是以\0為結束的。  
一個字串的輸入和輸出可以是printf(“%S”,c)scanf(“%s”,c)其中的c是陣列。 puts(str)、gets(str)輸入輸出一個字串的函式  
合法char str={“good”}   char str=”good” 
不能直接的用賦值語句str=”good”或str={“good”} 只能用strcpy。  
指標就是變數的地址。變數的起始地址就是就是變數的地址,變數的資料就是內容。  
指標與指標變數是不一樣的。指標是一個地址,而指標變數是用來存放地址的記憶體單元。例如:&Data和ptrData是不一樣的,前者是固定的地址,而後者的地址是可以改變的。指標變數不僅僅可以是一個變數的地址,還可以是陣列和函式的起始地址。  
int *ptrData  int Data  
ptrData=&Data;  就是Data=*ptrData 
第二個*和第一個*是不樣的,第一個是定義指標變數,第二個是指向變數Data,就是把ptrData指中的內容顯示出來。  
 int a[10]  int *ptr=a; 指標ptr+n表示指向陣列中a[0]後的n個數,注意必須是連續的資料,是陣列才行。       
還有*++ptr  *ptr++  (*ptr)++   *(++ptr)等是不一樣的,優先順序相同,都是從右往左算的。  
字串處理函式:strlen, strcat, strcpy,strcmp使用方法是:strcat(a,b),strlen(a),等,其中a,b是字串常量、字元型陣列名、字元型指標。  
二維陣列a[3][3]的a表示的意思是第0行的全部元素。即a[0]。   
char **ptr  char (*ptr)[10]  char *ptr[10]   ptr=&arry 


二級指標、指標陣列和陣列指標的區別: 
char **ptr  char (*ptr)[10]  char *ptr[10]  三者的區別: 第一個是二級指標式地址的地址。第二個是定義了一個指標變數ptr將他指向了一個二維陣列的行,也可以說是一個一維陣列,比如a[0]可以說是一維陣列,也可以說是二維陣列的第0行。第三個是定義了一個數組,是用來存放地址的,他指向的可以是不連續的資料區域。比如char *ptr[10]={“asd”,”ghjk”,”polk”}其中ptr[0]指向的內容是”asd”,即ptr[0]是二維陣列的行,ptr[0][0]=’a’, ptr[0][0]=’a’,ptr[0][0]=’a’,     等等。他們都是類似二維陣列。  
函式的寫:有返回值的函式前面加上返回值的型別如:int d(int k),無返回值的函式前面直接用void。無形參就寫成int d(void)或int d()。 
int s(int a,int b),其中的s就是函式,a,b是形參,一定要有資料的型別,int s同樣是函式輸出的數值的型別。函式的呼叫直接用s(a,b)即可。  
函式的傳遞:值傳遞和地址傳遞 
值傳遞:單向傳遞,只能由實參向形參傳遞,不能由形參向實參傳遞。例如: void  swap(int a,int b) {   int tmp;    tmp=a;    a=b;    b=tmp; } 
void main (void) {  int a=15;int b=5;   swap(a,b); 
printf(“%d,%d”,a,b); } 
結果是什麼:15,5。還是沒變。原因是子函式的值(5,15)不能傳給主函式中的呼叫的實參,結果顯示的還是實參。如果上面的子函式是有返回值的,可以用return函式,那麼還是可以傳遞上面的結果。所以值傳遞通常要用到return函式。  
地址傳遞:它是地址的傳遞是雙向的。 
void  swap(int *a,int *b) {   int tmp;    tmp=*a;    *a=*b;    *b=tmp; } 
void main (void) {  int a=15;int b=5;   swap(&a,&b); printf(“%d,%d”,a,b); } 


結果是:5,15。改變。原因是通過地址雙向傳遞的。上面的地址並未發生改變,子函式的作用是通過取指標指向的記憶體單元的內容交換,後記憶體單元的地址不變。由於地址是雙向傳遞,所以可以是子函式的結果傳遞給主函式中對子函式的呼叫。也可用到return函式。  
int ert(char str[])中的char str[]是合法的。或者int ert( char  *str)亦是合法的雖然沒定義陣列長度和指標初始值。  
指標函式就是返回值是一個地址,它是一個函式。例如:char *asd(int n) 返回值是一個地址,但是為什麼其型別是一個字元型的呢?因為返回的指標所指向的內容是一個字元型的。它和指標陣列不一樣,不能進行++,- -運算。  
函式指標是一個指標變數,用來指向一個函式的,即函式的首地址就是函式名。 例如:char (*asd)(int a) 其輸出值是一個字元型的值。asd只是指向函式入口的指標。