导航:

  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,因为指针变量的大小是int型的 .
return ;
}
        int main()
{
int a = 0x12345678;
int *p1; //指针声明
p1 = &a; //指针赋值
printf("the p1 is %x\n",*p1);
return ;
}
        1.2 指针变量的声明和使用 .
            声明: int *p;
            使用:
                存和取:    *p
                赋值: p = &a;
            int main(){
int a = ; //定义一个变量a,是100;
int *p; //定义一个指针p
p = &a; //将p指向a的地址
*p++; //通过打开通道的方式,对p指向内存空间里面的内容 进行+1;
printf("a is %d\n",a); //
return ;
}
        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 ;
}
            -- volatile
                防优化 .
                volatile char *p;
                    while(*p ==100);
            
            -- typedef
                typedef char *name_t; name_t 是一种指针类型的名称,指向char内存...
                name_t abc;
    2. 数组
    -- 一维数组 和 二维数组 和多维数组
    3. 结构体,共用体
    4. 内存分布图
    5. 段错误分析

C语言基础篇(三) 指针的更多相关文章

  1. C语言基础知识(三)——指针

    指针定义 1.指针的值表示的是它所指向对象的地址,指针+1表示的是下一元素的地址,按**字节**编址,而不是下一字节的地址. 2.依照数据类型而定,short占用两字节.int占用4字节.double ...

  2. Java语言基础(三)

    Java语言基础(三) 一.    补码 (1).之所以有补码是因为要考虑成本 就是造计算机的成本 (2).下面让我们分析一下补码 以四位补码为例 <1> 高位是符号位,它决定其是正数还是 ...

  3. NIO相关基础篇三

    转载请注明原创出处,谢谢! 说在前面 上篇NIO相关基础篇二,主要介绍了文件锁.以及比较关键的Selector,本篇继续NIO相关话题内容,主要谈谈一些Linux 网络 I/O模型.零拷贝等一些内容, ...

  4. docker+k8s基础篇三

    Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...

  5. Hybrid APP基础篇(三)->Hybrid APP之Native和H5页面交互原理

    本文已经不维护,新地址: http://www.cnblogs.com/dailc/p/8097598.html 说明 Hybrid模式原生和H5交互原理 目录 前言 参考来源 前置技术要求 楔子 A ...

  6. Python基础篇(三)_函数及代码复用

    Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ...

  7. C语言----选择结构(基础篇三)

    大家好,忙里抽空更新一下自己的博客,算是自己的一个进步,C语言视频启蒙我早就看完啦,只是觉得这个视频真不错,所以给大家分享一下,同时自己还有很多没有理解透彻,写写博客算是一个笔记更是对自己所学的知识的 ...

  8. 算法笔记——C/C++语言基础篇(已完结)

    开始系统学习算法,希望自己能够坚持下去,期间会把常用到的算法写进此博客,便于以后复习,同时希望能够给初学者提供一定的帮助,手敲难免存在错误,欢迎评论指正,共同学习.博客也可能会引用别人写的代码,如有引 ...

  9. 前端开发之JavaScript基础篇三

    主要内容: 1.创建对象的几种方式 2.JavaScript内置对象 3.JavaScript错误--Throw.Try 和 Catch 4.JavaScript 表单验证 一.创建对象的几种方式 1 ...

随机推荐

  1. 解决 maven 项目中加入了 lombok 库后依然报错的问题

    平时我们采用 maven 引入第三方库,可以方便的管理第三方 jar 包,然加入 lombok 后启动 eclipse 依然报错,这是由于 lombok 是通过反射在运行时自动生成 getter(). ...

  2. Python人工智能之初识接口

    本节需要的两个工具: 1.FFmpeg: 链接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密码:w6hk 2.baidu-aip: pip ins ...

  3. Spring Boot:内置tomcat启动和外部tomcat部署总结

    springboot的web项目的启动主要分为: 一.使用内置tomcat启动 启动方式: 1.IDEA中main函数启动 2.mvn springboot-run 命令 3.java -jar XX ...

  4. JavaScript 获取 当前日期和三十天以前日期

    //获取当前日期 var myDate = new Date(); var nowY = myDate.getFullYear(); var nowM = myDate.getMonth()+1; v ...

  5. 【^.^】hello world~~

    一直以来都没有在公共博客上写作的习惯,加之Evernote的强大和方便好用,让我仅仅依赖它就足以满足日常学习笔记的记录和整理. 不过看着Evernote里面记录的大大小小的笔记已经有400+了,觉得应 ...

  6. 获取文件绝对路径:__FILE__与$_SERVER[SCRIPT_FILENAME'']的区别

    1.获取路径 (1)__FILE__ 获取某文件在本地目录中的绝对路径,(也就是说,哪个文件执行这行代码,它就获取哪个文件的绝对路径) (2)$__SERVER['SCRIPT_FILENAME'] ...

  7. Tensorflow ValueError: Protocol message RewriterConfig has no "layout_optimizer" field

    I changed models/research/object_detection/exporter.py line 71/72 from: rewrite_options = rewriter_c ...

  8. ubuntu 显示隐藏文件

    原文链接 http://blog.csdn.net/happyjiahan/article/details/6023496 方法1.使用命令ls -a显示所有的文件,包括隐藏文件 方法2.在桌面化操作 ...

  9. GL格式一览表

  10. SAP成都研究院Sunshine: 我的C4C实习感受和保研之路

    今天的文章来自SAP成都一位实习生,曾经和Jerry同在C4C成都开发团队一起工作过.在Sunshine最后一个工作日里,Jerry和Sunshine一起吃饭的时候,她曾经聊到接下来的保研打算和将来工 ...