指针

引用的头部信息

# include <stdio.h>
# incude <stdlib.h>
# include <Windows.h>
# include <math.h>
# include <time.h>

指针为什么要有类型

  • 指针有类型,地址没有类型
  • 地址只是开始的位置,类型读取到什么位置结束
void main(){
    int i = 19;
    //int 类型的指针 
    int *p = &i;
    double j = 18.8;
    //赋值为double类型变量的地址
    p = &j;
    printf("double size:%d\n", sizeof(double));
    printf("%#x, %lf\n", p, *p);  //想通过4字节读取8字节变量的值,是不行的。
    getchar();
}

NULL空指针

void main(){
    int *p = NULL:
    //空指针的默认值为0
    printf("%#x\n", p);
    //访问内存地址0x000000操作系统不允许
    //p = 100; 操作系统不允许访问
    printf("%d\n", *p);
    getchar();
}

多级指针(二级指针)

  • 指针保存的是变量的地址,保存的这个变量还可以是一个指针变量
  • 动态内存分配给二维数组
void mian(){
    int a = 50;
    //p1上保存的a的地址
    int* p1 = &a;

    //p2上保存的p1的地址
    int** p2 = &p1;
    //int*** p3 = &p2;
    printf("p1:%#x, p2:%#x\n", p1, p2);
    **p2 = 90;
    printf("%d\n", a);
    getchar();
}

指针的运算

  • 一般在数组遍历时才有意义,基于数组在内存中线性排列的方式
void main(){
    //数组在内存中连续存储
    int nums[] = {78, 90, 23, 65, 19};
    //数组变量名:nums就是数组的首地址
    printf("%#x\n", nums);
    printf("%#x\n", &nums);
    printf("%#x\n", &nums[0]);
    //指针变量
    int* p = nums;
    printf("%d\n", *p);
    //指针的加法
    p++;//p++向前移动sizeof(数据类型)个字节
    printf("p的值:%#x\n", p);
    printf("%d\n", *p);
    getchar();
}

通过指针给数组赋值

void main(){
    int nums[5];
    //高级写法
    int i = 0;
    for(; i < 5; i++){
        nums[i] = i;
    }

    //早些版本的写法
    int* p = nums;
    printf("%#x\n",  p);
    int j = 0;
    for(; p < nums + 5; p++){
        *p = j;
        j++;
    }
    getchar();
}

函数指针

int msg(char* msg, char* title){
    MessageBox(0, msg, title, 0);
    return 0;
}

void main(){
    printf("%#x\n", msg);
    printf("%#x\n", &msg);
    //函数指针
    //函数返回值类型,函数指针的名称,函数的参数列表
    int(*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;
}

int div(int a, int b){
    return a/b;
}

//msg函数需要传递一个函数指针参数
//类似java中的回调函数
void msg(int(*fun_p)(int a, int b), int m, int n){
    int r = func_p(m, n);
    printf("执行结果:%d\n", r);
}

void main(){
    //加法
     msg(add, 10, 20);
    //减法
    msg(minus, 50, 10);
    getchar();
}

demo

用随机数生成一个数组,写一个函数查找最小的值,并返回最小数的地址,在主函数中打印出来

int * getMinPointer(int nums[], int len){
    int i = 0;
    int* p = &nums[0];
    for(; i < len; i++){
        if(nums[i] < *p){
        p = &nums[i];
        }
    }
    return p;
}

void main(){
    int nums[10];
    int i = 0;
    //初始化随机数发生器,设置种子,种子不一样,随机数才不一样
    //当前时间作为种子,有符号 int [-xx, +xx];
    srand((unsigned)time(NULL));
    for(; i < 10; i ++){
        //100范围内
        nums[i] = rand() % 100;
        printf("%d\n", nums[i]);
    }

    int *p = getMinPointer(nums, sizeof(nums) sizeof(int));
    printf("%#x, %d\n", p, *p);
    getchar();
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值