您好,登錄后才能下訂單哦!
C 提高第一天復習
內存四區,變量常量的本質,函數調用模型,棧開口方向,指針鐵律1,指針是一種數據類型
C 提高學員標準:寫一個標準的冒泡排序
選擇法或者冒泡法排序
在一個函數內排序
通過函數調用的方式排序
數組做函數參數的技術盲點和推演
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i = 0; int j = 0; int tmp = 0; int a[] = {3,66,54,32,11,22,99,2334,32}; for (i = 0; i < sizeof(a) / sizeof(int); i++) { printf("%d ",a[i]); } printf("\n", a[i]); for (i = 0; i < sizeof(a) / sizeof(int); i++) { for (j = i+1; j < sizeof(a) / sizeof(int); j++) { if (a[i] > a[j]) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } } for (i = 0; i < sizeof(a) / sizeof(int); i++) { printf("%d ", a[i]); } printf("\n", a[i]); system("pause"); } 編譯運行: 3 66 54 32 11 22 99 2334 32 3 11 22 32 32 54 66 99 2334 請按任意鍵繼續. . .
冒泡程序,優化輸出與排序 與 函數的數組參數問題
#include <stdio.h> #include <stdlib.h> #include <string.h> void printfArray(int array[], int len) { int i; for (i = 0; i < len; i++) { printf("%d ", array[i]); } printf("\n", array[i]); } //數組做函數的參數的退回問題,退回為一個指針 //結論:把數組內存的首地址和有效長度傳給被調用的函數 //本質:函數中的數組形參,編譯器會把它當成指針處理 void sortArray(int array[], int len) { int i, j, tmp; for (i = 0; i <len; i++) { for (j = i + 1; j < len; j++) { if (array[i] > array[j]) { tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } } } int main() { int a[] = {3,66,54,32,11,22,99,2334,32}; int len = sizeof(a) / sizeof(int); printfArray(a, len); sortArray(a,len); printfArray(a, len); system("pause"); } 編譯運行: 3 66 54 32 11 22 99 2334 32 3 11 22 32 32 54 66 99 2334 請按任意鍵繼續. . .
數據類型概念:
“類型”是對數據的抽象
類型相同的數據有相同的表示形式、存儲格式以及相關的操作
程序中使用的所有數據都必定屬于某一種數據類型
基本數據類型:typedef 數組與地址
#include <stdio.h> #include <stdlib.h> #include <string.h> struct teacher1{ char name[64]; int age; }Teacher1; //使用typedef,以后定義就是這樣了 Teacher2 t2; typedef struct teacher2{ char name[64]; int age; }Teacher2; int main() { int b[10]; printf("b:%d , b+1:%d \n", b, b + 1); printf("&b:%d, &b+1:%d \n", &b, &b + 1); // b 代表數組首元素的地址 // &b代表整個數組的地址 // &b+1代表跨過整個數組地址 struct teacher1 t1; Teacher1.age = 0; Teacher2 t2; typedef int u32; printf("u32 =%d \n",sizeof(u32)); system("pause"); } 編譯運行: b:3603504 , b+1:3603508 &b:3603504, &b+1:3603544 u32 =4 請按任意鍵繼續. . .
數據類型的本質思考
思考數據類型和內存有關系嗎?
C/C++為什么會引入數據類型?
數據類型的本質
數據類型可理解為創建變量的模具(模子);是固定內存大小的別名。
數據類型的作用:編譯器預算對象(變量)分配的內存空間大小
程序舉例,如何求數據類型的大小 sizeof(int *)
請問:數據類型可以有別名嗎?數據類型可以自定義嗎?(typedef)
數據類型大小C程序:
#include <stdio.h> #include <stdlib.h> int main() { int a = 10; int b[10] ; printf("int a:%d \n", sizeof(a)); printf("int a:%d \n", sizeof(int *)); printf("int b:%d \n", sizeof(b)); printf("int b:%d \n", sizeof(b[0])); printf("int b:%d \n", sizeof(*b)); printf("hello.....\n"); return 0; } 編譯運行: C:\Users\chunli>gcc main.c & a int a:4 int a:4 int b:40 int b:4 int b:4 hello.....
常量的探討:
#include <stdio.h> #include <stdlib.h> #include <string.h> char * getstr1() { char *p = "1234"; return p; } char * getstr2() { char *p = "5678"; return p; } int main() { char *p1 = NULL; char *p2 = NULL; p1 = getstr1(); p2 = getstr2(); printf("%s,%s \n", p1, p2); printf("%d,%d \n", p1, p2); system("pause"); } 編譯運行: 1234,5678 14309464,14309644 請按任意鍵繼續. . .
改一改:
#include <stdio.h> #include <stdlib.h> #include <string.h> char * getstr1() { char *p = "1234"; return p; } char * getstr2() { char *p = "1234"; return p; } int main() { char *p1 = NULL; char *p2 = NULL; p1 = getstr1(); p2 = getstr2(); printf("%s,%s \n", p1, p2); printf("%d,%d \n", p1, p2); system("pause"); } 編譯運行: 1234,1234 2054232,2054232 請按任意鍵繼續. .
堆棧變量,函數返回一個被析構的內存空間塊
#include <stdio.h> #include <stdlib.h> #include <string.h> //堆 char * getmem(int size) { char *p = NULL; p = (char *)malloc(size); return p; } //棧 //return 不是把內存塊返回出來,而是把首地址返回了 char * getmem2() { char p[20]; strcpy(p, "haha2 \n"); return p; //【危險!】p即將釋放,但是地址返回去來了。 } int main() { char *p = NULL; p = getmem(20); strcpy(p, "haha1 \n"); printf("%s",p); free(p); p = NULL; p = getmem2();//返回了一個被析構的數據塊 printf("%s", p);//不應該這么做! system("pause"); } 編譯運行: haha1 haha2 請按任意鍵繼續. . .
棧的開口方向:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int a; int b; printf("&a = %d \n", &a); printf("&b = %d \n", &b); system("pause"); } 編譯運行: C:\Users\chunli>gcc -o main.exe main.c & main &a = 2686652 &b = 2686648 請按任意鍵繼續. . .
數組基地址永遠都是在下面:
指針鐵律1:指針是一種數據類型
#include <stdio.h> #include <stdlib.h> #include <string.h> //*p 在等號的左邊 修改內存 //*p 在等號的右邊 讀取內存 char * getstr() { int *tmp = "hello \n";// 常量區 return tmp; } int main() { int a; char *p1 = 100;//分配4個字節 p1 = &a; *p1 = 20; //*就像一把鑰匙,找到這個地址,并修改它 printf("%d \n", sizeof(p1)); printf("%d \n", *p1); int b = 0; b = *p1; printf("%d \n", b); char p2 = (char *)malloc(100); char p3 = (char *)malloc(100); char *p4 = getstr(); // *(p4 + 2) = 'K'; 因為返回的是常量 ,不能修改 printf("%s",p4); system("pause"); }
指針經典話語:
1,指針指向誰,就把誰的地址賦給指針;
2,指針變量 和 它指向的內存空間變量是兩個不同的概念
3,理解指針的關鍵是內存,沒有內存哪里來的指針
變量的本質是一個固定大小的數據塊,變量名就是數據塊的編號
內存的使用范圍:
main函數可以在棧分配內存/堆分配內存/全局分配內存,可以給子函數使用
子函數在棧分配的內存不能給主函數使用,但是堆內存與全局變量是可以給main使用
編譯器會為每個程序分配一個內存4區,主函數與子函數公用這個內存4區
建立正確程序運行內存布局圖是學好C的關鍵!
指針鐵律1:指針是一種數據類型
1)指針也是一種變量,占有內存空間,用來保存內存地址
2)*p 操作內存;
3)*就像一把鑰匙,通過一個地址(&a),去修改a變量的標示的內存空間
4)不斷的給指針賦值,相當于不停的改變指針的指向。
5) 指針是一種數據類型,是指它指向內存空間的數據類型
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。