zoukankan      html  css  js  c++  java
  • C语言基础篇(三) 指针

    导航:

      1.指针

        2. 数组
        3. 结构体,共用体
        4. 内存分布图
        5. 段错误分析

     

    ----->x<------------->x<--------------->x<--------------->x<------------->x<-----  
                                    一切皆内存 .
        1. 指针
            
            1.1 认识指针和指针变量
     
                假设,有一个大柜子,这个大的柜子,有很多很多的小格子,每一个格子,都有一个唯一的编码,从0开始,一直往下数.
            指针: 就是,就是这个唯一编码,我们能通过这个唯一编码,找到指定的这个小格子.你就能存放或者取出东西.
            
            指针变量: 变量实际上是在内存中圈一个空间, 指针变量就是定义一个盒子, 这个盒子是int大小, 里面存放的数据, 是一个地址. 这就是指针变量.
            类比一下: int a; 这是在内存中声明一个小盒子,这个小盒子是int大小,可以用来存放数据.
     
                     char *p; 这也是在内存中声明一个小盒子,这个 小盒子1 呢,还是 int 大小,因为 指针变量 是int型的,
                        然后这个 小盒子1 里面存放的数据 不是普通的数据, 是一串地址, 通过这个地址, 我就能找到写着这个地址的另一个小盒子2,
                         这个 小盒子2 呢,是 char 大小的小盒子,里面可以放你想放的数据.
                         所以这个 p 就是指针变量, 他是int大小,指向另一个地址的变量 .
     
            问? 为什么指针是int类型的??
                假设 描述指针大小的盒子是char大小的,那就是 8位,256种状态.256种状态只能描述256个小格子.
                假设我们现在就内存条就1G了,那我要用一个数,来描述1G里面所有的小格子,这个数要多大呢?
                2^10 =1k, 2^20 =1M, 2^30 =1G, 所以,要描述1G种状态位,我至少要有30位的大小来描述一个数据.
     
                在32位的操作系统中,cpu的一次访问,就能表达4G种状态内的任意一种.也就是说,在32位的操作系统中,我能识别出4G上限的编码,4G+1我就识别不出来了,因为已经超出了我的int类型的大小.
                所以,一般 用 int 来描述 一个指针的大小 .
                你想啊,我有300个小格子,但是你的char 只能数到 256 ,剩下的小格子不是浪费了吗 .
     

            char *p 说明了2个信息
            (1) 指针p 这个  小盒子1    的大小是 int
            (2) 指针P 所指向 小盒子2    的大小是 char,
            int main()
            {
                int *p1;
                char *p2;
                printf("p1 is %u,p2 is %u
    ",sizeof(p1),sizeof(p2));    //结果都是 4,因为指针变量的大小是int型的 .
                return 0;
            }
            int main()
            {
                    int a = 0x12345678;
                    int *p1;    //指针声明
                    p1 = &a;    //指针赋值
                    printf("the p1 is %x
    ",*p1);
                return 0;
            }

            1.2 指针变量的声明和使用 .
                声明: int *p;
                使用:
                    存和取:    *p
                    赋值: p = &a;
                int main(){
                    int a = 100;    //定义一个变量a,是100;
                    int *p;         //定义一个指针p
                    p = &a;         //将p指向a的地址
                    *p++;           //通过打开通道的方式,对p指向内存空间里面的内容 进行+1;
                    printf("a is %d
    ",a); //101
                    return 0;
                }

            1.3 指针和修饰符
                跟变量一样,除了空间大小的描述,还有空口位置的描述.指针同样有这种描述.
                
                -- const
                    const 认为是只读性质的变量,给人一种, 不能变的感觉 .
                    
                    (1) const char *p; // p是可变的,随便可以指向哪里,但是p指向的内容是固定不变的.
                    (2) char* const p; // p是固定不变的,但是p指向的内容是可以随意改变的.
                    (3) const char* const p; //p是固定不变得,而且它指向的内容也是不变的.

                    (1)--> 字符串. "xxxxx" 双引号里面的内容是无法修改的 .
                    (2)--> 硬件资源 ,地址不能变,但是里面的内容是不断刷新的.
                    (3)--> ROM       
                int main(){
    const char *p = "helloworld "; //这句话的意思是,指针p指向了一个字符串的地址, printf("the fiest is %c",*p); //结果是 'h',因为是char类型的. *p = 'k'; //段错误,因为const空间是不能做修改的 . return 0; }
                -- volatile
                    防优化 .
                    volatile char *p;
                        while(*p ==100);
                
                -- typedef
                    typedef char *name_t; name_t 是一种指针类型的名称,指向char内存...
                    name_t abc;


        2. 数组
        -- 一维数组 和 二维数组 和多维数组
        3. 结构体,共用体
        4. 内存分布图
        5. 段错误分析
  • 相关阅读:
    ORACLE增删改查以及case when的基本用法
    ORACLE自增函数,一般函数
    Charles下载与破解方法
    ORACLE常见问题收集
    SpringBoot项目 org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Jetty servlet container报错
    Cordova搭建环境与问题小结
    redis集群搭建
    centos下的redis一键安装shell脚本
    爬虫那些事儿
    Scrapy爬虫框架基本使用
  • 原文地址:https://www.cnblogs.com/kmist/p/9902185.html
Copyright © 2011-2022 走看看