深圳幻海软件技术有限公司 欢迎您!

C/C++如何给高效给数组赋值

2023-03-30

一、默认给数组赋值有两种情况:声明的同时初始化inta[5]={1,2,3,4,5};声明后再初始化inta[5];a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;注意!在c、c++中不允许将数组声明和整体初始化分开!如:inta[5];a[5]={1,2,3,4,5}这样做会

一、默认给数组赋值有两种情况:

  1. 声明的同时初始化
    int a[5]={1,2,3,4,5};
  2. 声明后再初始化
    int a[5];
    a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;

注意!在c、c++中不允许将数组声明和整体初始化分开!
如:
int a[5];
a[5]={1,2,3,4,5}
这样做会导致语法错误!

错误分析:由于数组下标从零开始,a[5]根本就不存在!
就算存在,此时的a[5] 也只代表它自己!根本不能代表数组整体!

因为C/C++中,数组名就是数组第一个元素的地址,也就是一个常量指针,比如,int a[100] , b[100] 则a和b都是常量指针int*const a(其值肯定是不同的),如果你执行a = b,那就是企图修改常量指针a的值,而在C/C++里,任何常量都是不允许被修改的。a[1]或*a才是a中第一个元素的内容。

很多数组在创建时都是第二种情况,但是一个个赋值有很麻烦有什么好的办法吗?

二、用结构体指针给数组赋值

#include <stdio.h>
 
typedef struct 
{
int iOne;
int iTwo;
int iThr;
}TRANS_HEAD_S;
 
typedef struct 
{
int iUser;
}USER_HEAD_S;
 
int main()
{
char acBuf[sizeof(TRANS_HEAD_S) + sizeof(USER_HEAD_S) + 4] = {0};
TRANS_HEAD_S *pstTransHead = NULL;
USER_HEAD_S *pstUserHead = NULL;
int i=0;
int *pValue = NULL;
    
    /*pstTransHead指针指向了acBuf的头*/
pstTransHead = (TRANS_HEAD_S *)acBuf;
 
pstTransHead->iOne = 11;
pstTransHead->iTwo = 12;
pstTransHead->iThr = 13;
 
    /*pstUserHead指向了acBuf的第13个字节的头,因为结构体TRANS_HEAD_S是12字节*/
pstUserHead = (USER_HEAD_S *)&pstTransHead[1];

pstUserHead->iUser = 14;
 
   /*pValue指向了acBuf的第17个字节的头,因为结构体TRANS_HEAD_S是12字节,USER_HEAD_S是4个字节*/
pValue = (int *)&pstUserHead[1];
 
(*pValue) = 15;
 
for(i = 0; i < sizeof(acBuf); i++)
{
printf("acBuf[%d] = %d\n", i, acBuf[i]);
}

return 0;
}
  • 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
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

结果:

acBuf[0] = 11
acBuf[1] = 0
acBuf[2] = 0
acBuf[3] = 0
acBuf[4] = 12
acBuf[5] = 0
acBuf[6] = 0
acBuf[7] = 0
acBuf[8] = 13
acBuf[9] = 0
acBuf[10] = 0
acBuf[11] = 0
acBuf[12] = 14
acBuf[13] = 0
acBuf[14] = 0
acBuf[15] = 0
acBuf[16] = 15
acBuf[17] = 0
acBuf[18] = 0
acBuf[19] = 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览42508 人正在系统学习中