精华内容
下载资源
问答
  • 对数组整体赋值,以及两个数组间的复制容易出错,这里使用string头文件中的memset和memcpy进行 不必遍历数组,速度快。 代码: /* Project: 数组的整体赋值与复制 Date: 2018/07/31 Author: Frank Yu memset(数组...

    对数组的整体赋值,以及两个数组间的复制容易出错,这里使用string头文件中的memset和memcpy进行
    不必遍历数组,速度快。

    代码:

    /*
        Project: 数组的整体赋值与复制 
        Date:    2018/07/31
        Author:  Frank Yu
        memset(数组名,0或-1,字节)
        memcpy(数组名,数组名,字节)
    */
    #include<iostream>
    #include<cstring> //memset需要头文件 
    #include<cstdio>
    #define n 5
    using namespace std;
    int main()
    {
     int a[n];
     int b[n];
     memset(a,0,sizeof(a));//初始化为0
     //memset(b,1,sizeof(b));//初始化为1,错误 
     memset(b,-1,sizeof(b)); 
     printf("请输入%d个数:\n",n);
     for(int i=0;i<n;i++)
     {
     	scanf("%d",&a[i]);
     } 
     printf("第一个数组为:\n");
      for(int i=0;i<n;i++)
     {
     	printf("%d ",a[i]);
     } 
     printf("\n");
      printf("第二个数组为:\n");
      for(int i=0;i<n;i++)
     {
     	printf("%d ",b[i]);
     } 
      printf("\n");
     memcpy(a,b,sizeof(b));//b的元素复制给a 
     printf("第一个数组被第二个数组覆盖后:\n");
      for(int i=0;i<n;i++)
     {
     	printf("%d ",a[i]);
     } 
     return 0;
    }
    

    版权声明:本文为lady_killer9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/lady_killer9/article/details/81321947

    展开全文
  • 【数组不能整体赋值!!!】老师的

    对数组整体赋值

    【数组不能整体赋值!!!】老师的拳拳教诲依旧回荡耳畔(๑òᆺó๑)(噗,有点不对劲)

    aaaaa那到底能不能整体赋值呢,当然还是有办法的啦~

    具体实现

    首先整理一下实现思路:写一个函数,传入目标数组和所需要赋的各个值,实现将所有值存进数组中。

    那么问题就在于数组的长度不确定,所要传入的参数个数也不确定。
    这时候可变参数就派上用场了!!

    详细可以看看这篇:printf是如何实现可变参数的?自定义函数能否实现参数可变?【C语言】

    [ 了解可变参数后就直接开始咯 ]
    实现过程:第一个参数设置为数组,通过sizeof获取数组长度,按照该长度使用循环将各个参数的值赋给数组

    下面挂上代码(以整型数组为例,其他数组同理)

    //给整型数组整体赋值
    void setArray(int arr[], ...)
    {
    	int length = sizeof(arr);  //获取该数组的长度
    	va_list val;
    	va_start(val, arr);
    	for (int i = 0; i < length; i++)
    	{
    		arr[i] = va_arg(val, int);  //给每个元素赋值
    	}
    	va_end(val);
    }
    

    思路简单清晰不难理解,使用也挺方便,可以当做工具函数用上。
    用法:setArray( 数组名 ,参数1,参数2 …)


    盾来弯矛刺,石立曲水激(寒冰小澈)

    展开全文
  • 对数组进行“整体赋值

    千次阅读 2012-03-30 15:47:08
    数组是不可以整体赋值的,但常常需要用到数组的赋值,以避免写循环。这能否做到?   C语言中能赋值的只有变量,只要让数组变量化,变量赋值时岂不捎带将数组完成了赋值?!   能含有数组的类型只有结构体。...

    数组是不可以整体赋值的,但常常需要用到数组的赋值,以避免写循环。这能否做到?

     

    C语言中能赋值的只有变量,只要让数组变量化,变量赋值时岂不捎带将数组完成了赋值?!

     

    能含有数组的类型只有结构体。于是可以:

    struct name
    {
        int array[10];
    }a, b;


    于是,在a = b;时就完成了数组的赋值。

    注意:切不可“自赋值”,那会造成“内存重叠”,其结果是未定义的。

    展开全文
  • 单片机的C语言编程过程中,经常会用到数组的赋值和修改变量,但是一般情况下,修改变量都是通过for循环来实现,这对整体程序的运行造成了一定的延迟,那有没有一个简单地方法来实现这个功能呢? 实现方法 #include &...

    单片机的C语言编程过程中,经常会用到数组的赋值和修改变量,但是一般情况下,修改变量都是通过for循环来实现,这对整体程序的运行造成了一定的延迟,那有没有一个简单地方法来实现这个功能呢?

    结构体的实际实现方式

    #include <stdio.h>
    struct Foo {
        char a;
        int b;
        double c;
    }foo1, foo2;          //define two structs with three different fields
    
    void struct_assign(void)
    {
        foo2 = foo1;       //structure directly assignment
    }
    
    int main()
    {
        foo1.a = 'a';
        foo1.b = 1;
        foo1.c = 3.14;
        struct_assign();
        printf("%c %d %lf\n", foo2.a, foo2.b, foo2.c);
    
        return 0;   
    }
    

    在Ubuntu 13.04下使用gcc 4.7.3 编译运行得到的结果,如下所示:

    a 1 3.140000

    可以从结果上看出,结构体直接赋值在C语言下是可行的,我们看看struct_assign()函数的汇编实现,从而从底层看看C语言是如何实现两个结构体之间的赋值操作的:

    struct_assign:
    pushl %ebp
    movl %esp, %ebp
    movl foo1, %eax
    movl %eax, foo2 //copy the first 4 bytes from foo1 to foo2
    movl foo1+4, %eax
    movl %eax, foo2+4 //copy the second 4 bytes from foo1 to foo2
    movl foo1+8, %eax
    movl %eax, foo2+8 //copy the third 4 bytes from foo1 to foo2
    movl foo1+12, %eax
    movl %eax, foo2+12 //copy the forth 4 bytes from foo1 to foo2
    popl %ebp
    ret

    这段汇编比较简单,由于结构体的对齐的特性,sizeof(srtruct Foo)=16,通过四次movl操作将foo1的结构体内容拷贝到结构体foo2中。从汇编上看出,结构体赋值,采用的类似于memcpy这种形式,而不是逐个字段的拷贝。

    复杂结构体的赋值

    如果结构体中含有其它复杂数据类型呢,例如数组、指针、结构体等,从上面的汇编实现可以看出,只要两个结构体类型相同,就可以实现赋值,如下例:

    #include <stdio.h>
    
    struct Foo {
        int n;
        double d[2];
        char *p_c;
    }foo1, foo2;
    
    int main()
    {
        char *c = (char *) malloc (4*sizeof(char));
        c[0] = 'a'; c[1] = 'b'; c[2] = 'c'; c[3] = '\0';
    
        foo1.n = 1;
        foo1.d[0] = 2; foo1.d[1] = 3;
        foo1.p_c = c;
    
        foo2 = foo1;     //assign foo1 to foo2
    
        printf("%d %lf %lf %s\n", foo2.n, foo2.d[0], foo2.d[1], foo2.p_c);
    
        return 0;
    }
    

    运行结果如下:

    1 2.000000 3.000000 abc

    可以看出结果和我们想象的是一样的。再次验证结构体的赋值,是直接结构体的内存的拷贝!但正是这个问题,如上面的实例,foo1 和 foo2 中p_c 指针都是指向我们申请的一块大小为4个字节的内存区域,这里注意的是,结构体的拷贝只是浅拷贝,即指针p_c的赋值并不会导致再申请一块内存区域,让foo2的p_c指向它。那么,如果释放掉foo1中的p_c指向的内存,此时foo2中p_c变成野指针,这是对foo2的p_c操作就会出现一些不可预见的问题!在C++中引入了一种可以允许用户重载结构体赋值操作运算,那么我们就可以根据语义重载赋值操作。

    数组是二等公民

    二等公民在维基百科上的解释是:

    二等公民不是一个正式的术语,用来描述一个社会体系内对一部分人的歧视或对外来人口的政治限制,即使他们作为一个公民或合法居民的地位。 二等公民虽然不一定是奴隶或罪犯,但他们只享有有限的合法权利、公民权利和经济机会,并经常受到虐待或忽视。法律无视二等公民,不向他们提供保护,甚至在制订法律时可能会根本不考虑他们的利益。划分出二等公民的行为,普遍被视为一种侵犯人权的行为。 典型的二等公民所面临的障碍包括但不仅限于(缺乏或丧失表决权):权利被剥夺,限制民事或军事服务(不包括任何情况下的征兵),以及限制,语言,宗教,教育,行动和结社的自由,武器的所有权,婚姻,性别认同和表达,住房和财产所有权 。

    从词条上解释可以看出二等公民与一等公民在权利上是有差别的,这个词很有意思作为计算机专业术语,其含义也有异曲同工之妙!同样我们看看维基百科对计算机的术语”first-class citizen"(一等公民)的定义,一般要满足以下几点,

    can be stored in variables and data structures can be passed as a
    parameter to a subroutine can be returned as the result of a
    subroutine can be constructed at run-time
    has intrinsic identity
    (independent of any given name)

    对比着上面的定义来看C语言数组,数组作为一个函数的参数传递时,退化成一个指针; 同时,数组无法作为函数的返回值; 也许让数组更不服气的是,数组之间不能直接赋值操作,如下面的操作就是非法的:

    int a[10];
    int b[10];
    a = b;
    

    数组直接赋值的方式

    以上实现方式来看,实现数组赋值,只需要很简单的方式,即通过将该数组设为结构体类型,通过调用同样的结构体变量即可实现巧妙的数组元素批量赋值

    struct Foo{
      int a[100];
    }foo1,foo2;
    
    int main()
    {
        for(char x=0;x>100;x++){   //Member initialization
    		foo1.a[x] = x;
    	}
        foo2 = foo1;     //assign foo1 to foo2
        for(char x=0;x>100;x++){   //Member initialization
    		printf("foo1 = %d,foo2 = %d \r\n", foo1.a[x], foo2.a[x]);
    	}
        return 0;
    }
    

    运行结果如下:

    foo1 = 0,foo2 = 0
    foo1 = 1,foo2 = 1
    foo1 = 2,foo2 = 2
    foo1 = 3,foo2 = 3

    foo1 = 99,foo2 = 99

    展开全文
  •  在赋值语句中需要注意如下区别:存储器赋值不能在一条赋值语句中完成,但是寄存器可以。因此在存储器被赋值时,需要定义一个索引。下例说明它们之间的不同。 reg [1:5] Dig; //Dig为5位寄存器。 . . . ...
  • 整型数组整体赋值

    千次阅读 2018-11-11 15:51:36
    整型数组无法整体赋值的原因: 对于一些特定的问题,整型数组可能需要整体赋一个初值,但是缺乏直接赋值的函数,因为整型数组没有终结的标志,计算机系统不会自动的判定它的大小,无法快速赋值。 整型数组赋初值的...
  • java数组整体赋值技巧

    千次阅读 2013-02-16 16:08:56
    在C语言中类似于两个数组整体赋值的操作是不被允许的 #include <stdio.h> int main(int argc, char *argv[]) { int a[] = {1, 2, 3}; int b[3]; b = a; //error: ISO C++ forbids assignment of arrays ...
  • 对数组整体赋值,以及两个数组间的复制容易出错,这里使用string头文件中的memset和memcpy进行 不必遍历数组,速度快。 之前没有头文件,显示decla 头文件: 代码: /* Project: 数组的整体赋值与复制 Date: ...
  • Qt 中给一个数组整体赋值

    千次阅读 2020-12-01 10:09:45
    Qt 中给一个数组整体赋值 1.memset memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。 头文件: memset()函数原型:extern void *...
  • 对数组整体赋值,以及两个数组间的复制容易出错,这里使用string头文件中的memset和memcpy进行 不必遍历数组,速度快。 之前没有头文件,显示decla 头文件: Stackoverflow的解释 代码: /* Project: 数组...
  • 现象: 数组的整体赋值 int a[3] = {1,2,3}; int b[3]; b = a; 报错: 结构体的整体赋值 struct BOOK { int id; char name[20]; }; struct BOOK a = {3,"活着"}; struct BOOK b = a; printf("%d-%s\n",b.id,b.name);...
  • C/C++数组为什么不支持整体赋值操作

    千次阅读 2013-12-26 19:45:00
     因为C/C++中,数组名就是数组第一个元素的地址,也就是一个常量指针, 比如,int a[100] , b[100]; 则a和b都是常量指针int*const a(其值肯定是不同的), 如果你执行a = b;那就是企图修改常量...
  • 但是这样整体的值就是16843009 0的二进制补码全0 -1的二进制补码全1 所以最好就是取0或者-1 int A[10]; memset(A,-1,sizeof(A)); fill fill函数存在于 algorithm头文件下,需要引用此头文件 fill可以对...
  • 解构赋值

    2020-02-23 18:05:27
    这里结构只能对数组,对象使用。 任何可以转化为obj,array的数据都可以使用解构。 1、对象的解构赋值 //注意点:{}中,名字必须和obj中保持一致,也就是说 变量名必须和属性名一致 let obj = { a...
  • * 整体思路:源数组arr[0]的第一个值是整个算法的核心,也是一个切入点,我们把所有重复的元素全部替换为源数组arr[0]的第一个值. * 同时计数count,用于直接创建一个count+1长度的数组,之后遍历整个源数组arr,只把...
  • 数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序 #include void sort(int a[], int mid, int len) { int i=0, j, k; int temp = 0;...
  • 数组只能在初始化时整体赋初值。以后再赋值只能逐一改变了...// 初始化后,不能整体赋值 int ftime[] = new int[3]; ftime[] = {5,12,16}; 解决方法: 参见 “正确一”   正确一:  int ftime[] = new int[3];
  • 今天我们就来学习一下,如何对变量进行封装,以及使用自定义类、和setter/getter方法对数组进行封装。 一、封装变量 首先我们需要将设置的变量设置成为私有属性(private), 然后再写setter/getter方法进行封装...
  • 谭浩强的书上明确指出,字符数组可以在定义时整体赋值,不能再赋值语句中整体赋值。 1、定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的...
  • 数组只能在初始化时整体赋初值。... 分别遇到以下情况: 错误一:// 初始化后,不能整体赋值int ftime[] = new int[3];ftime[] = {5,12,16};解决方法:参见 “正确一” 正确一: int ftime[] = new int[3]; 
  • C++字符数组的赋值

    2015-06-09 17:10:32
    转载:... 定义一个数组char a[10]; 怎么给这个数组赋值呢? 1、定义的时候直接用字符串赋值 char a[10]="hello";...注意:不能先定义再给它赋值,如char a[10];...2、对数组中字符逐个赋值 char a
  • C语言:字符数组赋值

    2021-03-07 17:31:00
    1、定义的时候直接用字符串赋值 ...2、对数组中字符逐个赋值 char a[10]={‘h’,‘e’,‘l’,‘l’,‘o’}; //sizeof(a)为10 或char a[]={‘h’,‘e’,‘l’,‘l’,‘o’}; //sizeof(a)为5 3、利用strcpy
  • 字符数组初始化与赋值

    千次阅读 2017-12-29 10:58:35
    char a[10]; 怎么给这个数组赋值呢? 1、定义的时候直接用字符串赋值 char a[10]="hello";...2、对数组中字符逐个赋值 char a[10]={'h','e','l','l','o'}; 3、利用strcpy char a[10]; strcpy(a, "he
  • 只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值. char c[5]; c={′C′,′h′,′i′,′n... //对数组元素赋值,正确 如果已定义了a和b是具有相同类型和长度的数组,且b数组已被初始化,请分析: a=b; /...
  • 给字符数组赋值的方法

    千次阅读 2017-05-08 21:02:52
    看到好的东西总喜欢转载一波,哈哈,博主有问题的话可与我私聊char a[10]; 怎么给这个数组赋值呢? 1、定义的时候直接用字符...2、对数组中字符逐个赋值 char a[10]={‘h’,’e’,’l’,’l’,’o’}; 3、利用strcp
  • 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 initialized 先追加一个...
  • char a[10]; 怎么给这个数组赋值呢? 1、定义的时候直接用字符串赋值 char a[10]="hello";...2、对数组中字符逐个赋值 char a[10]={'h','e','l','l','o'}; 3、利用strcpy char a[10]; strcpy(a, "he
  • 字符串的赋值

    2020-08-05 11:17:25
    我们可以知道:char*p="helo"这种字符串的赋值方式是完全没有问题的。要理解这种赋值方式,我们首先得理解双引号(特別注意:这个是双引号,不要赋值的时候给弄了个单引号)在这个语句中做了什么工作。双引号主要做...

空空如也

空空如也

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

对数组整体赋值