#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <math.h>
#include <time.h>
//1
//指針爲什麽要有類型?
//指針有類型,地址沒有類型s
//地址只是开始的位置,类型是读取到什么位置结束.
/*
void main(){
int i = 89;
//int 類型的指針
int *p = &i;
double j = 78.8;
//赋值为double类型变量的内存地址
p = &j;
//输出p的内存地址。已更改
printf("%#x\n",p);
//输出p内存地址存的东西,为0.00
printf("%lf\n",*p);
//为什么输出为0.00 就是因为指针类型为int类型。但是赋值为double。这就是指针为什么要有类型
getchar();
}
*/
//2.NULL 空指針,訪問内存地址0x000000操作系統不允許,
/*
void main(){
int i = 9;
int *p =NULL;
p = &i;
printf("%d\n",*p);
getchar();
}
*/
//3多級指針,二級指針;
//指針保存的是變量的地址,保存的這個變量還可以是地址。
//动态内存分配给二维数组
/*
void main(){
int a = 50;
//p1上保存的a的地址
int *p1 = &a;
//p2上保存的p1的地址
int** p2 = &p1;
//如果要通過p2拿到a的值
printf("p1的值為%#x\n",p1);
printf("p2的值為%#x\n",p2);
printf("a的值為 %d\n",**p2);
//修改a的值
**p2 = 100;
printf("修改后的值為%d\n",**p2);
getchar();
}
*/
//4指针的运算;
//指針的運算,一般在數組遍歷時才有意義。基於數組在内存中綫性排列的方式
/*
void main(){
//數組在内存中連續存儲
int ids[] = {78,92,23,65,19};
// 數組變量名:ids的值 就是數組的首地址,下面連個輸出結果相同,取地址ids也是一樣。
printf("%#x\n",ids);
printf("%#x\n",&ids);
printf("%#x\n",&ids[0]);
//指針變量
int *p = &ids;
printf("%d\n",*p);
//指針的加法。輸出結果為數組的下一個元素.92
p++;//p++ 向前移動sizeof(對應的數據類型)個字節.改變了内存地址。
printf("%d\n",*p);
getchar();
}
*/
//5通過指針給數組複製
/*
void main(){
int uids[5];
//int *p = uids;
//高級寫法
//int i = 0;
//for (; i < 5;i++){
// uids[i] = i;
//}
//早些版本寫法。
//p指针 指向数组的第一个元素
int *p = uids;
printf("%#x\n",p);
int i = 0;
for (; p < uids + 5;p++){ //p<uids +5.意思為 :uids是指向数组的第一個元素的内存地址。+5則是最大内存。因爲數組的内存是連續的。;P++,則是指向數組的下一個元素
*p = i; //將i 賦值給 指针p指向的内存地址,就是数组元素的值,指向的内存地址上的
i++; //改變賦值
};
getchar();
}
*/
//6函数指针
/*
void msg(char* msg,char* title){
MessageBox(0,msg,title,0);
}
void main(){
//msg();
//函數指針
//函数返回值类型,void
//函数指针的名称 fun_p
//char* msg.char* title.函数的参数列表
//= 赋值
void(*fun_p)(
char* msg, char* title
) = msg;
fun_p("消息内容","标题");
getchar();
}
*/
int add(int a,int b){
return a + b;
}
int minus(int a,int b){
return a - b;
}
//msg函数需要传递一个函数指针参数
//第一个参数的意思为, 返回值类型为int,并且函数需要两个int类型的参数的函数 函数指针
/*
void msg(int(*p)(int a,int b),int m,int n){
int result = p(m,n);
printf("%d\n",result);
}
void main(){
//加法
msg(add,10,5);
//减法
msg(minus,10,5);
getchar();
}
*/
//用随机数生产一个数组,写一个函数查找最小的值,并且返回最小数的地址,在主函数打印出来
int* getMinPointer(int ids[],int len){
int i = 0;;
int* p = ids;
for (; i < len;i++){
if (ids[i]< *p){
p = &ids[i];
}
}
return p;
}
void main(){
int ids[10];
int i = 0;
//初始化随机数发生器。设置种子,种子不一样,随机数才不一样
//當前時間作為種子
srand((unsigned)time(NULL));
for (; i < 10;i++){
ids[i] = rand() %100;
printf("%d\n",ids[i]);
}
int* p =getMinPointer(ids,sizeof(ids)/sizeof(int));
printf("%#x,%d\n",p,*p);
getchar();
}