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

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

  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] = %dn", i, acBuf[i]);
	}
	
	return 0;
}

结果:

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