課堂筆記4

2021-08-15 03:39:10 字數 2742 閱讀 9962

一、指標

在32位系統中,不管什麼型別的指標都佔4個位元組,例如int *、char *、double *、long *……

*在定義時表示是指標變數,在使用時表示取值

int *p,a;

p = &a;

*p = 3;

或者int a = 1;

int *p = &a;

*p = 3;

以上兩種寫法都對,這樣a和*p的值都為3了

段錯誤:segmentation fault是訪問了不能訪問的記憶體產生的錯誤

野指標和空指標區別:野指標是指向了不能使用的記憶體;空指標是指標變數給null值後,則是可以使用的,只是不指向具體的變數

int *p和char *p的區別:p代表的記憶體只能儲存int/char型資料

例:數值交換

int a, *pa ; pa = &a ;  //把a的位址給pa,都是整型

把乙個指標變數的值賦予相同型別的另乙個指標變數;

int a, *pa = &a, *pb ;  pb = pa;  // 把a的位址給pb;(合法)

指標運算:

int x=3, y=0 , *px = &x;     

y = *px +5;       (y = 8)              

y = ++*px ;       (y = 4)                                       

y = *px++ ;       (y = 3)先取px的值後向右移動乙個位址

(*p1)++, *p1++區別?

(*p1)++是先取px的值輸出,後px的內容加1;

*p1++是先求*p1的值(x),然後再p1++,指向下乙個元素,不再指向x;

例:利用指標運算實現庫函式strcpy

注意點:用man 3 strcpy查詢strcpy函式,得知該函式的返回值型別為char *

在char *mainstrcpy(char *str, char *ptr)中,利用while((*p++ = *q++)!=『\0');先賦值後判斷可以將q中最後的'\0'也拷貝到p,完成拷貝後*p指向最後乙個字元,因此如果要返回p,需要在while前再定義乙個*tmp,使tmp = p,return tmp

malloc函式:char *src;src = malloc(20);

改進:src = (char *)malloc(sizeof(char)*20);malloc函式返回值是void *所以需要強制型別轉換

malloc在堆記憶體上,不會自動釋放,所以需要手動釋放,釋放後為了不讓指標變成野指標

free(src);src = null;

例:實現字串倒敘輸出

不同型別與零值比較:

①int:if(n == 0)或者 if (n != 0)

②float:const float epsinon = 0.00001;

if ((n >= -epsinon ) && (n <= epsinon ))

③bool型別:if (flag)或者if (!flag)

④指標型別:if (n == null)或者if (n != null)

陣列元素和指標:

陣列的指標是指數組的起始位址,陣列元素的指標是陣列元素的位址。

例如: 

int a[10]; /*定義a為包含10個整型資料的陣列*/ 

int *p;     /*定義p為指向整型變數的指標*/ 

p=&a[0]; 把a[0]元素的位址賦給指標變數p,也就是說,p指向a陣列的第0號元素

p的初值為&a[0] :

p+i和a+i都是a[i]的位址;*(p+i)和*(a+i)都是p+i和a+i所指向的陣列元素,即a[i] 

例如:*(p+5),   *(a+5)就是a[5]

int *p2 = (int*)((int)a + 1);//a表示陣列首元素位址,轉為int型變為四個位元組,+1變成第二個位元組代表的位址

int *p3 = (int*)(a + 1);//p3[0]為2

p1[0], p2[0], p3[0]的值分別為多少?

指標和字串:

在c語言中,可以用兩種方法訪問乙個字串。 

1)用字元陣列存放乙個字串,然後輸出該字串。 

int main()

2) 用字串指標指向乙個字串。 

main()

; printf("%s\n", *string); 

} 例:利用指標陣列實現字串排序

從鍵盤獲取字串寫入前,要為每個元素申請空間

函式指標:例 int (*p)()

typedef:定義新的資料型別

typedef int (*func)(int, int);

func p;

以上兩句表示int (*p)(int, int);

指標函式:int *p();

例:int *(*(*pf)(int))[10];意義:fp是乙個指標,指向乙個函式,函式有乙個int型的形參,函式的返回值是乙個指標,指向乙個有10個元素的陣列,陣列每個元素的型別都是int *

利用函式指標進行氣泡排序

二維指標陣列:

&a:指向二維陣列的指標

a+1、&a[1]:第1行首位址

a[0]、*(a+0)、*a:第0行第0列位址

a[1]、*(a+1):第1行第0列位址

a[1]+2、*(a+1)+2、&a[1][2]:第1行第2列位址

*(a[1]+2)、*(*(a+1)+2)、a[1][2]:第1行第2列的值

Linux課堂筆記(4)

gcc hello.c編譯 gcc e hello.c使編譯過程停留在預處理之後編譯之前 gcc e hello.c hello.i使預處理產生的檔案生成到hello.i檔案內 預處理做的第一件事是 使標頭檔案展開 include 巨集替換也是在預處理階段處理 條件編譯 ifndef else en...

機器學習課堂筆記4

1,機器什麼時候可以學習 2,為什麼機器可以學習 3,機器怎麼學習 4,機器怎麼樣才能學得更好 vc維 課堂筆記3中提到 break point 的概念 在資料量達到一定數量k的時候,假設集合h無法再shatter這k個資料,則成長函式mh的break point就是k。vc dimision k ...

軟體需求工程 課堂筆記4

本文主要來自ppt,會有一部分省略,省略的是我看不懂的地方或者覺得比較晦澀的地方 由於世界是複雜的,不同職業的人看待同一項事物,會看到不同的結果。為了保證專案涉眾以符合專案需要的角度描述現實世界,可以採取以下的做法 所有的涉眾都從共同認同的專案前景出發,理解和描述問題域及 需求 範圍內的事物和事件是...