zoukankan      html  css  js  c++  java
  • 《C专家编程》学习记录——指针和数组不同的地方

    一、指针和数组不同的地方

    1、“地址y”和“地址y的内容”之间的区别,不能定义时是指针,引用时却是数组,如不能定义char test[100]; 引用时却用extern char*test;

      举例,X=Y,其中X是变量名,用Y给X赋值;

      X的含义是X所代表的地址,X是左值,左值在编译时可知,左值表示存储结果的地方。
      Y的含义是Y所代表的地址的内容,Y是右值,右值在运行时才知,如无特别说明,右值表示“Y的内容”。

      编译器为每个变量(左值)分配一个地址,这个地址在编译时可知,并且该变量在运行时一直保存在这个地址。相反,存储在变量中的值(右值)只有在运行时才可知。如果需要用到变量中存储的值,编译器就发出指令从指定地址读入变量并将它存于寄存器中。

      

       由上图,a是一个数组,也是一个内存地址,数组内的字符可以从这个地址找到。编译器只需要起始地址和偏移地址,就可以从数组提取字符。

      p是一个指针,它指向的对象是个字符。为了获得这个字符,须得到地址p中的内容,并把这个内容作为字符的地址,并从这个地址中取得这个字符

      以上,当定义一个数组char p[100],却用指针char *p声明后,用p[i]这种形式提取这个声明的内容时,实际得到一个字符,编译器却把它当成是一个指针,可能会出现莫名其妙的错误,污染程序地址空间。故对于数组和指针,定义和声明时应该一致。

     

     2、数组和指针定义字符串常量的不同

      定义指针时,编译器不为指针所指向的对象分配空间,只分配指针本身的空间,除非在定义时同时赋给指针一个字符串常量进行初始化(!只能是字符串常量,不能是浮点数之类的常量,float *f = 3.14 /*错误!编译不通过*/ )。

      指针数组一样,只可以初始化字符串常量,不能用非字符串的类型直接初始化。

      char *p = "hello,world"

      在ANSI C中,初始化指针时创建的字符串常量被定义为只读,若试图通过指针修改这个字符串的值,程序会出现未定义的行为。

      数组也可用字符串常量初始化,

      char a[] = "hello,world";

      但单个字符以后可以修改,如strncpy(a, "bye__", 5);

     3、数组名是不可修改的左值,不能直接用一个数组给另一个数组用=赋值,指针可以修改

        int a[10] = {1,2,3,4,5,6,7,8,9,0};
        int b[10] = {22,22,22,22,22,22,22,22,22,22};
        
        int *p1 =a, *p2 = b;
        
        a[1]=10;
        *a=20;
    //    a = b;  //编译失败
        p1 = p2;    //编译正确

     

      

  • 相关阅读:
    ATA/SATA/SCSI/SAS/FC总线简介
    RAID卡
    解读Gartner《2015年度新兴技术成熟度曲线报告》
    linux 下 取进程占用内存(MEM)最高的前10个进程
    网站用域名能访问,用域名IP不能访问的原因分析
    iis7下iis安全狗不能用怎么办(安装iis6兼容性)
    4M宽带一般最大的下载速度是多少?
    U盘安装操作系统
    windows7实现打印机共享的方法
    windows7系统下如何安装windows xp系统(无法识别硬盘,删除隐藏分区)
  • 原文地址:https://www.cnblogs.com/keepdoing123/p/12133802.html
Copyright © 2011-2022 走看看