5. 06 C语言 指针

Pointer 

 

int a = 1; 
char b = 2; 

int *= &b;   //错误,指针类型与变量类型不符(计算机是倒着寻址,所以读取b时,会读到a的地址) 

printf("%d", *p); 

int a = 4; 
     
    //指针的基类型要和它所指向的变量类型一致 
     
    //指针的初始化 
     
    int *= &a;            // *p定义时表示地址 
     
    printf("%d\n", *p);     //定义以后,使用*p中的*则表示指针运算符,将对这块地址中存储的值,进行间接访问。 
     
    int b = 12; 
     
    p = &b;                 //p使用的时候表示地址 

指针定义之后必须初始化,没有具体指向的指针不能使用。避免野指针。 

int *= NULL; // 定义指针变量以后,初始化指向为NULL(未指向任何一块地址) 

指针常见错误用法: 

//野指针异常,p1指向随机地址 
    int *p1; 
    *= 10; 
     
//空指针异常,p2没有指向 
    int *p2 = NULL; 
    *p2 = 10; 

指针与一维数组 

    int array[] = {1,2,3,4,5}; 
     
    int *= array; 
     
    printf("a[0] = %d, a[0] = %d\n", array[0], *p); 
     
    printf("a[2] = %d, a[2] = %d\n", *(+ 2), p[2]); 
     
    for (int i = 0; i < 5; i++) { 
        printf("%d ", p[i]); 
    } 

array 首元素地址(常量) 

*p 首元素的值 

p++; 指针p指向下一位 

p + 1; 指向下一位,指针p位置不变 

*(p + 1) 下一位的值, 等价于 p[1] 

指针与二维数组 

     int arr[2][3] = {1 ,2 ,3 ,4, 5, 6}; 
         
     int (*pr)[3] = arr;  //数组指针,指向二位数组的指针 
         
     int *q[3]     //指针数组 

const修饰符 

   //对于基本类型, int const  const int相同 
    int const a = 11;    //变量 a 只读,不能修改 
    const int b = 12;    // 同上面一样, b 也是被 const修饰的变量(只读) 
     
     
    int a2 = 10; 
    int a3 = 12; 
   
    //const * 左边,可以改变指针[指向]不能通过 *p改变指向的[] 
    int const *p1 = &a2; 
    const int *p2 = &a2; 
     
    p1 = &a3;   //可以改变p1的指向, p1指向a3 
    *p1 = 15;   //但是不能通过*p1修改所指向的变量的值 
    a3 = 15;    //a3可以通过自身修改 
     
    //const  * 右边,可以改变*p所指向的[],但是不能改变[指向] 
    int * const p3 = &a2; 
     
    p3 = &a3;    //不能改变指向 
    *p3 = 15;     //可以改变值 
     
    //[][指向]都不能改变 
    int const * const p4 = &a2; 

二维数组的地址 

//二维数组的地址 

    int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 

     

    printf("a = %p \n",a); 

    //a是二维数组的名字,相当于二维数组首元素(1个一维小数组a[0])的地址 

     

    printf("a + 1 = %p \n", a + 1); 

    // a + 1 相当于第2个一维小数组a[1]的地址 

     

    printf("&a[0] = %p \n", &a[0]); 

    //a[0]是第1个一维小数组的数组名,所以a[0]是指向第一个元素a[0][0]的指针。&a[0]相当于a[0]升一级,那么&a[0]就是指向第1个一维小数组a[0]的指针 

     

    printf("&a[0] + 1 = %p \n", &a[0] + 1); 

    //&a[0] + 1相当于指向向第2个一维小数组a[1]的指针 

     

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

    //a是二维数组的名字,相当于二维数组首元素(1个一维小数组a[0])的地址。 *a相当于降一级,因此*a是指向第1个一维小数组的第一个元素a[0][0]的地址 

     

    printf("*a  1 = %p \n", *a + 1); 

    //*a a[0][0]的地址,因此*a + 1a[0][1]的地址 

     

    printf("a[0] = %p \n", a[0]); 

    //a[0]是第1个一维小数组的数组名,所以a[0]是指向第一个元素a[0][0]的指针 

     

    printf("a[0] + 1 = %p \n", a[0] + 1); 

    //a[0] + 1是指向第一个元素a[0][1]的指针 

     

    printf("&a[0][0] = %p \n", &a[0][0]); 

    //a[0][0]的地址 

     

    printf("&a[0][0] + 1 = %p \n", &a[0][0] + 1); 

    //a[0][1]的地址 

 


预习: 

什么是结构体? 

结构体如何定义和使用? 

什么是结构体数组? 

共用体和结构体的区别? 

什么情况下使用枚举? 

typedef的使用


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值