数组初始化及赋值的方法,memset的使用

1. 数组初始化:

  即定义时即赋值:

  int a[4]={0}; //每一个位置的int都为0

  int b[4]={1}; //只有第一个元素为1,其他都为0

  所以要想把数组初始化为其他值,则需要一个个的指定值: int b[4]={1,2,3,4};//比如指定为1,2,3,4

  或者先统一初始化为0,再利用for循环改变数组的每一个元素。

2. 数组的赋值:

  在定义过后,需要给数组每一个元素赋值时,不能再像初始化那样:

a[4] = {1,3,5,7}; //这是错误的,

a={1,3,5,7};//这还是错的。

  只能利用for循环,或者利用memcpy从其他内存拷贝一份值过来。

  当使用完成后,局部数组会由函数自动释放,全局数组则需进行下清零。

  这时候就要用到memset函数。

    memset(a,0,sizeof(a));

  或者memset(a,0,sizeof(int)*4);   //sizeof取的是字节。  memset是按字节进行赋值的,这里为16个字节:4*4

3. memset函数:memset(void *s, int ch,size_t n);    // C语言:#include <string.h> 或者 C++:  #include <cstring>

一般只用来清零,或者初始化局部数组为0,以免出现局部数组的每一个元素为乱值。所以第二个参数一般为0或者-1.

要注意:

  3.1 memset是按字节进行赋值,

  所以假设你想利用memset给a数组每一位置为1,memset(a,1,sizeof(a)); // 这时候你去打印a的每一位,值都是16843009,而非你期望的1

原因:int为四个字节,这时候每个字节被memset置为1,而每一个元素都是一个int,即 01 01 01 01,读取十六进制为 0x01010101,十进制为 16843009

不过 char类型的可以使用memset随意赋值为自己想要的,因为 char只占一个字节,赋多少就是多少。

   e.g.:

char a[3]={‘a‘ , ‘b‘, ‘c‘};

memset(a, 1,sizeof(a));

      for(int i=0;i<sizeof(a)/sizeof(a[0]);i++){

        printf("a[%u]=[%u]\n",i,a[i]);                   //得到a[1]=1; a[2]=1; a[3]=1;

       }

原文地址:https://www.cnblogs.com/yyzyxy/p/10336480.html

时间: 2024-08-03 09:20:02

数组初始化及赋值的方法,memset的使用的相关文章

C语言结构体数组内带字符数组初始化和赋值

1.首先定义结构体数组: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char cmdPropt[24];}; BleAndTspRmtCmd为结构体名,可以通过这个结构体名定义其他结构体变量,struct BleAndTspRmtCmd variable: 或者定义结构体数组变量,struct BleAndTspRmtCmd variable[]: 2.或者定义全局结构体变量,

python多维数组初始化后赋值的问题

当使用下述代码进行数组初始化时 >>>a = [[0]*3]*3 [[0,0,0], [0,0,0], [0,0,0]] >>>a[1][1] = 1 [[0,1,0], [0,1,0], [0,1,0]] >>>b = [[0,0,0],[0,0,0],[0,0,0]] [[0,0,0], [0,0,0], [0,0,0]] >>>b[1][1] = 1 [[0,0,0], [0,1,0], [0,0,0]] 这是因为初始化的问题,

字符数组初始化与赋值

char a[10];怎么给这个数组赋值呢?1.定义的时候直接用字符串赋值char a[10]="hello";注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!2.对数组中字符逐个赋值char a[10]={'h','e','l','l','o'};3.利用strcpychar a[10]; strcpy(a, "hello"); 易错情况:1.char a[10]; a[10]="hel

给字符数组赋值的方法

main() { char s[30]; strcpy(s, "Good News!"); /*给数组赋字符串*/ . . . } 上面程序在编译时, 遇到char s[30]这条语句时, 编译程序会在内存的某处留 出连续30个字节的区域, 并将第一个字节的地址赋给s.当遇到strcpy( strcpy 为 Turbo C2.0的函数)时, 首先在目标文件的某处建立一个"Good News!/0" 的字符串. 当中/0表示字符串终止, 终止符是编译时自己主动加上的,

动态申请 二维数组 以及初始化、 赋值

二维堆数组 可以利用指针的指针 例如 int ** array = new int[i][j]; 但是这样不能通过编译,因为堆数组不像基于栈数组那样工作,为其分配的内存是不连续的,因此堆数组分配足够的内存是不对的,应当先分配基于堆数组第一维数组下标分配一个连续的数组.该数组的每一个元素实际上是指向一个数组的指针. 一个测试小例: #include <iostream> #include <stdio.h> #include <cstring> using namespa

结构体数组初始化三种方法,转载

C语言结构体初始化的三种方法:原文链接http://www.2cto.com/kf/201503/386575.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include <stdio.h> struct student_st {     char c;     int score;     const c

C++数组初始化方法

定义: int *pia = new int[10]; // array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia. 在自由存储区中创建的数组对象是没有名字的,只能通过其地址间接地访问堆中的对象. 注意:C++使用new和delete在堆(自由存储区)上分配和释放动态数组. 动态数组初始化: 1. 元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始

c++数组初始化误区

看下面的一段代码: int statusArr[100] = {1} 能达到全都初始化为1的结果么? 结果是只有第一个元素初始化了为1,其他都是0. 之前经常写 int a[100]= {0} 这么写可以,为什么? 因为c++有个基本的语法规则,数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值.当我们写0没有问题因为恰好0是int的默认值罢了. string a[5] = { "foo", "", "", "&quo

Java之路(四)数组初始化

本文主要讲数组的初始化方法.可变参数列表以及可变参数列表对函数重载的影响. 数组初始化 定义数组的方式: int[] arr1; 或  int arr1[]; 数组初始化 通过上边的定义,我们只是得到了一个数组的引用.这时已经为引用分配了存储空间,但是还没有给数组对象本身分配任何空间.想要给数组对象分配存储空间,必须使用初始化表达式. a.在数组创建的地方进行初始化,如: int[] arr1 = {1,2,3,4,5}; 这种方式等价于使用new来进行存储空间分配. b.给数组的引用赋值,如: