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、从一个函数返回一个结构可以返回多个值