*含義程序員
1.乘法 3*5 2.定義指針變量 int * p;//定義了一個名字叫p的變量,可以存放int數據類型的地址 3.指針運算符, //若是p是一個已經定義好的指針變量則*p表示以p的內容爲地址的變量
打印數據類型小程序
%d - int %ld – long int %c - char %f - float %lf – double %x – 十六進制輸出 int或者long int或者short int %o - 八進制輸出 %s – 字符串
三、指針數組
指針就是地址. 熱身小程序 介紹指針 int * p; //p是變量的名字, int * 表示p變量的數據類型是存放int類型的地址的數據類型 //int * p; 不表示定義了一個名字叫作*p的變量 // int * p; 應該這樣理解: p是變量名, int *是數據類型 ,p變量的數據類型是int* //所謂int * 類型 實際就是存放int變量地址的類型 int i = 3; p = &i; /*1. p保存了i的地址, 所以p指向i 2. p不是i,i也不是p,修改p的值不影響i的值,修改i的值也不會影響p的值 3. 若是一個指針變量指向了某個普通變量, 則 *指針變量 就徹底等同於 普通變量 例子: 若是p是個指針變量,而且p存放了普通變量i的地址則p指向了普通變量i *p 就徹底等同於 i 在全部出現*p的地方均可以替換成i 在全部出現i的地方均可以替換成*p *p 就是以p的內容爲地址的變量*/ j = *p; //等價於 j = i; printf("i = %d, j = %d\n", i, j);
四、指針與數組函數
數組名,下標和指針的關係,指針變量的運算 數組名 int a[5] //a是數組名,5是數組的大小,元素個數 int a[3][4] // 3行4列 a[0][0]就是數組的第一個元素 Int b[5] A=b ;//錯誤 一維數組名是個指針常量,它存放的是一維數組第一個元素的地址 int a[5]; int a[3][4]; printf("%#X\n",&a[0]); printf("%#X\n",&a); 下標和指針的關係 若是p是個指針變量 則p[i] 等價於 *(p+i)
五、動態分配內存spa
動態內存分配問題 傳統數組的缺點 1.數組長度必須實現指定, 而且只能是常整數. int a[5]; int len; int a[len];//error 2.傳統形式的數組,程序員無法手動釋放空間 數組一旦定義,系統爲該數組分配的空間一直存在 函數運行完畢,數組的空間就被釋放 3.數組的長度不能在函數運行中動態增長或者縮小 4.A函數定義的數組只有在A沒執行完畢前被使用,a函數運行完畢後,a的數組就沒法被其餘函數使用
# include <stdio.h> # include <malloc.h> //不能省 malloc 是 memory(內存) allocate(分配)的縮寫 int main(void) { int i = 5; //分配了4個字節 靜態分配 11 行 int * p = (int *)malloc(4); //12行 /* 1. 要使用malloc函數,必須添加malloc.h這個頭文件 2. malloc函數只有一個形參,而且形參是整型 3. 4表示請求系統爲本程序分配4個字節 4. malloc函數只能返回第一個字節的地址 5. 12行分配了8個字節, p變量佔4個字節, p所指向的內存也佔4個字節 6. p自己所佔的內存是靜態分配的, p所指向的內存是動態分配的 */ *p = 5; //*p 表明的就是一個int變量, 只不過*p這個整型變量的內存分配方式和11行的i變量的分配方式不一樣 free(p); //freep(p)表示把p所指向的內存給釋放掉 p自己的內存是靜態的,不能由程序員手動釋放,p自己的內存只能在p變量所在的函數運行終止時由系統自動釋放 printf("你們好!\n"); return 0; }
1.定義int (*pf)(int x, int y); 2.賦值 pf = add; 3.引用 pf(3,5);