動態庫的封裝:【add.c】
1、建立庫函式的原始檔:vim add.c 和vim sub.c
2、生成目標資料夾:gcc -c add.c -fpic
3、生成動態庫:gcc add.o -o libadd.so -shared
【備註:libadd.so:lib是字首,add是庫的名字,so是字尾,代表的是動態庫】
4、建立呼叫庫函式的原始檔:vim demo.c
5、編譯執行:gcc demo.c ./libadd.so
【備註:這裡的動態庫是在當前目錄下的】
動態庫和靜態庫的區別:
1、靜態庫的字尾是.a,動態庫的字尾是.so.;
2、在編譯鏈結的時候,對於靜態庫,鏈結器是把靜態庫里的函式拷貝到呼叫的地方,呼叫一次 拷貝一次====》對應的實驗現象是:mv libadd.a ../之後,./a.out是可以執行的;而對於動態庫,鏈結器是在呼叫的地方做個「標記」,呼叫的時候再去動態庫里去進行載入!
===》對應的實驗現象:mv libmat.so ../之後,./a.out是不可以執行的;
3、鏈結動態庫的可執行檔案一般比鏈結靜態庫的可執行檔案要小;
4、預設的鏈結方式是動態鏈結!如果要靜態連線的話,加個引數-static
gdb除錯:
主要的作用是用來除錯**的錯誤可以做到單步除錯,或者從乙個斷電執行到下乙個斷點,甚至是改變當前的程式的執行檔案,按照我們設定的條件進行執行!
【countnine.c為例】
gcc -g countnine.c -o demo1;
-g加入除錯資訊到可執行檔案裡面;
==》gcc countnine.c -o demo2
==》比較下demo1和demo2的大小;
==》實際開發中:debug版本和發布版本(release版本)的可執行檔案!
進入到除錯環境中:gdb debug版的可執行檔案
打斷點:
break 程式的行號
或者break 函式的名字
檢視斷點:
info break
執行:run
單步執行:
step
【遇到函式,會進入到函式裡面進行單步執行】
next
【遇到函式,不會進入到函式裡面進行單步執行】
刪除斷點:
delete 斷點編號
continue
【如果接下來沒有斷點,一直執行到程式結束】
c語言:
用變數a給出下面的定義:
①乙個整型數;
int a;
②乙個指向整型數的指標;
int *a;
③乙個指向指標的指標,它指向的指標是指向乙個整型數;
int **a;
④乙個有10個整型數的陣列;
int a[10];
⑤乙個有10個指標的陣列,該指標指向乙個整型數;
int *a[10];
⑥乙個指向有10個整形陣列的指標;
int (*a)[10];
⑦乙個指向函式的指標,該函式有個整型引數並返回乙個整型數;
int (*a) (int);
⑧乙個有10個指標的陣列,該指標指向乙個函式,該函式有乙個整型引數並返回乙個整型數;
int (*a[10])(int) ;
定義變數或者解析定義的時候,用到的左右法則:
===》int (*a[10])(int);
首先找到變數名a,先往右看遇到了[ ],說明a是乙個陣列,[ ]裡面是個10,表明陣列中有
10個元素:【這個時候應該條件反射問自己,陣列裡面儲存的是什麼型別的元素?】
再繼續往右看,遇到了),這個時候調轉方向往左看!遇到了*,,表明陣列裡面儲存的變數是指標變數!【這個時候又應該問自己,這個指標變數指向的是什麼地方?】繼續往左看遇到了(,這個時候又要調轉方向,往右看!遇到了(),說明指標變數指向的是函式,()裡面是int,表明函式的形參只有乙個,並且是整型的引數,又調轉方向往左看,遇到int,說明函式的返回值是int型別;
int add(int a,int b);
函式的名字;
函式的形參;
函式的返回值;
左右法則:首先找到變數名,然後往右看,每次遇到括號調轉方向,直到把定**析完畢!
===》強調的是:
1、遇到陣列的時候,應該問自己:這個陣列裡面有多少個元素,元素是什麼型別的;
2、遇到指標的時候,應該問自己:指標指向的變數是什麼型別;
3、遇到函式的時候,應該問自己:函式的形參有沒有,有的話有幾個,分別是什麼型別
的,函式的返回值又是什麼型別的;
左值右值:
int a = 12;
在定義變數的時候就給變數賦值,叫初始化;
int a = 18;
在定義變數之後,再對變數進行操作,比如改變變數的值,叫賦值;
int a;a = 18;
變數的作用範圍:
全域性變數:作用範圍是整個.c檔案;
區域性變數:作用範圍是{}所在的**塊;
當全域性變數和區域性變數的作用範圍有重合的時候呢?
縣官不如現管!!!
資料型別的取值範圍:
有符號和無符號:
有符號:既可以表示正的,也可以表示負的,最高位只表示正負,不參與儲存資料,0表示
正,1表示負;
無符號:只能夠表示非負的,最高位參與儲存有效資料;
char為例:
signed char:
最大的:正的!==》0111 1111 = 127
最小的:負的!==》1111 1111 = -127
存在的問題:0000 0000 = +0 和 1000 0000 = -0
印度:-128;
[-128,127]
unsigned char:
最大的:1111 1111
最小的:0000 0000
原碼、反碼和補碼:
資料在計算機裡面儲存的時候,都是以補碼的方式儲存的!
正數:原碼反碼補碼都是一樣的;
負數:負數的補碼是負數的絕對值按位取反再加一;
-1的補碼計算:
-1的絕對值:0000 0001==》1111 1110==》11111111
運算子:
+、-、*、/、%、i++、++i
i++:先使用再加一;
++i:先加一再使用;
scanf("控制格式",位址);
scanf("%d",*&a);
scanf("%d",&a[0]);
csdn第三節課
筆記部分 1.網頁中影象的插入 一.屬性 1 alt 當無法顯示是給以使用者提示 2 title 滑鼠移動到上時顯示資訊 3 src 用於 中找出的路徑.二.路徑 1 當前的目錄檔案 直接寫出檔名 或 檔名 2 子集目錄檔案 同級檔名 子集檔名 3 上級檔案 檔名 多一級多加乙個 2.超連結 一.兩...
第三節課上筆記
沒有彈出輸入賬戶框,顯示如下,先輸入使用者名稱,碼雲的註冊手機號或者郵箱,回車,輸入碼雲註冊密碼 如果輸入錯誤,按如下操作 git add 2.git commit m 檔名稱 3.git push u origin master git add 當前資料夾所有內容 git commit m 備註資...
php第三節課
正規表示式 正規表示式 斜槓代表定界符 str abcde123fg456h reg d echo preg replace reg,str 將字串 str按照職責表示式reg替換為 var dump preg split reg,str 將字串str按照正規表示式拆分 arr array preg...