C语言——指针基础

指针基础

引:

变量值的访问方式:

  1. 直接访问方式——直接通过变量名存取变量值的方式

    代码中变量名代表的是变量的值;

    int a = 100;
    a = a+50;
    printf(“%d”,a);
    

    以上语句中都是通过变量名访问变量的值。

  2. 间接访问方式——通过访问变量的地址,来获得变量的值

    定义一个变量p, p存放的是a这个变量的地址,通过p这个变量名可以直接访问到a的地址。

一、概念

在存储时,内存被分为一块一块的,每一块都有自己的编号


例:

void main()
{ 
	int x = 10; 
	int y = 20; 
}
/*
内存:酒店     
每个房间:一块内存
订两个房间,门牌号px,py(变量的地址) 10住px,20住py
*/
  1. 指针与指针变量

    &a——变量a的地址

    指针——内存地址/变量存储的地址

    指针变量——存放普通变量地址的变量/存放指针的变量

    如果p是指针类型变量,而且p中存放了变量x的地址,则称p指向x
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1B6Icca-1639407225206)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b1f51c27-dee4-44cb-bc10-6d2fc2c56622/08F7EE1AB5F7097CA7D253648F7EF87C.jpg)]

  2. 指针转换说明和指针类型

    %p——指针的转换说明(以十六进制输出)

    指针类型——表示指针所指变量的数据类型,

    如:
    int变量的指针用int类型的指针存储;int类型指针不能指向float变量
    (如果用%d,则是将16进制转换成十进制输出)

二、指针变量的定义声明与使用

  1. 定义与声明

    type *var-name;

    type —— 指针所指变量的数据类型(void*,表示未确定类型的指针,c,c++规定void*可以强转为 任何其他类型的指针)

    * —— 指针说明符,标识p为指针变量

    var-name —— 指针变量的名称
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1PBtCrSs-1639407225214)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7bd74e56-a4df-4349-8f80-79297f26e33e/578A9F73055F533DF99B6CC648C8389E.jpg)]

  2. 使用

    • 取地址运算符&:取操作对象的地址(对于常量表达式,寄存器变量不能取地址,它们存储在储 存器中,没有地址)
    • 指针运算符*:通过操作对象的地址,获取存储内容
      x=&i;	//x为i的地址,*x为i的内容
      
    • &* 的结合方向
      *&x; 	//右结合,先获取地址,在获取地址里存储内容
      
      int main()
      {
         int  var = 20;   /* 实际变量的声明 */
         int  *ip;        /* 指针变量的声明 */
         ip = &var;  /* 在指针变量ip中存储 var 的地址 */
         printf("var 变量的地址: %p\n", &var  );
         printf("ip 变量存储的地址: %p\n", ip );
         printf("*ip 变量的值: %d\n", *ip );
         return 0;
      }
      /*
      结果:
      var 变量的地址: 0x7ffeeef168d8
      ip 变量存储的地址: 0x7ffeeef168d8
      *ip 变量的值: 20
      */
      
      小提示
      &取地址符:其实是指向最低地址的指针
      如:int a;scanf(“%d”, &a); 其实是将指向a的最低地址
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TwDQ4EQN-1639407225216)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/288381a9-21b4-4877-ae36-244f801ac6c4/Untitled.png)]

三、指针变量的初始化与赋值

  1. 指针变量的赋值

    指针变量在使用前必须赋值,将一个类型相同的变量地址赋给指针变量;(如在打印 *j 前,必须给 j 赋值)

    如果要通过指针变量访问指向的变量的值,那么指向的变量也应该有具体的值。

    #include <stdio.h>
    int main()
    {
        int i = 100, *j;
        j = &i;
        printf(“%d", *j);
        return 0;
    }
    
    //*j 相当于 i
    
  2. 指针变量的初始化

    指针变量可以在定义时赋值,赋值“NULL”或“0”(“0”是NULL的字符码,不是数字0)


    • NULL 指针

      在变量声明的时候,如果没有确切的地址可以赋值,可为指针变量赋一个 NULL 值

      NULL 指针(空指针)是一个定义在标准库中的值为零的常量。表明该指针不指向一个可访问的内存位置。

      例:

      #include <stdio.h>
       
      int main()
      {
         int  *ptr = NULL;
         printf("ptr 的地址是 %p\n", ptr  );
         return 0;
      }
      
      //结果:ptr 的地址是 0x0
      
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值