导航:

  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. JAVA避免入坑必备

    1.关于@Override Annocation 对于子类(包括并且特别是匿名类)中,重写父类的函数,一定要加上@Override.这会帮助你避免很多不必要的看起来让人恼怒的错误.比如,为什么子类重写 ...

  2. hdu 3530 区间和在一定范围内最长区间

    http://acm.hust.edu.cn/vjudge/problem/11253 这题要找到区间和在[m,k]范围内的最长区间 用两个单调序列保存区间最大值和最小值.当最大值-最小值>k时 ...

  3. HihoCoder#1509 : 异或排序(二进制)

    题意 题目链接 Sol 挺简单的吧.考虑两个元素什么时候不满足条件 设\(a_i\)与\(a_i + 1\)最高的不同位分别为0 1,显然\(S\)的这一位必须为\(0\),否则这一位必须为\(1\) ...

  4. dojo事件绑定

    Dojo如何动态绑定事件的小demo <html> <title>事件绑定测试test</title> <head></head> < ...

  5. Android Studio Git 分支实践

    新公司有些项目是用的 Git,以前公司都是 svn,为了练手 Git,我个人 APP 用到了,但是仅简单的 git pull/push 的使用,并未用到 Git 精髓,只有当项目中用到,才会紧迫去全面 ...

  6. 带你了解强大的Cadence家族,你可能只用到了它1/10的工具

    [转载自 SI-list[中国]http://mp.weixin.qq.com/s/qsdfzQwIVjvwHXuCdvrPXA ] 本篇对2017年初版Cadence的全套所有EDA工具的技术特性特 ...

  7. js&jquery:添加事件的三种方法和常用的一些事件

    一.添加事件的方法 1.EventTarget.addEventListener添加 获取事件目标元素,通过addEventListener函数添加 // Assuming myButton is a ...

  8. TP5.1:实现分页

    前提: (1)为了让分页变得更加好看,我的案例加载了bootstrap和jq的文件,具体操作请参考:http://www.cnblogs.com/finalanddistance/p/9033916. ...

  9. 用yum rpm 快速安装zabbix agent

    用yum 快速安装zabbix agent. wget http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-agent-3.4.2-1.el7 ...

  10. poj 2057 树形DP,数学期望

    题目链接:http://poj.org/problem?id=2057 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这只蜗牛要求寻找它的房子 ...