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