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\n",sizeof(p1),sizeof(p2));    //结果都是 4

            return 0;
        }
    --------------------------------
        int main()
        {
                int a = 0x12345678;
                int *p1;    //指针声明
                p1 = &a;    //指针赋值
                printf("the p1 is %x\n",*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\n",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\n"; //这句话的意思是,指针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. 段错误分析

猜你喜欢

转载自www.cnblogs.com/kmist/p/9902185.html