C语言_指针

//***** 指针 *****
//***** 指针变量 *****
void test1()
{
    int i = 100;
    int *p = NULL;
    p = &i;

    printf("i:%d\n",*p);

    /*
    int *p 定义一个整形指针变量
    p = &i 把i的地址赋给指针变量
    指针就是存放别的变量的地址
    */
}

//***** 指针操作 *****
void test2()
{
    int i = 100;
    int *p = NULL;
    p = &i;

    *p = 101;
    printf("i:%d\n",*p);

    /*
    *p 访问指针p指向的数值
    */
}

//***** 空指针 *****
void test3()
{
    int *p;
    p = NULL;

    /*
    p = NULL,NULL是一个宏,代表0,也就是该指针变量为0
    指针是一个变量,那变量如何没有在定义时进行初始化,那系统就会给该指针变量一个随机值,所有我们必须指针变量赋为空
    */
}

//***** 指针变量更改 *****
void test4()
{
    int a = 100;
    int b = 200;
    int *p = NULL;

    p = &a;
    printf("a:%d\n",*p);

    p = &b;
    printf("b:%d\n",*p);

    int i = 300;
    p = &i;

    printf("p保存的地址:0x%p\n",p);

    p ++;
    printf("p保存的地址:0x%p\n",p);

    p --;
    printf("p保存的地址:0x%p\n",p);

    p = p - 2;
    printf("p保存的地址:0x%p\n",p);
    /*
    既然指针变量是一个变量,变量可以赋值,可以加减,可以比较大小,那指针变量也是可以的
    p ++ 其实就是p + sizeof(int) * 1
    p -- 其实就是p - sizeof(int) * 1
    p = p - 2 其实就是p = p - siezeof(int) * 2
    */
}

//***** 指针自身地址 *****
void test5()
{
    int a = 100;
    int *p = NULL;

    p = &a;
    printf("p保存的地址:0x%p\n",p);
    printf("p自身的地址:0x%p\n",&p);
    printf("p指向的变量:%d\n",*p);

    /*
    指针既然存放的是别的地方的指针,但它自己也是存放在内存中的,那它自身也是有内存地址的
    p一旦定义了,编译器就会自动在栈中开辟一块内存存放指针p
    */
}

//***** 指针类型 *****
void test6()
{
    int a = 100;
    int *p1 = NULL;

    p1 = &a;

    float b = 15.0f;
    float *p2 = NULL;

    p2 = &b;

    printf("a:%d\n",*p1);
    printf("b:%f\n",*p2);

    /*
    指针类型和指针指向的变量的类型是两个不同的概念,整形指针只能指向整形变量,浮点型指针只能指向浮点型变量
    两者类型必须匹配
    */
}

//***** 常量指针const *****
void test7()
{
    int a = 100;
    int *const p = &a;

    //p ++;  // 由于指针是常量指针,假如p ++操作,将会出错
    *p = 103;  // 由于指针指向的数值不是常量,所以可以修改指向的数值的值
    printf("p保存的地址:0x%p\n",p);
    printf("p指向的数值:%d\n",*p);

    /*
    常量const指针,就是指针不可变,常量指针只能定义时初始化
    */
}

//***** 指向常量的指针 *****
void test8()
{
    int a = 100;
    const int *p = &a;

    p ++;  // 由于指针p不是常量指针,所以可以p ++
    //*p = 103;  // 由于指针p指向的数值是常量,所以不能更改指针p指向的常量
    printf("p保存的地址:0x%p\n",p);
    printf("p指向的数值:%d\n",*p);

    /*
    指针指向的是常量,所以指针指向的数值不可以改变
    */
}

//***** 指向常量的常指针 *****
void test9()
{
    int a = 100;
    const int *const p = &a;

    //p ++;  // 由于指针是常量指针,假如p ++操作,将会出错
    //*p = 103;  // 由于指针p指向的数值是常量,所以不能更改指针p指向的常量
    printf("p保存的地址:0x%p\n",p);
    printf("p指向的数值:%d\n",*p);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值