精华内容
下载资源
问答
  • c++对数组引用
    2014-05-20 14:17:33
    所谓数组引用,即指向数组的引用;
    如    int   a[10] ;   
         int   (&b)[10] = a ;
    如果写成 int   a[10] ;
                    int* &b = a ;
    将会报错: cannot convert from 'int [10]' to 'int *&'。
      或许你会说在数组名不就是指向这个数组的一个指针吗?题中a是int*类型的,b是指向int*的引用,按理应该是正确的啊,为什么会报错呢?这是因为编译器对指向数组的引用检查更加严格,需要检查数组的维数,在这里a被理解成指向10个int数组的指针int [10],对于引用也需要相应的引用类型int (&)[10],即指向10个int数组的指针的引用。
    c和c++中有一个“数组降价”问题。
    #include <iostream>
    void test( char arr[100] )
    {
         std::cout << sizeof(arr) << std::endl ; // 输出 4
    }
    int main()
    {
        char arr[100] = { 0 };
        std::cout << sizeof(arr) << std::endl; // 输出 100 
        test( arr );

        return 0 ;
    }
    这段代码的输出是100
                                4

          对于同样的arr,一个输出100,另一个输出4。是因为void test( char arr[100] )中的arr被降价了。
    void test( char arr[100] ) 中的arr被降阶处理了,
           void test( char arr[100] ) 等同于void test( char arr[] ), 也等同于
      void test( char* const arr ) 如果你原意,它甚至等同于
      void test( char arr[10] )
      编译器对数组的维数不作检查。
    也就是说
    void test( char arr[100] )
    {
         std::cout << sizeof(arr) << std::endl;
    }

    被降成
    void test( char* const arr )
    {       std::cout << sizeof(arr) << std::endl; // 既然是char*,当然输出4
    }     这样,即然不检查数组的大小,对于需要保证数组大小的程序就会带来问题。如何解决这个问题呢?可以用c++中的对数组的引用。
    看下面这段代码:
    ......
    void test( const char (&arr)[100] )
    {
         std::cout << sizeof(arr) << std::endl ; // 输出 100
    }
    ......
        char arr[100] = { 0 };
        std::cout << sizeof(arr) << std::endl; // 输出 100 
        test( arr );
    ......
    这样test就能接受100个char的数组,且只能接受大小为100的char数组
    如果
      char arr[20] = {0};
           test( arr ) ;
    就会报错
      在C++ 中,对数组的引用可以直接传递数组名,因为数组的大小的信息已在形参里提供了。但是这样一来我们只能固定数组的大小来用这个函数了。用模板加数组的引用可以解决这个问题,看如下代码:
    template <int sz>
    void test(char (&arr)[sz])
    {
        for ( int i = 0; i < sz; i++ )
              ......
    }
    char a[2] = { 0 },
    char b[15] = { 0 };
    test(a);  //ok
    test(b);  //ok......
         这样解决了数组长度可变的问题,但也引入了新的问题:
    (1)当有多个不同的test调用时,会产生多份test代码。而传统的函数调用只有一份代,也调用的次数无关。
    (2)由于这些代码都是在编译阶段生成的,它需要知道引用数组的大小。所以这样写的函数显然不能用指针变量作为函数的参数,因此不能用这个函数处理动态分配的内存区域,这样的区域的大小是在运行时确定的。
    更多相关内容
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼西工大机考《C语言程序设计》网考寻求答案(非免费)找我Q...,以下选项中对a数组元素正确引用的是( )。A.a[2][!1]B.a[2][3]C.a[0][3]D.a[1>2][!1]2. 以下描述错误的是...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    西工大机考《C语言程序设计》网考

    寻求答案(非免费)找我Q和V:2082851315

    试卷总分:100 得分:96

    一、 单选题 (共 35 道试题,共 70 分)

    1. 若有定义:int a[2][3];,以下选项中对a数组元素正确引用的是( )。

    A.a[2][!1]

    B.a[2][3]

    C.a[0][3]

    D.a[1>2][!1]

    2. 以下描述错误的是( )。

    A.break语句不能用于循环语句和switch语句外的任何其他语句

    B.在switch语句中使用break语句或continue语句的作用相同

    C.在循环语句中使用continue语句是为了结束本次循环,而不是终止整个循环

    D.在循环语句中使用break语句是为了使流程跳出循环体,提前结束循环

    3. 以下存储类型只有在使用时才为该类型变量分配内存的是( )。

    A.auto和static

    B.auto和register

    C.register和static

    D.static和extern

    4. 若变量已正确定义,有以下程序段

    int a=3,b=5,c=7;

    if(a>b) a=b; c=a;

    if(c!=a) c=b;

    printf("%d,%d,%d\n",a,b,c);

    其输出结果是( )。

    A.程序段有语法错

    B.3,5,3

    C.3,5,5

    D.3,5,7

    5. 函数strlen("1234\0xy")的值为( )。

    A.7

    B.8

    C.4

    D.9

    6. 若二维数组a由m列,则在a[i][j]之前的元素个数为( )。

    A.j*m+i

    B.i*m+j

    C.i*m+j-1

    D.i*m+j+1

    7. 假定x和y为 double型,则表达式x=2,y=x+3/2的值是( )。

    A.3.500000

    B.3

    C.2.000000

    D.3.000000

    8. 设变量已正确定义并赋值,以下正确的表达式是( )。

    A.x=y*5=x+z

    B.int(15.8%5)

    C.x=y+z+5,++y

    D.x=25%5.0

    9. 在C语言中,设一表达式中包含有int,long,char和unsigned类型的变量和数据,则这4种类型数据转换的规则是( )。

    A.int→unsingned→long→char

    B.char→int→long→unsingned

    C.char→int→unsigned→long

    D.int→char→unsigned→long

    10. 若有说明:int *p,m=5,n;,以下正确的程序段是( )。

    A.p=&n;scanf("%d",&p);

    B.p=&n;scanf("%d",*p)

    C.scanf("%d",&n);*p=n;

    D.p=&n;*p=m;

    11. 在C语言中,变量的隐含存储类别是( )。

    A.auto

    B.static

    C.extern

    D.无存储类别

    12. 函数的功能是交换变量x和y中的值,且通过正确调用返回交换的结果。能正确执行此功能的函数是( )。

    A.funa(int *x, int *y)

    { int *p;

    *p=x; *x=*y; *y=*p;

    }

    B.funb(int x, int y)

    { int t;

    t=x; x=y; y=t;

    }

    C.func(int *x, int *y)

    { *x=*y; *y=*x;

    }

    D.{fund(int *x, int *y)

    13. 在C语言中,只有在使用时才占用内存单元的变量,其存储类型是 ( )。

    A.auto和register

    B.extern和register

    C.auto和static

    D.static和register

    14. 以下定义语句中正确的是( )。

    A.int a=b=0;

    B.char A=65+1,b=′b′;

    C.float a=1,*b=&a,*c=&b;

    D.double a=0.0;b=1.1;

    15. 以下描述中正确的是( )。

    A.由于do-while循环中循环体语句只能是一条可执行语句,所以循环体内不能使用复合语句

    B.do-while循环由do开始,用while结束,在while(表达式)后面不能写分号

    C.在do-while循环体中,是先执行一次循环,再进行判断

    D.do-while循环中,根据情况可以省略while

    16. 下面程序的输出结果是( )。

    main()

    {

    int s,k;

    for(s=1,k=2;k<5;k++) s+=k;

    printf("%d\n",s);

    A.1

    B.9

    C.0

    D.15

    17. 以读写方式打开一个已有的文件file1,下面有关fopen函数正确的调用方式为( )。

    A.FILE *fp;fp=fopen("file1";"f");

    B.FILE *fp;fp=fopen("file1","r+");

    C.FILE *fp;fp=fopen("file1","rb");

    D.FILE *fp;fp=fopen("file1","rb+");

    18. 设int a=12,则执行完语句a+=a-=a*a后,a的值是( )。

    A.552

    B.264

    C.144

    D.-264

    19. 阅读下列程序,则运行结果为( )。

    #include "stdio.h"

    fun()

    { static int x=5;

    x++;

    return x;\

    A.5

    B.6

    C.7

    D.8

    20. 运行下面程序:

    main()

    {

    int n1,n2;

    scanf("%d",&n2);

    while(n2!=0)

    \ n1=n2%10;

    n2=n2/10;

    }

    printf("%d",n1);

    }若从键盘上输入298↙ ,则输出结果为( )。

    A.2

    B.29

    C.8

    D.0

    21. C语言规定,在一个源程序中,main函数的位置( )。

    A.必须在最开始

    B.必须在系统调用的库函数的后面

    C.可以任意

    D.必须在最后

    22. 已知double *p[6]; 它的含义是( )。

    A.p是指向double类型变量的指针

    B.p是double类型数组

    C.p是指针数组

    D.p是数组指针

    23. 以下叙述中错误的是( )。

    A.在程序中凡是以"#"开始的语句行都是预处理命令行

    B.预处理命令行的最后不能以分号表示结束

    C.#define MAX 是合法的宏定义命令行

    D.C程序对预处理命令行的处理是在程序执行的过程中进行的

    24. 为了判断两个字符串s1和s2是否相等,应当使用( )。

    A.if(s1==s2)

    B.if(s1=s2)

    C.if(strcpy(s1, s2))

    D.if(strcmp(s1, s2)==0)

    25. 在下列结论中,只有一个是正确的,它是( )。

    A.递归函数中的形式参数是自动变量

    B.递归函数中的形式参数是外部变量

    C.递归函数中的形式参数是静态变量

    D.递归函数中的形式参数可以根据需要自己定义存储类型

    26. 以下不正确的定义语句是( )。

    A.double x[5]={2.0,4.0,6.0,8.0,10.0;

    B.int y[5]={0,1,3,5,7,9;

    C.char c1[]={′1′,′2′,′3′,′4′,′5′;

    D.char c2[]={′\x10′, ′xa′, ′\x8′;

    27. 有以下程序段

    int n=0,p;

    do

    { scanf("%d",&p);n++;

    }while(p!=123&&n<10);

    此处do-while循环的结束条件是( )。

    A.P的值不等于123或者n的值小于10

    B.P的值等于123并且n的值大于等于10

    C.P的值不等于123并且n的值小于10

    D.P的值等于123或者n的值大于等于10

    28. 以下叙述中错误的是( )。

    A.改变函数形参的值,不会改变对应实参的值

    B.函数可以返回地址值

    C.可以给指针变量赋一个整数作为地址值

    D.当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL

    29. 当变量c的值不为2、4、6时,值也为"真"的表达式是( )。

    A.(c==2)︱︱(c==4)︱︱(c==6)

    B.(c>=2&& c<=6)︱︱(c!=3)︱︱(c!=5)

    C.(c>=2&&c<=6)&&!(c%2)

    D.(c>=2&& c<=6)&&(c%2!=1)

    30. 运行程序:

    #include

    main()

    {

    int n='c';

    switch(n++)

    { default: printf("error");break;

    case 'a':case 'A':case 'b':case 'B':printf("good");break;

    case 'c':case 'C':printf("pass");

    case 'd':case 'D':printf("warn");

    }

    }则输出结果是( )。

    A.good

    B.pass

    C.warn

    D.passwarn

    31. 设有 int x=8; 则表达式 (++x*1/3) 的值是( )。

    A.2

    B.3

    C.2.6

    D.0

    32. 下面程序的输出结果是( )。

    main()

    { int x=5,y=9,z=1,t;

    t=(x>y||x>z);

    printf("%d\n",t);

    A.1

    B.0

    C.5

    D.3

    33. 有以下程序

    #include

    main()

    { int x=1,y=0,a=0,b=0;

    switch(x)

    { case 1:

    switch(y)

    { case 0:a++; break;

    case 1:b++; break;

    }

    case 2:a++; b++; break;

    case 3:a++; b++;

    }

    printf("a=%d,b=%d\n",a,b);

    }

    A.a=1,b=0

    B.a=2,b=2

    C.a=1,b=1

    D.a=2,b=1

    34. 一个C程序的执行是从( )。

    A.本程序的main函数开始,到main函数结束

    B.本程序文件的第一个函数开始,到本程序文件的最后一个函数结束

    C.本程序的main函数开始,到本程序文件的最后一个函数结束

    D.本程序文件的第一个函数开始,到本程序main函数结束

    35. 有以下程序

    main()

    { int i,s=1;

    for (i=1;i<50;i++)

    if(!(i%5)&&!(i%3)) s+=i;

    printf("%d\n",s);

    A.409

    B.277

    C.1

    D.91

    二、 判断题 (共 15 道试题,共 30 分)

    1. C语言的编译系统对宏命令的处理是和c程序中的其他语句同时进行编译的。

    A.错误

    B.正确

    2. 设变量 a 为整型,f 是实型,i 是双精度型,则表达式10+'a'+i * f 值的数据类型不能确定为何类型。

    A.错误

    B.正确

    3. (a=3)>(b=5) 是合法的关系表达式。

    A.错误

    B.正确

    4. 预处理指令只能位于C源程序文件的首部。

    A.错误

    B.正确

    5. 在c程序中,语句之间必须要用分号";"来分隔。

    A.错误

    B.正确

    6. for循环是先执行循环体语句,后判断表达式。

    A.错误

    B.正确

    7. 在C语言中char型数据在内存中的存储形式为ASCII码。

    A.错误

    B.正确

    8. 声明语句可放在函数体中的任何位置。

    A.错误

    B.正确

    9. 在C程序中,%是只能用于整数运算的运算符。

    A.错误

    B.正确

    10. 设int a=12;则执行完语句a+=a-=a*a后,a的值为144。

    A.错误

    B.正确

    11. 两个字符串所包含的字符个数相同时才能比较字符串大小。

    A.错误

    B.正确

    12. %x是格式符的一种,它可以适用于任何一种类型的数据。

    A.错误

    B.正确

    13. 若a和b类型相同,在执行了语句a=b后,b中的值将放入a中,b中的值不变。

    A.错误

    B.正确

    14. 用typedef可以定义各种类型名,但不能用来定义变量。

    A.错误

    B.正确

    15. C语言认为变量number和NuMbEr是相同的。

    A.错误

    B.正确

    展开全文
  • 其中a是数组名,p是指向数组元素的指针变量,其初值为p = a。 代码实现: #include<stdio.h> #include<stdlib.h> int main(void){ int a[10], i; int *p; p = a; // 数组首地址赋值给p for(i = 0; ...

    下标法,如a[i]形式,这是最简单的方式 了;

    指针法,如 * (a+1) 或 *(p+1)。其中a是数组名,p是指向数组元素的指针变量,其初值为p = a。

    代码实现:

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void){
    	int a[10], i;
    	int *p;
    	p = a;  // 数组首地址赋值给p
    	for(i = 0; i < 10; i++){
    		a[i] = rand()% 100 +1;
    	} 
    	printf("下标法访问数组: ");
    	for(i = 0; i < 10; i++){
    		printf("%5d", a[i]);
    	}
    	printf("\n通过数组名计算数组元素地址,找出元素的地址:");
    	for(i = 0; i < 10; i++){
    		printf("%5d", *(a+i));
    	}
    	printf("\n用指针变量指向数组元素: ");
    	for(i = 0; i < 10; i++){
    		printf("%5d", *(p+i));
    	} 
    	return 0;
    } 
    

    实验截图:

    在这里插入图片描述

    展开全文
  • 如何引用数组呢?

    千次阅读 2020-12-06 11:53:59
    (指针=数组名,引用第一个元素;指针<(数组名+数组长度);指针++) 代码如下: #include <stdio.h> // 指 针 法 int main() { int a[10]; int *p,i; printf("please enter 10 integer numbers:"); for

    数组引用的方式

    1、下标法
    2、指针法

    方法分析

    下标法:(i=0;i<length;i++)
    指针法:(p=a;p<(a+10);p++)
    (指针=数组名,引用第一个元素;指针<(数组名+数组长度);指针++)

    代码如下:

    #include <stdio.h>  //  指 针 法
    int main()
    {
        int a[10];
        int *p,i;
        printf("please enter 10 integer numbers:");
        for(i=0;i<10;i++)
        {
            scanf("%d",&a[i]);
        }
        for(p=a;p<(a+10);p++)  //for(i=0;i<10;i++)
        {                     //printf("%d",a[i]);
            printf("%d ",*p);
        }
        printf("\n");
        return 0;
    }
    
    

    总结

           可能还有其它办法,目前只会这两个
    
    展开全文
  • 引用数组元素的四种方式

    千次阅读 2020-02-29 23:10:58
    #include<stdio.h> int main() { int a[] = { 1,2,3,4,5}; int *p; int i; for (i = 0; i < 5; i++) { printf("%d\n",a[i]); } printf("-----------------\n");... for (i =...
  • 引用数组元素

    千次阅读 2019-04-24 17:15:47
    引用一个数组元素可以有以下两种方法: (1)指针法。有 *(a+i), *(p+i) 两种表现形式,都是用间接访问的方法来引用数组元素。 (2)下标法。有a[i] 和 p[i] 两种形式。在编译时这两种形式也要处理成 *(a+i) 或 *(p+...
  • C语言-数组的定义和引用

    千次阅读 2021-12-10 10:48:29
    数组的定义和引用1. 一维数组、二维数组的定义、初始化和引用方法数组数据的特点:数组:一般形式:类型说明符 数组名[常量表达式];说明:一维数组的引用1. 引用方式:二维数组二维数组引用表现形式:引用四种方法...
  • 1.数组指针:即指向数组的指针那么, 如何...2.通过指针引用数组元素的基本方法(1)小标法:a[i]。(2)指针法:* (a+i) 或 * (p+i) 或 p[i]。其中,a是数组名,p=a,即p指向数组a首元素的地址。问:为什么* (a+i) 和* ...
  • 若有说明语句“int a[5],p=a;”为什么对数组元素正确引用是(p+2)?
  • 数组元素的访问方式有下标引用和间接访问两种.除了优先级之外, 下标引用和间接访问完全相同. arrayname[subscript] = *(arrayname + (subscript))例如:int arrayname[10];int *arrayptr = arrayname + 2;arrayptr = ...
  • C语言数组引用

    千次阅读 2018-05-01 14:05:07
    一维数组元素引用:数组元素的一般形式为:数组名[下标](下标从0开始)printf("%d\n",arr[5])数组名arr通常情况下代表数组元素的首地址printf("%d\n",arr); //输出为1数组名arr在两种情况...
  • C/C++对数组引用

    千次阅读 2011-06-30 22:46:00
    所谓数组引用,即指向数组的引用;如: int a[10] ; int (&b)[10] = a ;如果写成: int a[10] ; int* &b = a ;将会报错: cannot convert from int [10] to int *&。或许你会说
  • /*调用数组元素的三种... printf("用下标引用数组元素:\n"); for (i = 0; i < 5; i++) printf("%d\n", a[i]); printf("用数组名引用数组元素:\n"); for (i = 0; i < 5; i++) printf("%d\n", * (a+i))
  • c语言中引用数组的方法

    千次阅读 2017-03-11 15:45:00
    c语言中引用一个数组元素,可以用: (1)下标法; eg:a[i] (2)指针法。 eg: *(a+i) 或 *(p+i) //其中a为数,*(a+i)意为a数组的首地址+i——即指向第i个元素{注意:这里不是说地址加上i,要看是什么...
  • 1.不能建立引用数组,但是可以建立数组的引用。 c++中,引用可以说只是某个变量的别名,所谓别名,是和指针类型区分开的,指针类型可以指向某个变量,而且指针类型本身也是一个变量,而引用本身实际上不是一个变量...
  • 总结文档的时候遇到了这个问题。...博客作者说怀疑指针法查找元素比下标法更高效不一定正确,并且说当使用指针访问数组元素(注意是新创建一个指针指向数组名)要慢于通过数组下标访问。 这个说法是正确的,...
  • 关于数组的引用引用的数组

    万次阅读 多人点赞 2018-04-27 23:58:36
    )array[] array是个数组,其中的元素引用 //应该叫:引用的数组 int &amp;array[] //array首先和&amp;结合,所以array是引用引用的对象是数组 //应该叫作数组的引用 int (&amp;array)[10] 二、引用...
  • 数组的初始化(一)

    千次阅读 2020-01-13 20:22:57
    所谓初始化,就是为数对象的元素分配内存空间,并为每个数组元素分配初值。 数组的初始化有以下两种方式: 1.静态初始化:初始化时由程序员指定每个数组元素的初值,由系统决定数组长度。 2.动态初始化:初始化时...
  • Vue3.0相比于Vue2.0支持的观察的数组的原生方法更多,并且不需要通过写特定的方法来进行支持,对数组原生方法的观测可以合并到对数组下标、对象属性的响应代码里面。这是什么原理呢?这篇文章就来给你们揭秘! 2....
  • perl对数组的操作

    万次阅读 2013-11-14 10:43:37
    试图访问不存在的Perl数组元素,则结果为NULL,但如果给超出Perl数组大小的元素赋值,则Perl数组自动增长,原来没有的元素值为NULL。如: @array=(1,2,3,4); $scalar=$array[0]; $array[3]=5;#now@arrayis(1,2...
  • 反观数组,当数组作为形参,形参和实参都放在一个栈中,但是他们指向的是同一个数组,也就是说形参实参共享这个数组,所以实参传值传的其实是个引用,指向同一个数组,形参在方法中变了,那么实参也会变;...
  • C语言3数组练习题3

    千次阅读 2021-05-22 16:35:19
    则对a数组元素的非法引用是 A.a['B'-'A'][2*1] B.a[1][3] C.a[4-2][0] D.a[0][4] 8.设有语句static char str[10]={“china”};printf(“%d”,strlen(str)); 则输出结果是 A.10 B.5 C.china D.6 9....
  • 一维数组的定义、初始化和引用

    千次阅读 2021-05-19 08:32:45
    一维数组的定义、初始化和引用一维数组的定义、初始化和引用1.一维数组的定义方式为:类型说明符 数组名[常量表达式](1)数组名的命名方法与变量名相同,遵循标识符命名规则;(2)数组是用方括号括起来的常量表达式,...
  • 数组不是Java中的原始类型,但它们也不是对象,所以它们是通过值传递还是通过引用传递?它是否依赖于数组包含的内容,例如引用或基元类型?数组是对象,是的,但是Java中的任何东西都不是通过引用传递的。所有参数...
  • 数组的引用引用数组

    万次阅读 2012-09-16 00:52:15
    在《C++ Primer 第四版》的第七章中,讲到了通过引用传递数组,和其他类型一样,数组形参可声明为数引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组...
  • 1 对数几率回归原理分析 1.1 引入 1.2 损失函数 1.3 求最优解 2 对数几率回归实践 Logistic回归的一般过程 Logistic回归的优缺点 Logistic回归算法描述(改进的随机梯度下降) 《机器学习实战》第五章代码...
  • 对数组a[10]的几个理解

    千次阅读 2013-11-17 12:02:46
    分别有这两个默认的值: a代表数组首个元素的地址;&a代表指向数组的指针; 于是有这些赋值:int * p = a; int (*q)[10] = &a;是合法的。 那么在c++引用上,有以下引用: int * &p = a;int (*&q)[10] = &a; /...
  • ”,对数组元素正确引用是( )①a[p] ②P[a]③*(P+2) ④P+2「解」在 C语言中,约定数组名单独出现在表达式中时,它表示数组首元素的指针。有int a[10] ,则a可以作为&a[0]使用。另有整型指针变量p,代码p=a...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,694
精华内容 8,677
关键字:

对数组元素的正确引用