day02_c 指针

#include <stdio.h>
#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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值