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只是指向函式入口的指標。