zoukankan      html  css  js  c++  java
  • C++数组和指针

    1:数组

    数组是由类型名、标识符和维数组成的复合数据类型,类型名规定了存放在数组中的元素的类型,而维数则指定数组中包含的元素个数。

    数组定义中的类型名可以是内置数据类型或类类型;除引用之外,数组元素的类型还可以是任意的复合类型。没有所有元素都是引用的数组。 

    数组的维数必须用值大于等于 1 的常量表达式定义

    const int a = 3;   
    //const unsigned sz = get_size() 错误,运行时才知道大小的不行
    //int a = 3;错误 int b[a];

    使用一组字符字面值初始化字符数组时,一定要记得添加结束字符串的空字符。例如,下面的初始化将导致编译时的错误: 

     const char ch3[6] = "Daniel"; // error: Daniel is 7 elements 

    与 vector 不同,一个数组不能用另外一个数组初始化,也不能将一个数组赋值给另一个数组,这些操作都是非法的

    与vector的下表类型是vector::size_type不同数组的下标类型是size_t;

    2:指针

    int main()
    {
        int v = 5;
        int *p = 0; //p initialized to address no object 输出为00000000
        int *p1 = &v;
    
        cout << "p's address is " << p <<endl<< "p1's address is " << p1 << endl;
        
    }

    不初始化的坏处:如果使用未初始化的指针,会将指针中存放的不确定值视为地址,然后操纵该内存地址中存放的位内容。使用未初始化的指针相当于操纵这个不确定地址中存储的基础数据。因此,在对未初始化的指针进行解引用时,通常会导致程序崩溃

    把 int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0。但允许把数值 0 或在编译时可获得 0 值的 const 量赋给指针: 

    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   
    pi = c_ival;    // ok: c_ival is a const with compile-time value of 0  
    pi = 0;         // ok: directly initialize to literal constant 0 

    对指针进行初始化或赋值只能使用以下四种类型的值

    1.  0 值常量表达式(第 2.7 节),例如,在编译时可获得 0 值的整型 const 对象或字面值常量 0。

    2.  类型匹配的对象的地址。

    3.  另一对象末的下一地址。

    4.  同类型的另一个有效指针。 

     把 int 型变量赋给指针是非法的,尽管此 int 型变量的值可能为 0。但允许把数值 0 或在编译时可获得 0 值的 const 量赋给指针: 

    指针可以修改变量的值,对于一个指向const的值的指针也要限定为指向const对象的指针,不然指针修改值就会变动,这样const的值就没意义了。const double *p;

    在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。 

    http://blog.csdn.net/tobacco5648/article/details/8530975 const指针和指向const对象的指针的区别

    动态数组

    每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。C 语言程序使用一对标准库函数malloc 和 free 在自由存储区中分配存储空间,而 C++ 语言则使用 new 和 delete 表达式实现相同的功能。 

    数组变量通过指定类型、数组名和维数来定义。而动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new 表达式返回指向新分配数组的第一个元素的指针 

     int *pia = new int[10]; // array of 10 uninitialized ints 

    此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia。 

    可使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化,对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。 

    int *pia2 = new int[10] (); // array of 10 uninitialized ints 
  • 相关阅读:
    ADO.net方法
    单例模式(Singleton)的6种实现
    小菜学习设计模式(五)—控制反转(Ioc)
    mysql及linux发行版下载源
    Linux应用总结(1):自动删除n天前日志
    linux挂载mount参数优化
    SQL Server Mysql primary key可更新性分析
    SQL Server 排名函数实现
    MySQL select
    MySQL 数据显示宽度
  • 原文地址:https://www.cnblogs.com/yican/p/3900021.html
Copyright © 2011-2022 走看看