zoukankan      html  css  js  c++  java
  • Chapter_04 数组和指针并不相同

    • 数组并非指针
    “数组和指针是相同的”是一种非常危险、并不完全正确的说法。
    ANSI标准:
        extern int *x;    // x是个int型的指针
        extern int y[];   // y是个int型数组,长度尚未确定
    数组定义不等同于指针的外部声明的情况:
    文件1:
    // 定义了一个int数组
    int mango [100];
    文件2:
        // 外部声明的指向int型的指针
        extern int * mango;
    上述代码的错误如下:
    • 什么是定义,什么是声明
    C语言中的“对象”(不同于C++或其他面向对象编程语言的‘对象’,这里的对象只是跟链接器有关的“东西”,如函数和变量)必须有且只有一个定义,但它可以有多个extern声明。
    定义:创建了一个对象,确定对象的类型并分配内存。只能出现在一个地方。
    声明:描述了一个对象,说明了在其他地方创建(定义)的对象的名字,允许在后面的代码中使用。可以多次出现。
     
    声明乃普通的声明,描述其他地方创建的对象;而定义则相当于特殊的声明,它为对象分配内存。
     
    “地址y”和“地址y的内容”之间的区别:
    在赋值语句“X = Y;”中:
    X是左值,是一个地址,表示存储结果的地方,在编译时可知;
    Y是右值,含义是Y所代表的地址的内容,运行时可知。
     
    标准规定赋值符必须用可修改的左值作为它左边一侧的操作数。
     
    每个符号的地址在编译时可知。而对于指针,必须首先在运行时取得它的当前值,然后才能进行解除引用操作。
    如下代码:
        // a是一个char数组,也就是一个内存地址,其值(地址)在编译时可知
        // a[0] 即 位于这个内存地址处
        char a[9] = "abcdefgh";
    数组a的地址为0x002afd8c,这个地址也存储了字符“a”——直接引用
     
    而对于指针来说:
        // p 是一个 指向字符的指针
        char * p = "abcdefgh";

    指针p的地址为0x003cf808,这个地址里面“装”的内容还是一个四字节的地址0x012d5858,这个地址里面才“装”的是字符a——间接引用
     
    综上所述:当把p“定义为指针,但以数组方式引用时”,p[i]产生的效果是编译器会直接将p的地址加上偏移量(i * 步长)然后得到存储在该内存地址的内容。但正确的做法应该是取得存储于p地址处的内容,将其作为基地址(字节数取决于机器的位数)再与偏移量相加,产生一个地址,访问这个地址得到内容。
    • 使声明与定义相匹配
    指针变量本身始终位于同一个地址(编译时可知),但其内容在任何时候都可以不相同(可以指向不同的变量,这些变量可以有不同的值)。
    相对的,数组的地址并不能改变,在不同的时候它的内容可以不同。
    • 数组和指针的其他区别
    数组和指针都可以在它们的定义中用字符串常量进行初始化,但其底层的机制却不相同。
    定义指针时,编译器只是分配指针本身的空间,除非在定义时用字符串常量进行初始化。在ANSI C中,初始化指针所创建的字符串常量被定义为只读。试图通过指针修改这个字符串的值会出现未定义的行为
    而由字符串初始化的数组是可以修改的。
  • 相关阅读:
    FDR校正
    PHP base64 编码转化图片并进行指定路径的保存和上传处理(转自https://cloud.tencent.com/developer/article/1333877)
    google网页评测工具
    链接类型:预加载
    鼠标经过时显示、隐藏提示
    thinkphp5导入excel数据
    JS消息窗口滚动到底部
    datatable分页使用箭头
    Mysql基础
    php-MD5/sha1
  • 原文地址:https://www.cnblogs.com/qdsclove/p/3527706.html
Copyright © 2011-2022 走看看