Linux C函式,陣列,指標,複雜宣告

2021-10-09 17:11:31 字數 3460 閱讀 3188

函式的遞迴呼叫

遞迴函式是指「自己呼叫自己」的函式,函式不可能不停的呼叫自己,所以遞迴函式一定具備結束條件

例一:遞迴函式binary search()實現二元搜尋演算法,在排序好的陣列中找到特定元素。首先,該函式根據搜尋條件比較陣列中間的元素,相同就返回該元素指標,不同該函式呼叫自己,在可能的另一半陣列中搜尋,一直遞迴進行,直到找到符合條件的元素。如果陣列剩下長度為0,則表示無符合條件的元素。

long

*binarysearch

(long val,

long array,

int n)

if(val==array[m])if

(val

)else

}

對於有n個元素的陣列來說,二元搜尋演算法最多執行 1+log2(n)次比較。

傳參

呼叫函式時,如需要複製資料物件,則執行成本很高。而且,函式沒有辦法修改原始變數,只能修改原始變數的複製版本

typedef

struct

student;

void

change

(student stu)

intmain()

執行結果:

100,zhang,

20100

,zhang,

20

然而,如果函式的引數時變數的位址,那麼函式就可以通過指標,直接獲取原始變數,並修改原始變數的值。所以,c中也提供了傳址呼叫函式

typedef

struct

student;

void

change

(student* stu)

intmain()

執行結果:

100,zhang,

20100

,zhang,

50

陣列初始化int a[10]= //a[0]=1,其餘都為0

陣列位址

int* p=a;

x=a[i];

x=*p;

在功能上等價,效能上不同。前者為了確定a[i]的位址,需要將i與型別長度相乘,在和a[i]首位址相加;後者只需要簡介引用指標p。

|表示形式 | 含義 | 位址值

|&a | 指向二維陣列的指標 |1000

| a | 二維陣列名,指向一維陣列a[0],即第0行首位址 |1000

a[0],(a+0),a | 第0行第0列元素位址 |1000

a+1,&a[1] |第1行首位址 |1006

a[1],(a+1) | 第1行第0列元素位址 |1006

a[1]+2,(a+1)+2, &a[1][2]| 第1行第2列元素位址 |1010

(a[1]+2),(*(a+1)+2),a[1][2] |第1行第2列元素的值 |元素值為11

array_name和&array_name的區別

前者時指向陣列中第乙個元素的位址

後者是指向整個陣列的位址

字元陣列和字串

在定義字串變數時,需要有足以容納該字串的陣列和指標,並且保證為null留出空間

問題一:

char a[12];

strcpy(a,「hello, world」);

上例中,a只能容納12個字元,而「hello,world」有13個字元(包含null),因此null字元會複製到a以外的位置可能會毀掉a四周記憶體空間的一些資料

例一:char a[12]=「hello, world」;

此時的a是乙個字元陣列而不是字串所以不包含null;

更好的方法

char a=「hello, world」

不設定陣列長度編譯器會自行計算所需要的空間;

strcmp原始碼分析

函式中的變數儲存位置

int a=0; 初始化的全域性變數,儲存在資料段

char* p1 未初始化的全域性變數,儲存在bss段,bss通常是指用來存放程式中未初始化的全域性變數和靜態變數的一塊記憶體區域。特點是:可讀寫的,在程式執行之前bss段會自動清0。所以,未初始的全域性變數在程式執行之前已經成0了。

int main()

指標是變數

系統為指標分配記憶體空間

指標有自己的位址

指標存的值為位址

在64系統中,typeof(指標)=8,位址佔8位元組

常量指標和指標常量

當const在之前就是常量指標,在之後就是指標常量

const char* p 定義乙個常量指標,指向乙個常量,內容不可更改但指標本身可以修改

char *const p=a; 定義乙個指標常量,指標是常量不可更改,但是指標指向的內容可以修改

char *p =「abc」 定義乙個常量字串,儲存在靜態儲存區的常量儲存區。值不可更改,但是指標可以修改

指標陣列

typename *p[n] 定義乙個陣列,陣列包含n個指標變數p[0],p[1]…

陣列指標

typename  (

*p)[n] 定義*

*乙個*

*指向含n個資料元素的陣列的指標

intmain()

;int

(*p)[6

];p=&arr;

printf

("%d",*

(*p+3)

);printf

("%d",*

(*(p+1)-

3));

}

函式指標

datatype (

*fun)

(引數列表);

void (*fun)(

int*

,int*)

;把函式的位址賦給函式指標,通過指標呼叫函式

int(

*pfun)

(int*,

int*

); 定義函式指標

intfun()

(int*,

int*

) 定義函式

pfun=fun; 指標賦值

(*pfun)

(p,q)

; 呼叫函式

指標函式返回值為指標的函式

datatype* fun();

指標 函式 陣列

1.指標函式 指標函式就是返回指標值的函式,本質是乙個函式。所以指標函式等價於 返回值為指標的函式 宣告形式 type func 引數列表 2.函式指標 函式指標就是乙個指向函式的指標。每個函式在編譯時,會被分配乙個入口位址,一般用函式名來表示,這個位址就是該函式的指標。宣告形式 type func...

函式指標,指標函式,陣列指標,指標陣列 區分

what why how 這些怎麼區分 函式指標 重點在指標,表示它是乙個指標,它指向的是乙個函式。eg int fun 指標函式 重點在函式,表示它是乙個函式,它的返回值是指標。eg int fun 陣列指標 重點在指標,表示它是乙個指標,它指向的是乙個陣列。int fun 8 指標陣列 重點在陣...

函式 陣列 指標(2)

內容與task 2 提高部分相關 指標能夠有效的處理陣列!是否學好c語言的重要標準就是指標與檔案 先直接給題目 理解並寫出結果 1 include int main char cp char cpp cp printf s n cpp 列印句1 printf s n cpp 3 列印句2 print...