数组结构体简单用法

1、数组变量名是常指针,结构体变量名不是,return 数组变量名是指针不是数组,(局部定义的数组结束时释放,返回无意义)return结构体变量名是结构体

以此解释数组在声明后不能对变量名再次赋值,因为是常指针.字符串可以用指针变量赋值,其他可以memcpy()在<memory.h>以及<string.h>有定义

void *memcpy(void *dest, const void*src,size_t count);count以字节为单位一般sizeof(datatypelength)*N,指向const说明src指向内存不会更改

2、声明数组(全局除外)以及函数传参表不用指明元素个数,如void function(double*ptr)或void function(double ptr[]);

3、大型临时数组放在malloc堆,减少局部变量对函数调用栈的使用

5、size_t同本机的unsigned int

6、const限制符,变量是只读的,初始化后不能被改变,具有变量性质,命名空间作用域。

const int*p;指向const类对象

int*const p;常指针,指向后不更改,一个51单片机程序

unsigned char code cmd0[] = "buzz on"; //开蜂鸣器命令
unsigned char code cmd1[] = "buzz off"; //关蜂鸣器命令
unsigned char code cmd2[] = "showstr "; //字符串显示命令
unsigned char code cmdLen[] = { //命令长度汇总表
sizeof(cmd0)-1, sizeof(cmd1)-1, sizeof(cmd2)-1,
};
unsigned char code *cmdPtr[] = { //命令指针汇总表
&cmd0[0], &cmd1[0], &cmd2[0],
};

7、结构体自引用只能引用指针,指针的长度是已知,对指针类型解释实在结构体定义完成后需要的

8、结构体的复制这一点网上很多说法下面是我用过场合

typedef struct
{
    float llr[N][M + 1];
    uint8_t deCoCode[N];
    uint8_t sumForGnod[N]; 
}pathData, *ptrPathData;

typedef struct
{
    float pathMea;
    uint8_t tmpDeCoCode;
    ptrPathData ptrSpathData;
}pathMes, *ptrPathMes;
#define S_PDATA_CUR_INHRT  SpathData[curStruNum]
#define S_PDATA_CUR_CP SpathData[curStruNum + *(pathOffset + mesBitNum)]

S_PDATA_CUR_CP = S_PDATA_CUR_INHRT;//结构体赋值类似内存复制,如此而已
S_PMES_SNIP_CP = S_PMES_CUR_INHRT;//结构体里有指针,复制前后两个指针指向同一片区域,根据需要处理就可以了
*(SpathMes[(noSonIndex[i])].ptrSpathData) = *(SpathMes[(seSonIndex[i])].ptrSpathData);//Data内容替换
SpathMes[(seSonIndex[i])].ptrSpathData = SpathMes[(noSonIndex[i])].ptrSpathData;//指向Data的指针替换

 9、typedef习惯

typedef struct newstruct_s{//结构标签具有与其他标识符不同的独立命名空间,故与结构名相同即可
    int a,b;
    double c,d;
    struct newstruct_s *next;//有个元素类型就是结构本身应用struct newstruct_s,               
}newstruct_s;//_s结尾

当然,有人习惯用指针,不过具有全局性质的内部细节需要被用户所知的结构,少用typedef的话直观一些,typedef作用域与变量相同

10、从一个函数返回一个结构可以返回多个值

原文地址:https://www.cnblogs.com/yifan2015/p/5716207.html