c语言 指针 ,指针运算,数组指针

指针
     指针是一个变量,它的值是一块内存的地址。
     声明指针或者不再使用指针后都要将其置为0
     野指针:未被初始化的指针
     悬空指针:指针所指向的内存地址已经被释放的一种指针
    int i1 = 10;
    int *p1 = &i1;  //& 取地址符
    //%#x 输出 十六进制
    printf("i1 地址:%#x\n", &i1);
    printf("p1 值:%#x\n", p1);
    printf("p1 地址:%#x\n", &p1);

     可以看到,i1的内存地址与p1的值相同, 而p1的地址又是在一块单独的内存地址存储。

     而 * 就是解引用  解析并返回内存地址中保存的值。
     比如我们要取上面p1指向内存的值就用以下方法来取。
     printf("取指针指向内存的值 p1:%d\n", *p1);
 
     指针运算:对指针进行算术运算。
     c语言中的数组其实就是一块连续的内存,这里我们通过数组来展示指针的运算
    int array1[] = { 1, 2, 3, 4, 5, 6 };
    int *array_p1 = array1;
    for (size_t i = 0; i < 4;i++){
          printf("数组中的元素%d\n", *array_p1++); 这边我们通过+1 , 使指针移动到下一位
    }

     数组指针
      在c语言中,指针和数组名都表示地址
      1、数组是一块内存连续的数据。
      2、指针是一个指向内存空间的变量。
         //数组指针 数组的指针
    int array2[2][3] = { { 11, 22, 33 }, { 44, 55, 66 } };
    //数组指针 int[3]  类型的指针
    int (*array2_p2)[3] = array2;
    //直接取值获取的是数组中第一个元素 11
    printf("array_p2值: %d\n", *array2_p2);
    // 如果想取 22
    printf("array_p2值: %d\n", *(*array2_p2 +1));
    //如果想取55则
    printf("array_p2值: %d\n", *(*(array2_p2+1) +1));
     为什么那样获取55呢?
    //拆分
    //1、 指针偏移 因为array1的类型是3个int的数组 所以 +1 移动了12位
    array2_p2+ 1
    //2、获得{44,55,66}数组  (*(array2_p2 + 1))[1] = 55
    (*(array2_p2 + 1)
    //3、对数组执行 +/- 相当于隐式的转为指针
    //获得 55 的地址 再解地址
    *(array2_p2+ 1) + 1

    这里我们就讲完指针了。

 

 

 


    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值