C语言学习笔记(二):指针

1,问题的引入


    int a;
        变量类型    只有知道变量的类型,系统才知道为它分配多少字节的存储空间
        变量名        给变量取一个名字,后面我们要访问这个变量可以通过这个名字对他访问
        变量的值(右值)    变量名对应的存储空间中存储的内容            
        变量的地址            用来保存这个变量值的那个存储空间的编号
        
    -》在c语言中,每个变量名都有两层含义
        int a;
        a = 100;        把100存放到a对应的那个地址中去    :左值
        printf("a=%d\n",a);    把a对应的那个地址中的值取出来,并打印    :右值
        int b = a;//把a对应的那个地址中的值取出来,赋值给b    :右值
        (1)代表该变量的存储单元地址:左值
        (2)代表该变量的值:右值
        
        对一个变量的访问,只有两种情况:
            一是把一个值(存到)写到该变量的地址中去 write
            二是从该变量的地址中取值    read
            两种情况,都和该变量的地址相关
    由此:如果我们知道了一个变量的地址,是不是就可以通过该地址去访问这个变量呢?
    
    指针
    


2,什么是指针?


    地址:分配给每个变量的内存单元都有一个编号,这个编号就是我们说的地址。
        在内存中,这个编号是以字节为单位来编号的。
        
        就像一个大酒店,每个房间都有一个编号,我们我们可以通过这个房间号去找到相对应的房间一样
        我们也可以通过对应的地址编号去找到对应的地址
        可以认为指针就是一个地址编号。一个变量的地址,我们也称之为变量的“指针”
        
    要通过一个对象的地址(指针)来访问这个对象,我们首先得保存这个对象的地址
            int a = 10;
            ?=&a;
            我们保存一个整数,是用int型的变量来保存的,
            现在是要保存一个地址(指针),用什么变量呢?-》指针变量
    
    


3,指针变量

目录

1,问题的引入

2,什么是指针?

3,指针变量

4,两种与指针有关的运算符


    指针变量也是一个变量,只不过他是用来保存指针的而已
    int a = 10;
    ? = &a;
    需要定义一个指针变量来保存a的地址,假设?已经保存了a的地址,那么我们说?指向了a
    该怎么定义这个变量呢?
        指向的那个变量的类型 * 变量名;
        我想指向a,a的类型是int 
            所以: int *p; //int * p;->*和p之间有无空格都可以
            
    int *p;//定义了一个变量,变量名字叫做p,变量的类型是int * 。一般就把p称之为int型的指针变量
            //定义了一个变量,变量名字叫做*P,它的类型是int《-错误的 ,*p符合标识符的规定吗?
    
   

 例子:
        int a = 10;
        要定义一个变量来保存a的地址
        int * p;
        怎么保存a的地址
            p=&a;
        其实变量的地址是可以打印的,%p
        
        系统会给所有的变量分配存储空间,那么变量p也不例外,那么是分配多少个字节呢?
            sizeof(p);通过打印知道是占4个字节
            
        char c = 'h';
        char * q = &c;//等价 char * q; q = &c;
        sizeof(q);
            指针变量占多少个字节,由寻址范围决定,也就是说在32位机器上,
            不管是什么类型的指针,都是4个字节
            
            2^32 -> 2^10 * 2^10 * 2^10 * 4 ->4GB

4,两种与指针有关的运算符


    &(取地址符):单目运算符
        &对象
            取这个对象(变量,数组,函数)的地址
            
            &a ->对象a的地址
            
    *(指向运算符):
        *地址 <->地址对应的那个对象
        *(&a) -> *(a的地址) -> 地址对应的那个对象 ->a
            *(&a) <-> a
            *&  约掉,编译器帮你约掉
-----------------------------------------------
    

        int a = 5;
        int * p;
        p = &a;
       *p = 10;//*p <-> *(&a) <-> a//其实就是a = 10;
        printf("a=%d\n",a);//10
            
        p = &a;和*p = 10;中的p分别是左值还是右值
        p = &a;    //把a的地址&a存入到p的存储空间中去    -》左值
        *p = 10;//假设是左值,也就是p的地址,*(&p) -> p
                //*p = 10等价于 p=10    明显是错的
                所以是右值,也就是p的值,就是a的地址


            
5,指针变量作为函数参数
 

    void f(int * p)
    {
        .......
    }
    void ff(int p)
    {
        .......
    }
    main()
    {
        int a = 0;
        f(&a);
        ff(a);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值