day02_c 指針

#include
#include <stdlib.h>
#include <Windows.h>
#include<math.h>

#include<time.h>


理解指針的含義個人認爲一定要看懂指針是如何定義的:

int a = 20;    int   *p = a;       p=&a;   理解這幾個等式,就明白各自的意義和值了;


//指針爲什麼要有類型  : 因爲地址只是可以表示開始的位置,類型可以確定讀取到地址的那個位置結束(可以確定數據存儲的地址開始到結束的範圍)
//指針和地址的區別  : 指針有類型  地址沒有類型


//1
/*void main(){
int i = 89;
//int 類型的指針
int *p = &i;
double j = 78.9;
//賦值爲double類型變量的地址
p = &j;


printf("%#x,%lf\n", p,*p);
system("pause");
}
*/


//2 NULL 空指針
/*
void main(){
int i = 9;
int *p;
p = &i;    //指針定義以後一定要賦值(初始化) 否則會報錯 eg: 註釋本行代碼就會報錯
//int *p = NULL;  空指針的默認值爲0,訪問內存地址0x000000十六進制的0 操作系統不允許
printf("%d\n", *p);
system("pause");


}
*/


//3 多級指針(二級指針)
//多級指針保存的是變量的地址,保存的這個變量還可以是一個指針變量
//eg 動態內存分配給二維數組
/*void  main(){
int a = 50;
int* p1 = &a;
int** p2 = &p1;
printf("p1:%#x\n,p2:%#x\n",p1,p2);
**p2 = 90;
printf("%d\n",a);
system("pause");
}
*/


//3 指針的運算
//指針的運算,一般在數組遍歷時纔有意義,基於數組在內存中線性排列
/*
void main(){
//數組在內存中存儲連續
int ids[] = { 78, 90,23,65,19 };
//數組變量名:ids就是數組的首地址
printf("%#x\n", ids);
printf("%#x\n", &ids);
printf("%#x\n", ids[0]);
//指針變量
int *p = ids;
p++;  //p++ 向前移動sizeof(數據類型)個字節
p = p + 2;
p--;
printf("%d\n", *p);
getchar();
}
*/ 


//4通過指針給數組賦值
/*
void main(){
int uids[5];

// 高級寫法

//int i = 0;
// for(; i < 5;i++ ){
// uids[i] = i;
//}

//早期版本寫法


int* p = uids;


printf("%#x\n",p);
int i = 0;


for (; p < uids + 5; p++){
*p = i;
i++;
}
getchar();
}*/
//6 函數指針
/*
int msg(char* msg, char* title){


MessageBox(0,msg,title,0);
return 0;
}


void main(){

//msg();


//函數指針
//函數返回值類型,函數指針名,函數的參數列表
  int(*fun_p)(char* msg , char* title) = msg;


  fun_p("你喫過飯了嗎?", "問候語");


getchar();
}
*/


/*


//對應指針int (*fun_p)(int a,int b)
int add(int a ,int b){


return a + b;
}
//對應指針 int (*fun_p)(int a,int b)
int minus(int a , int b){
return a - b;
}
//msg 函數需要傳遞一個函數指針參數              //java 中傳遞一個對象通過對象再調方法,c直接傳遞方法指針操作方法
void msg(int (*fun_p)(int a,int b),int m, int n){
printf("執行一段代碼,給m+2...\n");
m = m + 2;
printf("執行一個傳入的函數");
int r = fun_p(m, n);
   // MessageBox(0,"消息","標題",0);


printf("執行結果 : %d\n",r);
}


void main(){ 


msg(add,10,20);
msg(minus, 50, 30);
getchar();
}
*/


//案例 : 用隨機數生成一個數組,寫一個函數查找最小的值, 並返回最小值的地址,在主函數中打印出來


//獲取最小值的地址(指針)
int* getMinPointer(int uids[], int len){
 
int i = 0;
int *p = &uids[0];
for (; i < len; i++){
if (uids[i]<*p){

p = &uids[i];
}


}
return p;


}




void main(){
int uids[10];
int i = 0;
//初始化隨機數發生器,設置種子,種子不同隨機數纔會不同
srand(time((unsigned)NULL));  //當前時間作爲種子  有符號 int -xx --> +xx
for (; i < 10; i++){
uids[i] = rand()%100;
printf("%d\n", uids[i]%100);//%100表示獲取100以內的隨機數
}




int*p = getMinPointer(uids, sizeof(uids) / sizeof(int));


printf("%#x,%d\n",p,*p);
getchar();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章