精华内容
下载资源
问答
  • C语言数组赋值一例

    2020-07-16 16:18:22
    从这里学习到一个数组赋值的方法,即实际赋值可以按不同的顺序(只要是合法的下标),而不是仅限于从0~N这样的顺序去赋值
  • 很多学生在学习C语言时,在数组的地方会有点困惑。 1.数组必须指定长度,而其数组定义的长度不能是变量或者浮点数,一定是常量表达式; 2.数组赋值,有两种,一是在定义的时候就进行初始化,或者单个引用来赋值...

    很多学生在学习C语言时,在数组的地方会有点困惑。

    1.数组必须指定长度,而其数组定义的长度不能是变量或者浮点数,一定是常量表达式;

    2.数组的赋值,有两种,一是在定义的时候就进行初始化,或者单个引用来赋值。

    但有个问题:

    #include <stdio.h>
    
    int main(void)
    {
    	int a[5] = {1,2,3,4,5};
    	a[5] = 10;
    	printf("a[5] = %d\n",a[5]);
    	return 0;
    }

    结果:

    a[5] = 10
    Press any key to continue

    上述代码编译没有问题,但代码写的是错误的

    数组长度为5,元素只有a[0]-a[4],没有a[5]元素。但为什么给a[5]赋值没有报错或告警呢?另外这个值到底赋给了谁呢?

    我们可以同变量的地址来发现问题。

    代码:

    #include <stdio.h>
    
    int main(void)
    {
    	int i = 0;
    	int b[5];
    	int a[5] = {1,2,3,4,5};
    	a[5] = 10;
    	for(i=0;i<5;i++)
    	{
    		printf("数组a[%d]的地址 = %X\n",i,&a[i]);
    	}
    	for(i=0;i<5;i++)
    	{
    		printf("数组b[%d]的地址 = %X\n",i,&b[i]);
    	}
    	printf("数组a[5]的地址 = %X\n",&a[5]);
    	return 0;
    }

    结果:

    数组a[0]的地址 = 19FF04
    数组a[1]的地址 = 19FF08
    数组a[2]的地址 = 19FF0C
    数组a[3]的地址 = 19FF10
    数组a[4]的地址 = 19FF14
    数组b[0]的地址 = 19FF18
    数组b[1]的地址 = 19FF1C
    数组b[2]的地址 = 19FF20
    数组b[3]的地址 = 19FF24
    数组b[4]的地址 = 19FF28
    数组a[5]的地址 = 19FF18
    Press any key to continue

    你会发现a[5]的地址和b[0]的地址一样,所以在给a[5] = 10;时实际上是篡改了b[0]中的内容,我们可以试一下:

     代码:

    #include <stdio.h>
    
    int main(void)
    {
    	int i = 0;
    	int b[5];
    	int a[5] = {1,2,3,4,5};
    	a[5] = 10;
    	for(i=0;i<5;i++)
    	{
    		printf("数组a[%d]的地址 = %X\n",i,&a[i]);
    	}
    	for(i=0;i<5;i++)
    	{
    		printf("数组b[%d]的地址 = %X\n",i,&b[i]);
    	}
    	printf("数组a[5]的地址 = %X\n",&a[5]);
    
    	printf("数组a[5]的值 = %d\n",a[5]);
    	printf("数组b[0]的值 = %d\n",b[0]);
    	return 0;
    }

    结果为:

    数组a[0]的地址 = 19FF04
    数组a[1]的地址 = 19FF08
    数组a[2]的地址 = 19FF0C
    数组a[3]的地址 = 19FF10
    数组a[4]的地址 = 19FF14
    数组b[0]的地址 = 19FF18
    数组b[1]的地址 = 19FF1C
    数组b[2]的地址 = 19FF20
    数组b[3]的地址 = 19FF24
    数组b[4]的地址 = 19FF28
    数组a[5]的地址 = 19FF18
    数组a[5]的值 = 10
    数组b[0]的值 = 10
    Press any key to continue
    

    可以明显看出a[5]的赋值实质上修改了b[0]的值,这个对于初学者来说是大忌,在以后的开发过程中会经常出现这样的问题,这种问题属于踩内存,贼不好定位。所以大家在学习时一定要注意!!!!

    数组的长度为N,那数组元素只能有0~N-1个元素

     

     

    展开全文
  • 没有a[4]元素,但经过程序验证,发现a[4]不仅存在还可以正常赋值,这样似乎不合理,那到底是哪地方出问题了? 问了解决这一问题,我们可以看一下数组元素的地址: #include void main() { int a[4] = {1,2,3,4}; int...

    先来看一个例子,请大家看一下有没有问题?

    #include<stdio.h>
    
    void main()
    {
    	int a[4] = {1,2,3,4};
    	a[4] = 5;
    	printf("a[4] = %d\n",a[4]);
    }

    结果:

    a[4] = 5
    Press any key to continue

     程序执行无错误无警告,编译环境选择的是VC++6.0。

    疑问:书上明确说,数组的元素从0开始一直到数组长度-1,如int a[4],那么它的元素就有a[0],a[1],a[2],a[3]。没有a[4]元素,但经过程序验证,发现a[4]不仅存在还可以正常赋值,这样似乎不合理,那到底是哪地方出问题了?

    问了解决这一问题,我们可以看一下数组元素的地址:

    #include<stdio.h>
    
    void main()
    {
    	int a[4] = {1,2,3,4};
    	int i = 0;
    	a[4] = 5;
    	printf("a[4] = %d\n",a[4]);
    	printf("a[4]的地址 = %X\n",&a[4]);
    }

    结果:

    a[4] = 5
    a[4]的地址 = 19FF30
    Press any key to continue

    现在再来定义一个数组,int b:

    #include<stdio.h>
    
    void main()
    {
    	int b[4] = {0};
    	int a[4] = {1,2,3,4};
    	
    	int i = 0;
    	a[4] = 5;
    	printf("a[4] = %d\n",a[4]);
    	printf("a[4]的地址 = %X\n",&a[4]);
    	printf("b[0]的地址 = %X\n",&b[0]);
    }

    结果:

    a[4] = 5
    a[4]的地址 = 19FF20
    b[0]的地址 = 19FF20

    Press any key to continue

    你会分析,a[4]的地址和b[0]的地址一样,这就发现问题所在了,现在修改了a[4]的值,相当于修改了b[0]的值,代码验证如下:

    #include<stdio.h>
    
    void main()
    {
    	int b[4] = {0};
    	int a[4] = {1,2,3,4};
    	
    	int i = 0;
    	a[4] = 5;
    	printf("a[4] = %d\n",a[4]);
    	printf("a[4]的地址 = %X\n",&a[4]);
    	printf("b[0]的地址 = %X\n",&b[0]);
    	printf("b[0] = %d\n",b[0]);
    }

    结果:

    a[4] = 5
    a[4]的地址 = 19FF20
    b[0]的地址 = 19FF20
    b[0] = 5
    Press any key to continue
    可以清楚的看到,b数组的第一个元素值被a[4]修改,这个是不合理的。所以,可以得出一个结论:书上讲的没错,数组元素的个数,是从0开始,整个元素个数不超过数组长度

    最后,这里提醒大家,这样的操作要不得,你会发现明显在踩内存,使得数组b的值无辜被修改。相信以后编译器可以在第一时间爆出问题,不然这个问题引入,问题很难定位。

    学习一直在路上,加油!!!!

    展开全文
  • C语言之数组(数组赋值的三种形式)

    万次阅读 多人点赞 2018-07-18 22:20:34
    C语言中,对数组进行赋值的三种形式 1、通过循环的形式 即:数组名[下标] 对数组的元素进行依次赋值   #include &lt;stdio.h&gt; int main() { int i; int a[10] = {0}; for(i=0;i&lt;10;i...

    在C语言中,对数组进行赋值的三种形式

    1、通过循环的形式     即:数组名[下标]      对数组的元素进行依次赋值

     

    #include <stdio.h>
    int main()
    {
        int i;
        
        int a[10] = {0};
        for(i=0;i<10;i++)
        {
             scanf("%d",&a[i]);
        }
        for(i=0;i<10;i++)
        {
            printf("%d ",a[i]);
        }
        return 0;
    }
    

    2、通过循环的形式     数组名+下标       对数组的元素进行依次赋值

    #include <stdio.h>
    int main()
    {
        int i;
        int a[5];   // 数组名:a 是数组首元素的地址 -----相当于一个指针  是一个常量  
                    //指针+整型值,表示地址的前移,前移的字节由指针指向的对象的类型决定
                    //b+1;  前移4个字节(int型)
    
        printf("%#p\n",a);        //打印输出数组a的地址 相当于a[0]的地址
        printf("%#p\n",&a[0]);
        printf("%#p\n",a+1);
        printf("%#p\n",&a[1]);
        printf("%#p\n",a+2);
        printf("%#p\n",&a[2]);
    
        printf("请输入数组a元素的值:");
        for(i=0;i<5;i++)
        {
            scanf("%d",a+i);     //赋值给数组a
        }
        printf("a数组元素的值为:");
        for(i=0;i<5;i++)
        {
             printf("%d ",*(a+i));
        }
        return 0;
    }
    

    打印出的结果:

     

    3、通过循环的形式  利用指针  对数组的元素进行依次赋值

     #include <stdio.h>
    int main()
    {
        int i;
        int d[5] = {10,20,34,89,90};
    	//指针指向一维数组,指针指向数组首元素
           //数据类型 *指针名;
    	int *p = d;
    	//int *p = &d[0];
    
    	//指针指向数组首元素。指针名可以当数组名使用
    
    
    		printf("%#p\n",p);
    		printf("%d\n",d[0]);
    		printf("%d\n",*++p); //++p p的地址先偏移, *p
    		printf("%d\n",d[1]);
    		printf("%#p\n",p);
    		printf("%#p\n",&d[1]);
    
    	printf("请输入数组d元素的值:");
    
    	p = d;
    	for(i = 0; i < 5; i++)
    	{
    		//scanf("%d",p+i);  //p+0 p+1 p+2 p+3
    	     scanf("%d",p++);  //p = p+1
    	}
    	//for循环结束,p偏移到元素d[4]的下一个元素
    	p = &d[0];
    	for(i = 0; i < 5; i++)
    	{
    		//printf("%d ",*(p+i));
    		//printf("%d ",*p++);  //p++,后置  *p取p变化之前的内容
    		printf("%d ",p[i]);  //指针指向数组首元素。指针名可以当数组名使用
    	}
    	printf("\n-----------------\n");
    
    
        return 0;
    }
    

     

    展开全文
  • 一、数组赋值 数组名就代表着该数组的首地址,后面的所有元素都可以根据数组名加上偏移量取到。 1. 一维数组 第一个小例子:编程实现显示用户输入的月份(不考虑闰年)拥有的天数。** #include<stdio.h> #...

    一、数组赋值

    数组名就代表着该数组的首地址,后面的所有元素都可以根据数组名加上偏移量取到。

    1. 一维数组


    第一个小例子:编程实现显示用户输入的月份(不考虑闰年)拥有的天数。**

    #include<stdio.h>
    #define MONTHS 12
    int main(){
        int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
        int month;  // 1-12
        do{
            printf("Input a month:");
            scanf("%d", &month);
        }while(month<1 || month>12);  // 处理不合法数据
        // days数组是从0-11
        printf("The number of days is %d\n", days[month-1]);  
        return 0;
    }
    

            上面这个例子我们简单的用一维数组存储了一年的年份。这个代码的功能想必题目说得很清楚了,我就不再重复赘述。中间有一段while循环的代码,那个是为了处理不合法数据的,因为当我们输入的值在1-12之间的时候,这个循环我们是出不去的,会让我们一直输入月份。
            在后面输出对应月份的天数的时候,我们用的下标是month-1,因为数组的下标是从0-11,我们输入的是1-12,所以-1后才是我们对应需要的月份。


    2. 二维数组

    一维数组比较简单,我们来看二维数组。下面是一个二维数组的小例子。

    int main(){
    	// 没有指定的位置,自动赋值为0
        int a[][3] = {{1,2,3}, {4,5}, {6}, {0}};  
        printf("%d, %d, %d\n", a[1][1], a[0][2], a[2][1]);
        return 0;
    }
    // 数组构造:
    // 1   2   3
    // 4   5   0
    // 6   0   0
    // 0   0   0
    
    Input:
    5, 3, 0
    

            这个例子我们可以看出来,这个二维数组,我们最初只是指定了列数,没有指定行数,也就是说二维数组可以只指定列数,行数可以在我们进行赋值的时候,自动确定。比如我这个例子,二维数组给定了三列,里面写了4个小的一维数组,所以最终这个二维数组的维度是4行3列


    我们再来看下面这个更有趣的例子。

    int main(){
    	// 没有指定的位置,自动赋值为0
        int a[][3] = {1, 2, 3, 4, 5, 6, 7};  
        return 0;
    }
    

            这个例子中没有一个小括号,虽然前面的定义是一个二维数组,但是里面的赋值就像一个一维数组一样,有点儿奇怪?其实他的内部是这样的。

    1   2   3
    4   5   6
    7   0   0
    

            为什么会这样?因为他指定了三列,这是毋容置疑的,但是没有指定行数,所以里面的元素会按照三列的规则一行一行的排列下去,如果排到某一行,还有空的位置没有元素,就会自动被赋值为0,这个二维数组的维度就是3行3列

    数组的奇特赋值方式我想大家已经理解了,那么我们来看 数组越界 的问题。


    二、数组越界

    1. 一维数组越界

            一维数组的越界,编译器(我使用的VC6.0)不会在你越界的提示你,而是会根据这个地址继续对该位置进行相关操作(比如赋值或者取值)。我们来看下面这个例子:

    #include<stdio.h>
    int main(){
    	int a = 1, c = 2, b[5], i;
    	printf("\na = %d, c = %d\n", a, c);
    	
    	// 这里明显对于b数组的赋值,已经越界
    	for (i=0; i<=8; i++){
    		b[i] = i;
    	}
    	
    	printf("\n a = %d, c = %d\n", a, c);
    	return 0;
    }
    

    运行结果如下:
    在这里插入图片描述
    这个 ac 的值明显被改变了,我们下面来看一下数组越界后,发生了什么:
    在这里插入图片描述
            其实编译器之所以在编译的时候没有报错,是因为他的取值赋值是根据地址来做的。由于数组名就是该数组的首地址,也就是第一个元素的地址,所以当你的索引变化的时候,虽然数组已经没有对应元素给他使用了,但是他依然会根据偏移量往后继续找,这也就把后面跟着的 c 和 a 的值给修改了。(我的编译器虽然在运行的时候没有报错,但是运行结束后还是出现了异常,提示关闭程序)

    关于偏移量,我举个简单的例子:
    比如,在C语言中 char 字符类型是占一个字节的。
    我们定义一个一维数组  char a[5];
    假设首地址是 40,那我们去 a[5] ,这个元素的地址就是 40+5*1 
    因为字符类型一个位置占一个字节。
    那个5就是偏移量,也就是说如果你定义的 int a[5],那么后面就是 40+5*4 了。
    因为在大多数编译器中 int 占4个字节,当然也有占2个字节的。
    

            上面是一维数组的越界情况。


    2. 二维数组越界

            其实这个的越界和一维数组越界原理是一样的,都是根据偏移量来取值,不同的是二维数组有多行,也就是你在这一行越界后,他会跑到下一行,我们来看下面这个例子:

    #include<stdio.h>
    int main(){
        int i, j;
        char a[6][4] = {(char)0x00};
        printf("%p\n", a);  // 输出首地址
        a[0][0] = 0x01;  // 16进制
        a[1][0] = 0x10;
        a[0][4] = 0x04; // a[1][0]
        a[1][4] = 0x05; // a[2][0]
        a[5][4] = 0x20; // 完美刚好越界
        a[5][5] = 0x30; // 越界
        for (i=0; i<6; i++){
            for (j=0; j<4; j++){
                printf("%d\t", a[i][j]);
            }
            printf("\n");
        }
        return 0;
    }
    
    Input:
    1    0    0    0
    4    0    0    0
    5    0    0    0
    0    0    0    0
    0    0    0    0
    0    0    0    0
    

            代码中的注释我们可以看到,在一个二维数组 arr[6][4]中,a[0][4] 和 a[1][0] 是同一个元素,因为 a[0][4] 在第一排越界后,根据偏移量的计算,他跑到了第二列的第一个。

    a[6][4] 是一个6行4列的二维数组,一行4个
    a[0][4] = 0*4 + 4 = 4
    a[1][0] = 1*4 + 0 = 4
    
    a[i][j] = i*4 + j
    表示前面已经走过了 4*i 个地址,然后在 i+1 行走了 j 个位置。
    计算出来就是最终的地址。
    
    对了,0x表示的十六进制的数组,比如 0x10 换算成十进制就是 16。
    因为就像16进一一样,在第二位有一个1,说明就已经有个16了。
    

            以上就是二维数组越界的情况。


    3. 下面我们看一下简单的二维数组小例子

    #include<stdio.h>
    #define MONTHS 12
    int main(){
        int days[MONTHS] = {{31,28,31,30,31,30,31,31,30,31,30,31},  // 平年
                           {31,29,31,30,31,30,31,31,30,31,30,31}};  // 闰年
        int year, month;  // 1-12
        
        do{
            printf("Input a month:");
            scanf("%d, %d", &year, &month);
        }while(month<1 || month>12);  // 处理不合法数据
        
        if (((year%4==0) && (year%100!=0)) || (year%400==0)){  /* 闰年 */
        	printf("The number of days is %d\n", days[1][month-1]);  // days数组是从0-11
        }else{  /* 平年 */
            printf("The number of days is %d\n", days[0][month-1]);
        }
        
        return 0;
    }
    
    展开全文
  • C语言 字符数组赋值

    千次阅读 2018-05-29 09:24:00
    /给数组赋字符串/ . . . } 上面程序在编译时, 遇到char s[30]这条语句时, 编译程序会在内存的某处留 出连续30个字节的区域, 并将第一个字节的地址赋s。当遇到strcpy( strcpy 为 Turbo C2.0的函数)时, 首先在目标...
  • 数组之间的赋值C语言数组之间赋值详解 (biancheng.net)
  • c语言 结构体数组赋值 //**创建结构体** #include<stdio.h> struct Class{ int id; char name[10]; }; //******结构体数组赋值 int main(){ int m; //定义结构体数组的长度所需变量 int i; printf(...
  • 关于C语言数组赋值方法

    千次阅读 2019-10-04 07:26:13
    C语言数组赋值方法 数组赋值的方法分为: 1.赋值语句--对数组元素逐个赋值 例: #include <stdio.h> int main(){  int i,a[10];  for(i = 0;i <=9;i++){  a[i]=i; /*赋值语句*/  }  for(i....
  • C语言给char数组赋值问题

    千次阅读 2020-11-01 21:27:04
    使用for+scanf赋值时问题 代码: printf("请输入串长度\n"); scanf("%d", &s.length); printf("请输入串\n"); for (int i = 1; i <= s.length; i++) scanf("%c", &s.ch[i]); 结果: 串1存了...
  • C语言给数组赋值

    万次阅读 2017-03-15 21:20:45
    C语言给数组赋值也就是直接赋值法;举例如下:int a [ ]; a = new int[3]; a [0] = 1; a [1] = 2; a [2] = 3;哈,这就是给数组赋值,很无奈的是我才会。
  • 2.数组)定义后再赋值字符串。此时要用拷贝函数strcpy( )。 3.直接指针赋值字符串。 4.先定义一个指针(也叫野指针,没有指向的空间),再赋值字符串。此时需要指针先malloc空间,让指针指向这个malloc...
  • C语言字符串数组赋值

    千次阅读 2019-09-13 21:16:15
    数组赋值有两种方式 一种是在定义是赋值: char book[] = {"the story of sitone"}; char author = "曹雪芹";//去掉花括号也可以 char k[5] = {'h','e','l','l','o','\0'}; 定义后在赋值就一般用strcpy,不能用=赋值...
  • c语言数组赋值

    万次阅读 2018-02-20 13:51:33
    一、数组定义原则: 长度是常量,赋值用大括号括起来。 例: int data[5] = {5, 2, 4, 0, 3}; 如果用变量: int n=5; int a[n] = { 1,2,3,4,5 }; gcc报错: error: variable-sized object may not be ...
  • 1、数组在定义时, 可以同时进行初始化,但...可通过数组下标方式或指针方式,引用数组元素,进行赋值。 例子: char a[10]; char ch=‘a’; for( i=0;i<10;i++ ) a[i]=ch+i ; //可通过数组下标引用数组元素,完成赋
  • 做了一个小的例子: #include int main() { struct Link { int LinkId; int LinkLen; int NxtLnkId; }Lnk[3]; Lnk[0].LinkId = 1;... printf("结构体数组赋值完成。"); } 结构体数组的赋值情况:
  • C语言 字符数组赋值的方法 整理

    千次阅读 2015-03-15 18:38:03
    怎么这个数组赋值呢? 1、定义的时候直接用字符串初始化 char a[10]="hello"; 注意:不能先定义再它赋值,如char a[10]; a[10]="hello";这样是错误的!只有定义初始化是才能这样赋值 2、对数组中字符逐个...
  • ”,那么如何编写程序才能将数组 a 中的数据赋给数组 b? 经常有人会这样写: b = a; 这样写是错误的。前面说过,a 和 b 是数组名,而数组名表示的是数组“第一个元素”的“起始地址”。即 a 和 b 表示的是地...
  • 定义字符数组定义时直接初始化,下面例子中直接将字符串123456的首地址赋值给a char a[6]=“123456”; 需要注意的是,在定义之后,不可以在对a数组使用字符串直接初始化,如下 char a[6]; a = "123456" a是一个静态...
  • 小明在学到二维数组时,尝试写了一段二维数组赋值的代码,他发现一个奇怪的现象:交换赋值顺序,效率是不同的。交换赋值顺序,效率是不同的请看下面这两段C语言代码:版本 1int test1 (){ int i,j; static int x...
  • 今天小编就为大家分享一篇关于C语言结构体数组同时赋值的另类用法,小编觉得内容挺不错的,现在分享大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 常用的初始化方式 int arry1[5] = {1,2,3,4,5}; int arry2[5] = {0}; int arry3[] = {1,2,3,4,5}; 乱序初始化 #include int main(void) { int i=0;... 总结 一种不常用的C语言对数组乱序初始化手段。
  • - 取余数失败, position数组中所有赋值都是零 - 我看了一晚上也没研究明白, 求大神指点, 感激不尽 ```c #include int main() { int num; int i = 0; int j; int position[4] = {-1, -1, -1, -1}...
  • C语言数组赋值

    2020-03-19 21:20:26
    想请问各位 str[]={“good”} 跟 str[]=“good”有什么区别呢?
  • char a[3];...这样是会报错的,因为数组名相当于数组的首地址,这个操作相当于对数组的首地址赋值,所以会报错。 #include <string.h> char a[3]; strcpy(a, "xxx"); 用strcpy函数就可以实现。
  • 1、单一变量的赋值 源码: #include <stdio.h> #include <string.h> struct s1 { char *name; int age; }stu1 = {"kangchou", 25}; void main(void) { struct s1 s2; memcpy(&s2, &stu1,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 122,051
精华内容 48,820
关键字:

c语言给数组赋值

c语言 订阅