• 第四章 数组和指针


    code:

    // 第四章 数组和指针
    
    
    // 1、数组 ---------------------------------------------------------
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      // both buf_size and max_files are const
      const unsigned buf_size = 512, max_files = 20;
      int staff_size = 27; // nonconst
      // const unsigned sz = get_size(); // const value not known until run time
      char input_buffer[buf_size]; // ok: const variable
      string fileTable[max_files + 1]; // ok: constant expression
      // double salaries[staff_size]; // error: non const variable
      // int test_scores[get_size()]; // error: non const expression
      // int vals[sz]; // error: size not known until run time
      return 0;
    }
    
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      const unsigned array_size = 5;
      // Equivalent to ia = {0, 1, 2, 0, 0}
      // ia[3] and ia[4] default initialized to 0
      int ia[array_size] = { 0, 1, 2 }; //啊哈磊没有说错,ar[..]={0},就可以全部初始化
      // Equivalent to str_arr = {"hi", "bye", "", "", ""}
      // str_arr[2] through str_arr[4] default initialized to the empty string
      string str_arr[array_size] = { "hi", "bye" };
      return 0;
    }
    
    
    
    //CppPrimer.cpp:7: error: ISO C++ forbids assignment of arrays
    #include <iostream>
    using namespace std;
    int main()
    {
      int a[]={1,2};
      int b[2];
      b=a;
      return 0;
    }
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      const size_t array_size = 10;
      int ia[array_size]; // 10 ints, elements are uninitialized
      // loop through array, assigning value of its index to each element
      for(size_t ix = 0; ix != array_size; ++ix)
        ia[ix] = ix;
      return 0;
    }
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      const size_t array_size = 7;
      int ia1[] = { 0, 1, 2, 3, 4, 5, 6 };
      int ia2[array_size]; // local array, elements uninitialized
      // copy elements from ia1 into ia2
      for(size_t ix = 0; ix != array_size; ++ix)
        ia2[ix] = ia1[ix];
      return 0;
    }
    
    
    
    // 2、指针的引入 ------------------------------------------------------------
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      int ival = 1024;
      int *pi = 0; // pi initialized to address no object
      int *pi2 = &ival; // pi2 initialized to address of ival
      int *pi3; // ok, but dangerous, pi3 is uninitialized
      pi = pi2; // pi and pi2 address the same object, e.g. ival
      pi2 = 0; // pi2 now addresses no object
      return 0;
    }
    
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      int ival;
      int zero = 0;
      const int c_ival = 0;
      // int *pi = ival; // error: pi initialized from int value of ival
      // pi = zero; // error: pi assigned int value of zero
      int *p;
      p = c_ival; // ok: c_ival is a const with compile-time value of 0
      p = 0; // ok: directly initialize to literal constant 0
      return 0;
    }
    
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      double dval;
      double *pd = &dval; // ok: initializer is address of a double
      double *pd2 = pd; // ok: initializer is a pointer to double
      // int *pi = pd; // error: types of pi and pd differ
      // pi = &dval; // error: attempt to assign address of a double to int *
      return 0;
    }
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      double obj = 3.14;
      double *pd = &obj;
      // ok: void* can hold the address value of any data pointer type
      void *pv = &obj; // obj can be an object of any type
      pv = pd; // pd can be a pointer to any type
      return 0;
    }
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      string s("hello world");
      string *sp = &s; // sp holds the address of s
      cout << *sp;     // prints hello world
    
      return 0;
    }
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      int ival = 1024, ival2 = 2048;
      int *pi = &ival,  *pi2 = &ival2;
      pi = pi2; // pi now points to ival2
      
      int &ri = ival, &ri2 = ival2;
      ri = ri2; // assigns ival2 to ival
      return 0;
    }
    
    
    // 定义指针的时候,要用n个*,解引用时,只能用一个*
    #include <iostream>
    using namespace std;
    int main()
    {
      int ival = 1024;
      int *pi = &ival; // pi points to an int
      int **ppi = &pi; // ppi points to a pointer to int
      int ***pppi = &ppi;
      cout << *pppi << ' ' << ppi << endl;
      cout << *ppi << ' ' << pi << endl;
      cout << pi << ' ' << *pi << endl;
      return 0;
    }
    
    
    
    // 使用指针访问数组元素
    
    #include <iostream>
    using namespace std;
    int main()
    {
      int ia[] = {0,2,4,6,8};
      int *ip = ia; // ip points to ia[0]
      int *jp = &ia[0];
      cout << ip << ' ' << jp << endl; // same
      cout << ia[2] << ' ' << *(jp+2) << endl; // same 
      return 0;
    }
    
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      int ia[] = {0,2,4,6,8};
      int *ip = ia; // ip points to ia[0]
      int *jp = &ia[3];
      ptrdiff_t n; // ok: distance between the pointers
      n=ip-jp;
      cout << n << endl;
      
      return 0;
    }
    
    
    
    // 负值下标终于出现
    #include <iostream>
    using namespace std;
    int main()
    {
      int ia[] = { 7, 2, 4, 6, 8 };
      int i = ia[0]; // ia points to the first element in ia
      int *p = &ia[2]; // ok: p points to the element indexed by 2
      int j = p[1]; // ok: p[1] equivalent to *(p + 1),
      // p[1] is the same element as ia[3]
      int k = p[-2]; // ok: p[-2] is the same element as ia[0]
      cout << i << ' ' << k << endl;
      return 0;
    }
    
    
    
    // 编译运行都木问题,但。。。
    #include <iostream>
    using namespace std;
    int main()
    {
      const size_t arr_size = 5;
      int arr[arr_size] = {1, 2, 3, 4, 5};
      int *p = arr; // ok: p points to arr[0]
      int *p2 = p + arr_size; // ok: p2 points one past the end of arr
      //    use caution -- do not dereference!
      cout << *p2 << endl; // !!!
      return 0;
    }
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      const size_t arr_sz = 5;
      int int_arr[arr_sz] = { 0, 1, 2, 3, 4 };
      // pbegin points to first element, pend points just after the last
      for(int *pbegin = int_arr, *pend = int_arr + arr_sz;
        pbegin != pend; ++pbegin)
        cout <<  *pbegin << ' ';
      // print the current element
      return 0;
    }
    
    
    
    // 指向 const 对象的指针
    #include <iostream>
    using namespace std;
    int main()
    {
      
      const double d=3.14;
      const double *cptr; // cptr may point to a double that is const
      cptr=&d; // ok
      // *cptr = 4.14; // error: d is const  
      double *pt;
      // pt=&d; // error: because C++ 语言强制要求指向 const 对象的指针也必须具有 const 特性
      double e=5.14;
      pt=&e; // ok, of course
      cptr=pt; // ok:cptr本身不是常数
      cout << *cptr << endl;
      // *cptr = 6.14; // error: 虽然可以改变cptr,但*cptr不能作为左值
      // cptr 自以为指向 const 的指针
    
      return 0;
    }
    
    
    
    // const 指针
    
    #include <iostream>
    using namespace std;
    int main()
    {
      int errNumb = 0, i=1;
      int *const curErr = &errNumb; // curErr is a constant pointer
      //从右向左把上述定义语句读作“curErr 是指向 int 型对象的 const 指针”。
      // curErr = &i; //不可以,因为 const 指针 不可以改变
      errNumb = 2; // 可以,指针指向对象非 const
    
      return 0;
    }
    
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      const double pi = 3.14159;
      // pi_ptr is const and points to a const object
      const double *const pi_ptr = &pi;
      // 可从右向左阅读上述声明语句:“pi_ptr 首先是一个 const 指针,
      // 指向 double 类型的 const 对象”。
    
      return 0;
    }
    
    
    
    #include <iostream>
    using namespace std;
    int main()
    {
      string const s1;   // s1 and s2 have same type,
      const string s2;   // they're both strings that are const
    
      return 0;
    }
    
    
    // 3、C 风格字符串 -----------------------------------------------------------
    
    #include <iostream>
    using namespace std;
    int main()
    {
      char ca1[] = {'C', '+', '+'}; // no null, not C-style string
      char ca2[] = {'C', '+', '+', ''}; // explicit null
      char ca3[] = "C++"; // null terminator added automatically
      const char *cp = "C++"; // null terminator added automatically
      char *cp1 = ca1; // points to first element of a array, but not C-style string
      char *cp2 = ca2; // points to first element of a null-terminated char array
      return 0;
    }
    
    
    
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main()
    {
      const char *cp = "some value";
      while(*cp)
      {
        printf("%c",*cp);
        ++cp;
      }
      return 0;
    }
    
    /*
    对大部分的应用而言,使用标准库类型 string,除了增强安全性外,效率也提高了,因此应该尽量避免使用 C 风格字符串。
    作者讲解这部分,主要是为了与以前的C语言编写的代码兼容。。
    故以下略去一部分。
    */
    
    
    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
      int *pia = new int[10]; // array of 10 uninitialized ints
      string *psa = new string[10]; // array of 10 empty strings
      int *pib = new int[10]; // array of 10 uninitialized ints
      int *pic = new int[10](); // array of 10 initialized ints
      return 0;
    }
    
    
    
    // const 对象的动态数组
    
    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
      // error: uninitialized const array
      // const int *pci_bad = new const int[100]; // 因为int是内置类型
      // ok: value-initialized const array
      const int *pci_ok = new const int[100]();
      // ok: array of 100 empty strings
      const string *pcs = new const string[100]; // 因为string是类类型
      
      return 0;
    }
    
    
    // 使用数组初始化 vector 对象
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    int main()
    {
      const size_t arr_size = 6;
      int int_arr[arr_size] = { 0, 1, 2, 3, 4, 5 };
      // ivec has 6 elements: each a copy of the corresponding element in int_arr
      vector < int > ivec(int_arr, int_arr + arr_size);
      return 0;
    }
    
    
    
    
    // 4、多维数组 --------------------------------------------------------------
    
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    int main()
    {
      int ia[3][4] = {   /*  3 elements, each element is an array of size 4 */
        { 0, 1, 2, 3 },  /*  initializers for row indexed by 0 */
        { 4, 5, 6, 7 },  /*  initializers for row indexed by 1 */
        { 8, 9, 10, 11 } /*  initializers for row indexed by 2 */
      };
      // equivalent initialization without the optional nested braces for each row
      int ib[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
      int ic[12] =  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
      int id[300][400] = {0}; //这样清零比较爽
      return 0;
    }
    
    
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    int main()
    {
      const size_t rowSize = 3;
      const size_t colSize = 4;
      int ia[rowSize][colSize]; // 12 uninitialized elements
      // for each row
      for(size_t i = 0; i != rowSize; ++i)
      // for each column within the row
        for(size_t j = 0; j != colSize; ++j)
      // initialize to its positional index
          ia[i][j] = i * colSize + j;
    
      return 0;
    }
    
    
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    int main()
    {
      int row=3, col=4;
      int ia[row][col];
      for( int i=0; i!=row; ++i )
        for( int j=0; j!=col; ++j )
          ia[i][j] = i*col+j;
      //
      for( int i=0; i!=row; ++i )
      {
        for( int j=0; j!=col; ++j )
          cout << ia[i][j] << "  ";
        cout << endl;
      }
      
      return 0;
    }
    
    
    // 两维数组的指针
    
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    int main()
    {
      int row=3, col=4;
      int ia[3][4];
      for( int i=0; i!=row; ++i )
        for( int j=0; j!=col; ++j ) {
          ia[i][j] = i*col+j;
          cout << i << ' ' << j << ' ' << &ia[i][j] << endl;
        }
      // 确实是连续存放的
      int *pa=&ia[0][0]; //pa的类型是整数
      int *pb=&ia[1][0];
      cout << pa << ' ' << pb << endl;
      ptrdiff_t n=pb-pa;
      cout << n << endl; // 两行第一个位置之间,差4个位置
      //
      int (*ipa)[4]=ia; // ipa的类型是4个整数!这才是一行的指针
      int (*ipb)[4]=ia; // 这就是定义4个int作为一个数据类型的方法
      ipa = &ia[0];
      ipb = &ia[1];
      cout << endl << ipa << ' ' << ipb << endl;
        
      // pa和ipa的值相同,但意义是不同的,请看:  
      cout << pa+1 << endl; // +1
      cout << ipa+1 << endl; // +4
        
      return 0;
    }
    
    
    // typedef...
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    int main()
    {
      int row=3, col=4;
      int ia[3][4];
      for( int i=0; i!=row; ++i )
        for( int j=0; j!=col; ++j ) {
          ia[i][j] = i*col+j;
          cout << i << ' ' << j << ' ' << &ia[i][j] << endl;
        }
        
      typedef int int_array[4]; //定义4个int作为一个数据类型
      int_array *ipa = ia; //
      cout << endl << ipa << ' ' << ipa+1 
        << ' ' << ipa+2 << endl;
      cout << *ipa << ' ' << *ipa+1 << endl;
      
      for( int_array *p=ia; p!=ia+3; ++p)
        for( int *q=*p; q!=*p+4; ++q)
          cout << *q << endl;
        
      return 0;
    }

    TOP

  • 相关阅读:
    SQLITE3在php中的运用
    C# DllImport用法和路径问题
    ExtJs2.0学习系列(9)Ext.TabPanel之第一式
    ExtJs2.0学习系列(11)Ext.XTemplate
    ExtJs2.0学习系列(12)Ext.TreePanel之第一式
    ExtJs2.0学习系列(10)Ext.TabPanel之第二式
    ExtJs2.0学习系列(6)Ext.FormPanel之第三式(ComboBox篇)
    ExtJs2.0学习系列(15)extjs换肤
    ExtJs2.0学习系列(8)Ext.FormPanel之第五式(综合篇)
    ExtJs2.0学习系列(5)Ext.FormPanel之第二式
  • 原文地址:https://www.cnblogs.com/xin-le/p/4088009.html
Copyright © 2020-2023  润新知