精华内容
下载资源
问答
  • /// 声明和初始化时易出现的错误 /// </summary> /// <param name="args"></param> static void Main(string[] args) { int[] array...
    /// <summary>
            /// 声明和初始化时易出现的错误
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                int[] array =new int[5]{0,1};
            }
    

    会出现这种错误信息

    原因是声明和初始化一维数组的语句是错误的,代码“int[5]”告诉编译器数组长度是5,但是只有给其中两个元素赋初始值

    声明数组

    static void Main(string[] args)
            {
                //声明数组并初始化
                int[] arry = new int[5] { 6, 1, 2, 3, 4 };
                int[] arr1 = new int[] { 0, 1, 2, 3, 4 };//省略数组长度
                int[] arr2 ={ 0, 1, 2, 3, 4 }; //省略 new 关键字
                Console.WriteLine("数组 array 的元素个数是{0}",arry.Length);
                Console.WriteLine("数组 array 的元素个数是{0}", arr1.Length);
                Console.WriteLine("数组 array 的元素个数是{0}", arr2.Length);
    

    可以通过 “数组名.Length” 的形式来获得数组的长度
    在这里插入图片描述

    展开全文
  • Java for语句数组

    千次阅读 2018-09-05 20:04:11
    其中声明的循环变量类型必须和数组的类型相同,为了便于理解,可以将上述for语句理解为: “对于循环变量以此取数组的每一个元素的值”。 例:for语句的传统方式与改进方式访问数组。 **public clas...

    JDK1.5对for语句的功能给予扩充,增强,以便更好地遍历数组。语法格式如下:

    for(声明循环变量:数组的名字)**{

    }**

    其中声明的循环变量类型必须和数组的类型相同,为了便于理解,可以将上述for语句理解为:
    “对于循环变量以此取数组的每一个元素的值”。
    例:for语句的传统方式与改进方式访问数组。

    public class Example{
                public static void main(String args[]){
                    int  a[] = {1,2,3,4};
                    char b[] = {'a','b','c','d'};
                    for(int i=0;i<a.length;i++){
                        System.out.println(a[i]);
                    }
                    for(int i=0;i<b.length;i++){
                        System.out.println(b[i]);
                    }
                    for(int i:a){
                        System.out.println(i);
                    }
                    for(int i:a){
                        System.out.println(i);
                    }
                }
            }
    注意:for(声明循环变量:数组的名字)中不可以使用已经声明过的变量。即:
    
    int i = 0for(i:a){ ... }
    这种写法是错误的。
    
    展开全文
  • 较早的编译器是不允许这样做的,所以一些书籍比如以Tc讲解的书本都说数组的下标不能是变量。在vc6.0下亦是如此。 不过在一些较新的编译器如dev c++已经支持了,如下代码不会报错 #include #include int main...
    较早的编译器是不允许这样做的,所以一些书籍比如以Tc讲解的书本都说数组的下标不能是变量。在vc6.0下亦是如此。

    不过在一些较新的编译器如dev c++已经支持了,如下代码不会报错
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
    int a; int i;
    scanf("%d",&a);
    int c[a];
    for( i =0 ;i<a;i++)
    scanf("%d",&c[i]);
    for( i =0 ;i<a;i++)
    printf("%d",c[i]);
    }

    这个和编译器有关,应该是设计到一些标准规范为题吧,最好还是不要这样写~使用动态分配内存是比较把握和通用的

    一维:
    cin>>n;

    int* a=new int[n];

       if ((a) == NULL)

         {}//确保没有动态分配失败

    但是new出来的一定不要忘了delete掉
    delete []a; // 正确的用法
    delete a; // 错误的用法
    后者相当于delete a[0],漏掉了另外n-1个对象。

    二维:
    设有m行n列
    cin>>m>>n;
    int **a = new int* [m];
    for(int i = 0; i < m; i++)
    a[i] = new int [n];
    PS:就相当于产生了一个二维数组a[m][n]了,但是对于我们平时声明的数组a[m][n],a[i][j]=a[i*n+j],因为是连续的一片内存,而这样动态声明的数组任意的a[k]都是一个int*类型,即一个地址了,所以只能a[i][j]或者*(*(a+i)+j)来访问数组的元素,而不能a[i*n+j]这样转换着用了

    释放内存:
    for(int i = 0; i < m; ++i)
    delete []a[i];
    delete []a;

    PS:其实对于c++,我们完全可以充分利用它自己强大而方便的容器,比如vector,之所以动态声明数组,相比是大小不确定,声明太大了怕浪费空间,而vector就不用指定大小,当存的数据变多,自动扩大容量,比如假设vector默认大小是8,当你再往里存第9个元素时,容器自动扩容,变为16,16再不够用,扩为32,2倍2倍的增长,这样就根据需要扩容,不会浪费空间,也可以像普通数组那样直接指定vector的大小,总之普通数组可以的它都可以,普通数组没有的它更有;
    一维:
    vector<int> a;
    a.push_back(k);
    k为待存入数组的数,用法一样,可以a[i]这样直接取数,还有各种自带的方法,使用方便极了
    vector<int> a;
    vector<int> a(5); //指定数组大小是5
    vector<int> a(5,3); //数组大小为5,并初始化数组所有元素值为3
    二维:
    cin>>m>>n;//m行n列
    vector<vector<int> > a(m, vector<int>(n)); 
    for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
    a[i][j] = i*j;
    for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
    cout<<a[i][j]<<' ';

    cout<<endl;


    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    今天归纳总结了一下,希望以后的朋友可以少走些弯路

    一 :关于指针和堆的内存分配

    先来介绍一下指针 : 指针一种类型,理论上来说它包含其他变量的地址,因此有的书上也叫它:地址变量。既然指针是一个类型,是类型就有大小,在达内的服务器上或者普通的PC机上,都是4个字节大小,里边只是存储了一个变量的地址而已。不管什么类型的指针,char * ,int * ,int (*) ,string * ,float * ,都是说明了本指针所指向的地址空间是什么类型而已,了解了这个基本上所有的问题都好象都变的合理了。

    在C++中,申请和释放堆中分配的存贮空间,分别使用new和delete的两个运算符来完成:
    指针类型 指针变量名=new 指针类型 (初始化);
    delete 指针名;
    例如:1、 int *p=new int(0);
    它与下列代码序列大体等价:
    2、int tmp=0, *p=&tmp;
    区别:p所指向的变量是由库操作符new()分配的,位于内存的堆区中,并且该对象未命名。
      
    下面是关于new 操作的说明 : 部分引自<<C++面向对象开发>>
    1、new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有名字。
    2、一般定义变量和对象时要用标识符命名,称命名对象,而动态的称无名对象(请注意与栈区中的临时对象的区别,两者完全不同:生命期不同,操作方法不同,临时变量对程序员是透明的)。
    3、堆区是不会在分配时做自动初始化的(包括清零),所以必须用初始化式(initializer)来显式初始化。new表达式的操作序列如下:从堆区分配对象,然后用括号中的值初始化该对象。

    下面是从堆中申请数组

    1、申请数组空间:
    指针变量名=new 类型名[下标表达式];
    注意:“下标表达式”不是常量表达式,即它的值不必在编译时确定,可以在运行时确定。这就是堆的一个非常显著的特点,有的时候程序员本身都不知道要申请能够多少内存的时候,堆就变的格外有用。
    2、释放数组空间:
    delete [ ]指向该数组的指针变量名;
    注意:方括号非常重要的,如果delete语句中少了方括号,因编译器认为该指针是指向数组第一个元素的,会产生回收不彻底的问题(只回收了第一个元素所占空间),我们通常叫它“内存泄露”,加了方括号后就转化为指向数组的指针,回收整个数组。delete [ ]的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。<<Think in c++>>上说过以前的delete []方括号中是必须添加个数的,后来由于很容易出错,所以后来的版本就改进了这个缺陷。
    下面是个例子,VC上编译通过
    #include<iostream>
    using namespace std;
    //#include <iostream.h>  //for VC
    #include <string.h>
    void main(){
    int n;
    char *p;
    cout<<"请输入动态数组的元素个数"<<endl;
    cin>>n; //n在运行时确定,可输入17
    p=new char[n]; //申请17个字符(可装8个汉字和一个结束符)的内存空间strcpy(pc,“堆内存的动态分配”);//
    cout<<p<<endl;
    delete []p;//释放pc所指向的n个字符的内存空间return ; }


    通过指针使堆空间,编程中的几个可能问题

    1.动态分配失败。

    返回一个空指针(NULL),表示发生了异常,堆资源不足,分配失败。

    data = new double [m]; //申请空间
    if ((data ) == 0)…… //或者==NULL


    2.指针删除与堆空间释放。

    删除一个指针p(delete p;)实际意思是删除了p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身,释放堆空间后,p成了空悬指针,不能再通过p使用该空间,在重新给p赋值前,也不能再直接使用p。


    3.内存泄漏(memory leak)和重复释放。

    new与delete 是配对使用的, delete只能释放堆空间。如果new返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另分配,而这个时候又去释放的话,会导致一个很难查出来的运行时错误。所以必须妥善保存new返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间。


    4.动态分配的变量或对象的生命期。

    无名变量的生命期并不依赖于建立它的作用域,比如在函数中建立的动态对象在函数返回后仍可使用。我们也称堆空间为自由空间(free store)就是这个原因。但必须记住释放该对象所占堆空间,并只能释放一次,在函数内建立,而在函数外释放是一件很容易失控的事,往往会出错,所以永远不要在函数体内申请空间,让调用者释放,这是一个很差的做法。你再怎么小心翼翼也可能会带来错误。
    类在堆中申请内存 :
    通过new建立的对象要调用构造函数,通过deletee删除对象要调用析构函数。
    CGoods *pc;
    pc=new CGoods; //分配堆空间,并构造一个无名对象
    //的CGoods对象;
    …….
    delete pc; //先析构,然后将内存空间返回给堆; 堆对象的生命期并不依赖于建立它的作用域,所以除非程序结束,堆对象(无名对象)的生命期不会到期,并且需要显式地用delete语句析构堆对象,上面的堆对象在执行delete语句时,C++自动调用其析构函数。
    正因为构造函数可以有参数,所以new后面类(class)类型也可以有参数。这些参数即构造函数的参数。
    但对创建数组,则无参数,并只调用缺省的构造函数。见下例类说明:

    class CGoods{
    char Name[21];
    int Amount;
    float Price;
    float Total_value;
    public:
    CGoods(){}; //缺省构造函数。因已有其他构造函数,系统不会再自动生成缺省构造,必须显式声明。 CGoods(char* name,int amount ,float price){
    strcpy(Name,name);
    Amount=amount;
    Price=price;
    Total_value=price*amount;  }
    ……};//类声明结束
    下面是调用机制 :

    void main(){
    int n;
    CGoods *pc,*pc1,*pc2;
    pc=new CGoods(“hello”,10,118000);
    //调用三参数构造函数 pc1=new CGoods(); //调用缺省构造函数 cout<<”输入商品类数组元素数”<<endl;
    cin>>n;
    pc2=new CGoods[n];
    //动态建立数组,不能初始化,调用n次缺省构造函数
    ……
    delete pc;
    delete pc1;
    delete []pc2; }

    申请堆空间之后构造函数运行;
    释放堆空间之前析构函数运行;
    再次强调:由堆区创建对象数组,只能调用缺省的构造函数,不能调用其他任何构造函数。如果没有缺省的构造函数,则不能创建对象数组。



    ---------------------下面我们再来看一下指针数组和数组指针―――――――――――――
    如果你想了解指针最好理解以下的公式 :
    (1)int*ptr;//指针所指向的类型是int

      (2)char*ptr;//指针所指向的的类型是char

      (3)int**ptr;//指针所指向的的类型是int* (也就是一个int * 型指针)

      (4)int(*ptr)[3];//指针所指向的的类型是int()[3] //二维指针的声明

    (1)指针数组:一个数组里存放的都是同一个类型的指针,通常我们把他叫做指针数组。

    比如 int * a[10];它里边放了10个int * 型变量,由于它是一个数组,已经在栈区分配了10个(int * )的空间,也就是32位机上是40个byte,每个空间都可以存放一个int型变量的地址,这个时候你可以为这个数组的每一个元素初始化,在,或者单独做个循环去初始化它。

    例子:
    int * a[2]={ new int(3),new int(4) }; //在栈区里声明一个int * 数组,它的每一个元素都在堆区里申请了一个无名变量,并初始化他们为3和4,注意此种声明方式具有缺陷,VC下会报错
    例如 :
    int * a[2]={new int[3],new int[3]};
    delete a[0];
    delet a[10];
    但是我不建议达内的学生这么写,可能会造成歧义,不是好的风格,并且在VC中会报错,应该写成如下 :
    int * a[2];
    a[0]= new int[3];
    a[1]=new int[3];
    delete a[0];
    delet a[10];
    这样申请内存的风格感觉比较符合大家的习惯;由于是数组,所以就不可以delete a;编译会出警告.delete a[1];
    注意这里 是一个数组,不能delete [] ;


    (2) 数组指针 : 一个指向一维或者多维数组的指针;
    int * b=new int[10]; 指向一维数组的指针b ;
    注意,这个时候释放空间一定要delete [] ,否则会造成内存泄露, b 就成为了空悬指针.

    int (*b2)[10]=new int[10][10]; 注意,这里的b2指向了一个二维int型数组的首地址.
    注意:在这里,b2等效于二维数组名,但没有指出其边界,即最高维的元素数量,但是它的最低维数的元素数量必须要指定!就像指向字符的指针,即等效一个字符串,不要把指向字符的指针说成指向字符串的指针。这与数组的嵌套定义相一致。
    int(*b3) [30] [20]; //三级指针――>指向三维数组的指针;
    int (*b2) [20]; //二级指针;
    b3=new int [1] [20] [30];
    b2=new int [30] [20];
    两个数组都是由600个整数组成,前者是只有一个元素的三维数组,每个元素为30行20列的二维数组,而另一个是有30个元素的二维数组,每个元素为20个元素的一维数组。
    删除这两个动态数组可用下式:
    delete [] b3; //删除(释放)三维数组;
    delete [] b2; //删除(释放)二维数组;
    再次重申:这里的b2的类型是int (*) ,这样表示一个指向二维数组的指针。
    b3表示一个指向(指向二维数组的指针)的指针,也就是三级指针.

    (3)二级指针的指针
    看下例 :
    int (**p)[2]=new (int(*)[3])[2];
    p[0]=new int[2][2];
    p[1]=new int[2][2];
    p[2]=new int[2][2];
    delete [] p[0];
    delete [] p[1];
    delete [] p[2];
    delete [] p;
    注意此地方的指针类型为int (*),碰到这种问题就把外边的[2]先去掉,然后回头先把int ** p=new int(*)[n]申请出来,然后再把外边的[2]附加上去;
    p代表了一个指向二级指针的指针,在它申请空间的时候要注意指针的类型,那就是int (*)代表二级指针,而int (**)顾名思义就是代表指向二级指针的指针了。既然是指针要在堆里申请空间,那首先要定义它的范围:(int(*)[n])[2],n 个这样的二级指针,其中的每一个二级指针的最低维是2个元素.(因为要确定一个二级指针的话,它的最低维数是必须指定的,上边已经提到)。然后我们又分别为p[0],p[1],p[2]…在堆里分配了空间,尤其要注意的是:在释放内存的时候一定要为p[0],p[1],p[2],单独delete[] ,否则又会造成内存泄露,在delete[]p 的时候一定先delete p[0]; delete p[1],然后再把给p申请的空间释放掉 delete [] p ……这样会防止内存泄露。

    (4)指针的指针:
    int ** cc=new (int*)[10]; 声明一个10个元素的数组,数组每个元素都是一个int *指针,每个元素还可以单独申请空间,因为cc的类型是int*型的指针,所以你要在堆里申请的话就要用int *来申请;
    看下边的例子 (vc & GNU编译器都已经通过);
    int ** a= new int * [2];     //申请两个int * 型的空间
    a[1]=new int[3];        //为a的第二个元素又申请了3个int 型空间,a[1]指向了此空间首地址处
    a[0]=new int[4];        为a的第一个元素又申请了4个int 型空间,a[0] 指向了此空间的首地址处
    int * b;
    a[0][0]=0;
    a[0][1]=1;
    b=a[0];
    delete [] a[0]       //一定要先释放a[0],a[1]的空间,否则会造成内存泄露.;
    delete [] a[1];
    delete [] a;
    b++;
    cout<<*b<<endl; //随机数
    注意 :因为a 是在堆里申请的无名变量数组,所以在delete 的时候要用delete [] 来释放内存,但是a的每一个元素又单独申请了空间,所以在delete [] a之前要先delete [] 掉 a[0],a[1],否则又会造成内存泄露.


    (5) 指针数组:
    我们再来看看第二种 :二维指针数组
    int *(*c)[3]=new int *[3][2];
    如果你对上边的介绍的个种指针类型很熟悉的话,你一眼就能看出来c是个二级指针,只不过指向了一个二维int * 型的数组而已,也就是二维指针数组。
    例子 :
    int *(*b)[10]=new int*[2][10];//
    b[0][0]=new int[100];
    b[0][1]=new int[100];
    *b[0][0]=1;
    cout <<*b[0][0]<<endl; //打印结果为1
    delete [] b[0][0];
    delete [] b[0][1];
    delete [] b;
    cout<<*b[0][0]<<endl; //打印随机数
     这里只为大家还是要注意内存泄露的问题,在这里就不再多说了。
    如果看了上边的文章,大家估计就会很熟悉,这个b是一个二维指针,它指向了一个指针数组

    第二种 :
    int **d[2];表示一个拥有两个元素数组,每一个元素都是int ** 型,这个指向指针的指针:)
       d不管怎样变终究也是个数组,呵呵,
       如果你读懂了上边的,那下边的声明就很简单了:
       d[0]=new int *[10];
       d[1]=new int * [10];
    delete [] d[0];
    delete [] d[1];
    具体的就不再多说了 :)



    二 : 函数指针 

    关于函数指针,我想在我们可能需要写个函数,这个函数体内要调用另一个函数,可是由于项目的进度有限,我们不知道要调用什么样的函数,这个时候可能就需要一个函数指针;

    int a();这个一个函数的声明;
    ing (*b)();这是一个函数指针的声明;
    让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数(本例中参数是空)。注意本例中还没有创建指针变量-只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:
    unsigned psize = sizeof (int (*) ()); 获得函数指针的大小
    // 为函数指针声明类型定义
    typedef int (*PFUNC) ();

    PFUNC是一个函数指针,它指向的函数没有输入参数,返回int。使用这个类型定义名可以隐藏复杂的函数指针语法,就我本人强烈建议我们大内弟子使用这种方式来定义;

    下面是一个例子,一个简单函数指针的回调(在GNU编译器上通过,在VC上需要改变一个头文件就OK了)

    #include<iostream> //GNU 编译器 g++ 实现
    using namespace std;


    #define DF(F) int F(){ cout<<"this is in function "<<#F<<endl;
    return 0; 
    }
    //声明定义DF(F)替代 int F();函数;
    DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g); DF(h); DF(i); //声明定义函数 a b c d e f g h i

    // int (*pfunc)(); //一个简单函数指针的声明
    typedef int(*FUNC)(); //一个函数指针类型的声明

    FUNC ff[] = {a,b,c,d,e,f,g,h,i}; //声明一个函数指针数组,并初始化为以上声明的a,b,c,d,e,f,g,h,i函数

    FUNC func3(FUNC vv){ //定义函数func3,传入一个函数指针,并且返回一个同样类型的函数指针
    vv();
    return vv;
    }



    int main(){
    for(int i=0;i<sizeof(ff)/sizeof (FUNC);i++){ //循环调用函数指针
    FUNC r=func3(ff[ i ]);
    cout<<r()<<endl; //输出返回值,只是返回了0
    }
    return 0;
    }
    到目前为止,我们只讨论了函数指针及回调而没有去注意ANSI C/C++的编译器规范。许多编译器有几种调用规范。如在Visual C++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C++ Builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。
    好了,先到此为止吧,写这篇文章耗费了基本上快半天的时间了,很多事情还没有做,等改天有时间再回来整理,所有的源程序都放在openlab3服务器上我的目录下lib/cpp下,大家可以去拿。不知道的登陆openlab3 然后cd ~chengx/lib/cpp就可以看到了。

    还有很复杂的声明可能也是一种挑战 比如<<Think in c++>>里的
    int (*(*f4())[10]();的声明,f4是一个返回指针的函数,该指针指向了含有10个函数指针的数组,这些函数返回整形值;不是这个函数有特别之处,而是Bruce Eckel 说的“从右到左的辨认规则”是一种很好的方法,值得我们去学习,感谢他:)

    最后我想应该跟大家说一下,写程序应该就象JERRY所说的:简单就是美;我们应该遵循一个原则 : KISS (Keep It Simple,Stupid ,尽量保持程序简单 出自 :《Practical C programming》),把自己的程序尽量的简单明了,这是个非常非常好的习惯。





    展开全文
  • 数组

    2014-03-17 12:13:43
    声明数组: typeName arrayNAme [arraySize] 计算机必须在程序执行之前就已经知道数组的大小,因此中括号内只能是一个常量表达式,而不能含有变量。 在初始化数组时,大括号中的值的个数不能大于声明数组的大小,...

    声明数组:

    typeName arrayNAme [arraySize]

    计算机必须在程序执行之前就已经知道数组的大小,因此中括号内只能是一个常量表达式,而不能含有变量。

    在初始化数组时,大括号中的值的个数不能大于声明数组的大小,也不能通过添加逗号的方式跳过。但是初始化值的个数可以小于声明数组的大小,此时仅对前面一些有初始化值的元素依次进行初始化。比如:

    int array1[3]={0,1,2}; //正确

    int array2[3]={0,1,2,3}; //错误,初始化值个数大于数组大小

    int array3[3]={0,,2}; //错误,初始化值被跳过

    int array4[3]={0,1,}; //错误,初始化值被跳过(即使是最后一个元素,添加逗号也被认为是跳过)

    int array5[3]={0,1}; //正确,省略初始化最后一个元素


    如果只对数组的一部分进行初始化,则编译器将把其他元素都设置为0 。

    可以不在大括号内包含任何东西,这将把所有元素都设置为0。

    int array6[3]={0}; //{0,0,0}

    int array7[3]={}; //{0,0,0}

    int array8[3]={1}; //{1,0,0}

    int array9[3];//会是3个任意的数值

     

    C++中,下标是从0开始的,所以一个大小为n的数组,它的有效下标是0到n-1

    int array[5];

    数组所含元素个数: sizeof(array) / sizeof(int);

     

            在计算机里,就好像有许许多多的开关,用导通(开)来表示1,用断开(关)来表示0。当只有一个开关的时候,这个开关能表示两种状态,即01;当有两个开关的时候,这两个开关可以表示四种状态,即00011011……,当有8个开关的时候,可以表示2^8=256种状态,分别是0~255在计算机中,就是用8个开关(01)来表示一个字节(Byte)的,每一个开关(01)称为一个Bit),即8位组成一个字节。把一个字节所能表示的256种状态和256个字符按一定的顺序一一对应起来,一个字节就可以表示256种不同的字符。这种用8位二进制表示一个字符的编码称为ASCII码,它的全称是美国信息交换标准码(America Standard Code for Information Interchange)。需要记住的ASCII码有三个,数字0ASCII码为十进制的48,大写字母AASCII码为十进制的65,小写字母aASCII码为十进制的97

     

    只有在定义数组时才能使用初始化,不能将一个数组赋值给另一个数组。

     

    字符型数组:

     

    空字符( \0 )(实际上是被设置为0的字节)

     

    “S”是字符串常量(使用双引号),表示的是两个字符(字符S和\0)组成的字符串。

    (实际上表示的是字符串的第一个元素所在的内存地址

    ‘S’是字符常量(使用单引号),在ASCII系统上,表示的是83。

     

    cin使用空白(空格,制表符(Tab)和换行符)来确定字符串的结束位置。

     

    getline()函数读取整行,通过换行符来确定输入结尾,但不保存换行符;在存储时,用空字符来替换换行符。(getline(cin,str); )

     

    get()函数读取整行,但并不丢弃换行符,而是将其留在输入队列中,因此如果不借助于帮助,get()奖不能跨过换行符。

    可用不带任何参数的cin.get()调用可读取的下一个字符(即便是换行符),因此可以用它来处理换行符,为读取下一行输入做好准备。

           charc1[20],c2[20];

           cin.get(c1,20);

           cin.get();

           cin.get(c2,20);

    注意:getline()使用起来简单一些,但get()使得检查错误更简单些。

     

    头文件cstring:

    strlen()函数计算可见字符的长度(不把空字符计算在内)

    strcpy()函数可将字符串复制到字符数组中

    strcat()函数可将字符串附加到字符数组末尾


    向函数传递数组:

    int max(int [],int);  //函数的声明

    int max(int a[],int size)  //函数的定义(数组的名称 +数组含有元素的数目 )
    {

           //
     }

    为什么不在函数里面用sizeof算出数组的大小,而非要在函数外面计算好了,再作为参数传递给函数呢?

            参数的传递是将实参的值赋给形参。然而对于数组来说却是一个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址(如果在函数中,用sizeof计算数组的大小,得到的是一个元素的大小),函数在需要用到后面元素时再按照这个地址和数组下标去查找(因此在函数中改变数组中的数值,就是直接对数组进行操作)。因为后面的元素根本没进入函数,所以在函数里求不出数组的大小。


            数组名实质上是一个指向数组首元素指针。也就是说,可以用数组名来初始化一个对应类型的指针。

    #include<iostream>
    
    using namespace std;
    int main()
    {
       int a[6]={1,2,3,4,5,6};
       int *pt=a;
       for(int i=0;i<6;++i)
          cout<<a[i]<<pt[i]<<*(pt+i)<<*(a+i)<<endl;
       return 0;
    }
    
    //运行结果:
    //5555
    //3333
    //4444
    //1111
    //2222
    //6666
    

           根据上面的这段程序,可以知道a[i]、pt[i]、*(pt+i)、*(a+i)都能够访问到数组的元素。所以,上述四者是等价的。虽然数组名是指针,但它是一个指针常量。也就是说,不带下标的数组名不能作为左值。

            指针是一种数据类型,所以,我们可以用指针类型来创建一个数组。声明一个指针数组的语句格式是:int* a[10];

    展开全文
  • 数组声明与使用

    万次阅读 多人点赞 2017-01-18 18:19:24
    一、数组的概念 所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为...
  • 主要用于数组array, 对象{}/map, set进行循环流程处理. 2.学习/操作 1.普通for循环 自行指定循环次数 2.for..in循环 属历史遗留,用于遍历对象的属性(数组的索引值也算属性)。 但有...
  • 上个月稀里糊涂的犯了两次差不多的问题.....特记下,以示警醒。 第一次:悲催的改了三次代码... ...通过接口执行特定语句(就是我打印出来的语句)。 第一次代码: $config = array( array(1,2,3,4), array(...
  • 一维数组声明与使用

    千次阅读 2018-09-04 10:33:18
    一维数组声明与使用 1、一维数组的本质就是在内存中申请一段连续区域,用于记录多个类型相同的数据。 数组名:指数组的名称,用于记录连续内存区域内在内存中的首地址,类似于容器。 数组元素:主要指存放在...
  • 一、建立数组对象    我们再介绍JAVAScript的数组对象的建立方法。(其实这种方法和前面的方法在本质上是一样的,...1、在声明数组时仅仅声明数组内有几个组件。 var 数组对象名称 = new Array(组件个数);
  • 数组声明及初始化

    2016-11-03 16:41:56
    数组Array:相同类型数据的集合就叫做数组数组长度(length),指的是数组元素的个数,元素的索引是从0开 始,最大索引==数组长度-1。 一、一维数组 1、一维数组定义: a)单独声明 格式: type[] ...
  • Java控制语句数组与方法

    千次阅读 2021-06-07 11:45:17
    4.4.1 什么是索引 4.4.2 访问数组元素格式 4.5 案例 5 内存分配 5.1 Java中的内存分配 5.1.1 常量池 5.1.2 栈 5.1.3 堆 5.2 数组的内存分配 5.2.1 单个数组的内存分配 5.2.2 两个数组的内存分配 5.2.3 声明数组对象...
  • java循环语句,一维数组

    千次阅读 2018-10-16 16:22:56
    1、实现二分查找算法:有序的数组 public class TestDemo1 { public static int binary(int[] array, int key) {//key为要查找的数 Arrays.sort(array);//正序排列数组 System.out.println(&amp;amp;amp;...
  • 数组声明和定义的注意事项

    万次阅读 2018-02-08 11:53:26
    一、不允许数组拷贝和赋值... //错误:不能把一个数组直接赋值给另一个数组二、复杂的数组声明int arr[10];int *ptrs[10]; //ptrs是含有10个整形指针的数组int &amp;refs[10]=/*?*/; //错误:不存在引用的数组i...
  • 数组的定义与声明解析

    千次阅读 2007-04-20 23:12:00
    数组是有序数据的集合。数组中的元素可以不属于同一个数据类型。用一个统一的数组名和下标来...下面只介绍用 Dim声明数组的方法。1.数组的定义与声明数组的定义语法如下:Dim 数组名( [[下标下界 To ] 下标上界]
  • Java数组声明与初始化

    2021-01-04 11:31:27
    初始化就是为数组的数组元素分配内存空间,并为每个数组元素附初始值。 注意:数组完成初始化后,内存空间中针对该数组的各个元素就有个一个默认值: 基本数据类型的整数类型(byte、short、int、long)默认值是...
  • java数组

    2018-03-31 11:44:39
    1.声明数组 在java中声明数组有两种形式: 数组元素类型名[] 数组名; 数组元素类型名 数组名 []; 例如: int[] array; int array[]; 2.初始化数组 按照上例那样声明数组,并不会为数组分配内存,要真正...
  • Java 数组

    千次阅读 2018-05-24 14:55:06
    Java 数组数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素。你可以声明一个数组变量,如 ...声明数组变...
  • * 流程控制语句【掌握】 * 顺序结构 * 选择结构 * 循环结构 * for循环 【掌握】 * while循环【掌握】 * do...while循环【理解】 * 控制循环语句【掌握】 * 控制嵌套【掌握】 * Random随机数【了解】 * ...
  • 数组的定义,声明实例化

    千次阅读 2018-04-16 23:15:00
    为什么要定义数组: 方法不能返回多个值 将欲返回的多个值放在数组中,就可以间接实现返回多个值的效果数组声明实例化通过数组名加数组下标,来使用数组中的数据。下标从 0 开始排序。声明一维数组数组元素...
  • 数组声明以及初始化

    千次阅读 2016-10-13 16:38:35
    本文转载自:... 1、字符数组的定义与初始化  字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。  char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};
  • 在一些公司使用C语言开发,对于圈复杂度有一定的要求,其中switch就是造成高圈复杂的原因之一,这里分享一种方法降低圈复杂,使用数组代替switch,直接上代码,代码简单明了,如果发现代码中有问题或者疑惑可以提...
  • 摘要:C语言的申明存在的最大问题是:你...而C语言中比较绕人的指针数组和数组指针的问题,int *ap[]和int (*ap)[]谁是指针数组,谁又是数组指针?这里面声明的解析规则是什么样的?本文主要为你解答这些疑惑。
  • const与数组声明

    千次阅读 2010-02-03 20:14:00
    在libidn的stringprep.h里面,有这样的声明:extern IDN_DLL_VAR const Stringprep_profiles stringprep_profiles[];extern IDN_DLL_VAR const Stringprep_table_element stringprep_rfc3454_A_1[]; 声明的实现在c...
  • C++中动态二维数组声明方式 在C/C++中定义动态数组时我们都很熟悉使用的是 new 关键字,基本语法如下: typeName *arrayName = new typeName[arraySize]; 比如若想通过输入的 n 来创建一个数组大小为 n 的 int 型...
  • C#数组

    千次阅读 2013-09-01 10:44:57
    C#数组定义和初始化 一维数组 一维数组以线性方式存储固定数目的项,只需一个索引值即可标识任意一个项。在 C# 中,数组声明中的方括号必须跟在数据类型...声明数组后,可以使用 new 关键字设置其大小, 方式二 i
  • C语言数组

    千次阅读 2019-08-03 19:45:50
    超女选秀的第一组有5名超女,请提供一个界面,输入每位超女的体重,最后计算出超女的的平均体重。 用我们之前学习过的知识,程序示例如下: 示例(book41.c) ...数组有一个数组名,通过下标访问数组...
  • C++中数组声明与赋值

    千次阅读 2014-03-05 14:01:21
    1、C++中提供了两种类似于vector和迭代器类型的低级复合类型-数组和指针。首先,数组和vector区别:数组的长度是固定的,数组一经创建,就不允许添加新的元素。而指针可以像迭代器一样用于遍历和检查数组中的元素。 ...
  • C/C++中有两个非常容易混淆的十分常用的但是又特别不引起人注意的两个概念,指针数组和数组指针,或许你已经对这两个概念早有耳闻,但是不知你有没有对他们做过细致的分析来区别二者呢?...而声明数组

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 173,465
精华内容 69,386
关键字:

下面声明数组的语句错误的是