引爆潮流技术 Vue+Django REST framework打造生鲜电商项目
如果你还对Django框架不了解,强烈推荐从已上线实战课程《强力Django+杀手级xadmin开发在线教育网站》学起
课程重点讲解RESTFul API知识,主要面向后端开发者,为了补充后端同学对前端Vue认知不足,本课程特意简单的讲解了Vue前端项目的结构以及如何调试每个API接口数据
掌握Python语法丨掌握Django框架丨了解Vue 丨MySQL基础
#include <stdio.h>
#include <stdlib.h>
#include <string.h>/* 包含了运用字符串函数的所需的原型和声明,便于程序执行错误检查 */
#include <math.h>
typedef struct
{ int len;
int len1;
char data[0];//不占用内存空间,会在后面连续的分配一块内存空间运用,和指针区别开来
}SS1;
typedef struct
{ int len;
int len1;
int data[1];//占用内存空间,会在后面连续的分配一块内存空间运用,和指针区别开来
}SS2;
typedef struct
{ int len;
int len1;
char *data;//不占用内存空间,会在后面连续的分配一块内存空间运用,和指针区别开来
}SS3;
typedef struct
{ char len;
int len1;
char data;
}W0;
typedef struct
{ char len;
char len1;
int data;
}W1;
typedef struct
{ int len;
char len1;
short data;
double data1;
int len2;
}W2;
//#pragma pack(2)
/*构造体数据类型的对齐规则如下(常见圈套)
1.数据类型本身的对齐值:
关于char型数据,其本身对齐值为1,关于short型为2,关于int,float,double类型,其本身对齐值为4,单位字节。
2.构造体或者类的本身对齐值:其成员中本身对齐值最大的那个值。
3.指定对齐值:#pragma pack (value)时的指定对齐值value。
4.数据成员、构造体和类的有效对齐值:本身对齐值和指定对齐值中小的那个值。
*/
#pragma pack(2)/* 设置2字节对齐 */
typedef struct
{
char len1;
long int data1;
int len2;
}W3,*b;
#pragma pack() /* 取消指定对齐,恢复缺省对齐(4字节对齐) */
typedef enum
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday //尾部不能有逗号
}weekday;
void testarr(int *m);
void teststatic();
void Show(short n);
void testarr(int *m)
{
printf("arr name m1 = %d\n", sizeof(m));
}
void teststatic()
{
static int n=10;
printf("n = %d\n", n);
n++;
}
void Show(short n) {
short i;
printf("%d(",n);
for(i = 0; i < 16; ++i)
printf("%d",(n & (1 << (15 - i))) >> (15 - i));
printf(")B\n");
}
int main(int argc, char **argv)
{
#if 0
/*1.C言语的输入和输出函数的用法*/
printf("--------------------------1------------------------------\n");
int a[10] = {0};
//a++;
printf("a=%d\n",a[0]);
//printf("a=%d\n",a);
//printf("a=%d\n",&a);
int b = 0;
scanf("%d",&b);
printf("%d\n",b);
/*2.应用构造体定义变长数组和指针的比照*/
printf("--------------------------2------------------------------\n");
typedef struct
{ int len;
int data[0];
}SS;
SS sa;//构造体相关的部分变量初始化,不初始化后面的数据是一个随机值
//SS sa={0};
memset(&sa,0,sizeof(SS));//清空以上构造体中的随机值
printf("sizeof(SS)=%d\n",sizeof(SS));
printf("len=%d\n",sa.len);
printf("data=%d\n",sa.data[0]);
sa.len = 10;
sa.data[0] = 80;
sa.data[10] = 80;
sa.data[20] = 80;
sa.data[50] = 80;
sa.data[60] = 80;
sa.data[65] = 80;
sa.data[66] = 80;//到了67就不行了
printf("len = %d\n",sa.len);
printf("data0 = %d\n",sa.data[0]);
printf("data10 = %d\n",sa.data[10]);
printf("data20 = %d\n",sa.data[20]);
printf("data50 = %d\n",sa.data[50]);
printf("data60 = %d\n",sa.data[60]);
printf("data60 = %d\n",sa.data[65]);
printf("data60 = %d\n",sa.data[66]);
printf("sizeof(SS) = %d\n",sizeof(SS));
printf("sizeof(sa) = %d\n",sizeof(sa));
//SS1 sa1={0};
printf("sizeof(SS1)=%d\n",sizeof(SS1));
printf("sizeof(SS2)=%d\n",sizeof(SS2));
printf("sizeof(SS3)=%d\n",sizeof(SS3));
/*3.数组名和指针的关系(重难点)*/
printf("--------------------------3------------------------------\n");
int *m = 0;
m=a;
printf("m = %d\n", *m);
a=m;//a的本质是一个常量,因而不能放在右边
#endif
/*4.数组名作为函数形参(退化成指针)*/
printf("--------------------------4------------------------------\n");
int m1[15] = {0};
printf("arr name m1 = %d\n", sizeof(m1));
/* 退化成指针 */
testarr(m1);
testarr(&m1[0]);
/*5.sizeof运算符(类型占内存的大小) 和 strlen()函数(计算字符串的长度) 区别*/
printf("--------------------------5------------------------------\n");
char str[20]="0123456789abcd";
int a = strlen(str);//a=10;int b=sizeof(str) str退化为指针
int b = sizeof(str);//而b=20
int i = 0;
printf("a = %d, b = %d\n", a, b);
/* 6. string:是一串以NUL字节结尾的字符汇合*/
//while(NUL != str[i]) NUL需求定义和NULL(指针初值0在stdio.h定义指针初始化避免野指针很重要,部分变量在运用之前也一定要初始化)区别
printf("--------------------------6------------------------------\n");
while('\0' != str[i])
{
printf("STR the number of %d is %c\n",i,str[i]);
i++;
}
/*7.&(位运算构造是逐一位相与的值) &&(逻辑运算,结果是1 or 0只要两个结果 具有短路功用,只需第一个为false后面的就不在执行)*/
printf("--------------------------7------------------------------\n");
int x1 = 7 & 8;
printf("BIT calc number of %d\n",x1);
int x2 = 7 && 8;
printf("Logic calc number of %d\n",x2);
/*8.a指针常量(指针指向的地址不变,内容可变) b常量指针(指针指向的内存中的内容不变,地址可变)的区别*/
printf("--------------------------8------------------------------\n");
char* const pa = "abc";
//pa = "bcf";//非法
//*pa = 'p';非法,字符串常量不能够改动,数组定义的字符串能够修正,容易无视!!!!!!
printf("pa content is %c\n",*pa);
char const * pb = "abc";
pb = "bcf";
//*pb = "efc";//非法,内容不能够变
printf("pb content is %c\n",*pb);
//惯例
char const * const pc = "123abc"; //这个pc指向的地址和内容都不变,极端状况
printf("pc content is %c\n",*pc);//用于输出 指向的特定字符
printf("pc string content is %s\n" , pc);//用于输出整个字符串(缘由????)
/*9.a指针函数(本质是一个函数,返回值是一个指针) b函数指针(函数名是一个指针)的区别*/
/*
//类型标识符 *函数名(参数表)
a.int* f(x,y); 指针函数
b.int (*f) (int x); //声明一个函数指针
f=func; //将func函数的首地址赋给指针f(回调函数的变相运用)
*/
/* 函数指针的应用实例------回调函数(写一个通用的数比拟的回调函数,应用于不同的数据类型) 转换表(简化袖珍式计算器不用switch) */
printf("--------------------------分割开来------------------------------\n");
下载地址:百度云盘
来源:oschina
链接:https://my.oschina.net/u/4954034/blog/4944322