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;    //编译正确

     

      

  • 相关阅读:
    Linux常用命令-centos
    USACO 2006 Open, Problem. The Country Fair 动态规划
    USACO 2007 March Contest, Silver Problem 1. Cow Traffic
    USACO 2007 December Contest, Silver Problem 2. Building Roads Kruskal最小生成树算法
    USACO 2015 February Contest, Silver Problem 3. Superbull Prim最小生成树算法
    LG-P2804 神秘数字/LG-P1196 火柴排队 归并排序, 逆序对
    数据结构 并查集
    浴谷国庆集训 对拍
    1999 NOIP 回文数
    2010 NOIP 普及组 第3题 导弹拦截
  • 原文地址:https://www.cnblogs.com/keepdoing123/p/12133802.html
Copyright © 2011-2022 走看看