游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

啃下这三块最难啃的硬骨头,你将在嵌入式C语言中大放异彩

  啃下这三块最难啃的硬骨头,你将在嵌入式C语言中大放异彩
  C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块难啃的硬骨头几乎是公认级别的。
  插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛
  0x01指针
  指针公认最难理解的概念,也是让很多初学者选择放弃的直接原因。
  指针之所以难理解,因为指针本身就是一个变量,是一个非常特殊的变量,专门存放地址的变量,这个地址需要给申请空间才能装东西,而且因为是个变量可以中间赋值,这么一倒腾很多人就开始犯晕了,绕不开弯了。C语言之所以被很多高手所喜欢,就是指针的魅力,中间可以灵活的切换,执行效率超高,这点也是让小白晕菜的地方。
  指针是学习绕不过去的知识点,而且学完C语言,下一步紧接着切换到数据结构和算法,指针是切换的重点,指针搞不定下一步进行起来就很难,会让很多人放弃继续学习的勇气。
  指针直接对接内存结构,常见的C语言里面的指针乱指,数组越界根本原因就是内存问题。在指针这个点有无穷无尽的发挥空间。很多编程的技巧都在此集结。
  指针还涉及如何申请释放内存,如果释放不及时就会出现内存泄露的情况,指针是高效好用,但不彻底搞明白对于有些人来说简直就是噩梦。
  在概念方面问题可以参见此前推文《对于C语言指针最详尽的讲解》,那么在指针方面可以参见一下大神的经验:
  复杂类型说明
  要了解指针,多多少少会出现一些比较复杂的类型。所以先介绍一下如何完全理解一个复杂类型。
  要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样。
  所以笔者总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析。
  下面让我们先从简单的类型开始慢慢分析吧。
  intp;
  这是一个普通的整型变量
  intp;
  首先从P处开始,先与结合,所以说明P是一个指针。然后再与int结合,说明指针所指向的内容的类型为int型,所以P是一个返回整型数据的指针
  intp〔3〕;
  首先从P处开始,先与〔〕结合,说明P是一个数组。然后与int结合,说明数组里的元素是整型的,所以P是一个由整型数据组成的数组。
  intp〔3〕;
  首先从P处开始,先与〔〕结合,因为其优先级比高,所以P是一个数组。然后再与结合,说明数组里的元素是指针类型。之后再与int结合,说明指针所指向的内容的类型是整型的,所以P是一个由返回整型数据的指针所组成的数组。
  int(p)〔3〕;
  首先从P处开始,先与结合,说明P是一个指针。然后再与〔〕结合(与()这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组。之后再与int结合,说明数组里的元素是整型的。所以P是一个指向由整型数据组成3个整数的指针。
  intp;
  首先从P开始,先与结合,说明P是一个指针。然后再与结合,说明指针所指向的元素是指针。之后再与int结合,说明该指针所指向的元素是整型数据。由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针。
  intp(int);
  从P处起,先与()结合,说明P是一个函数。然后进入()里分析,说明该函数有一个整型变量的参数,之后再与外面的int结合,说明函数的返回值是一个整型数据。
  int(p)(int);
  从P处开始,先与指针结合,说明P是一个指针。然后与()结合,说明指针指向的是一个函数。之后再与()里的int结合,说明函数有一个int型的参数,再与最外层的int结合,说明函数的返回类型是整型,所以P是一个指向有一个整型参数且返回类型为整型的函数的指针。
  int(p(int))〔3〕;
  可以先跳过,不看这个类型,过于复杂。从P开始,先与()结合,说明P是一个函数。然后进入()里面,与int结合,说明函数有一个整型变量参数。然后再与外面的结合,说明函数返回的是一个指针。之后到最外面一层,先与〔〕结合,说明返回的指针指向的是一个数组。接着再与结合,说明数组里的元素是指针,最后再与int结合,说明指针指向的内容是整型数据。所以P是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数。
  说到这里也就差不多了。理解了这几个类型,其它的类型对我们来说也是小菜了。不过一般不会用太复杂的类型,那样会大大减小程序的可读性,请慎用。这上面的几种类型已经足够我们用了。
  细说指针
  指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
  要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。
  先声明几个指针放着做例子:
  (1)intptr;
  (2)charptr;
  (3)intptr;
  (4)int(ptr)〔3〕;
  (5)int(ptr)〔4〕;
  指针的类型
  从语法的角度看,小伙伴们只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。
  让我们看看上述例子中各个指针的类型:
  (1)intptr;指针的类型是int
  (2)charptr;指针的类型是char
  (3)intptr;指针的类型是int
  (4)int(ptr)〔3〕;指针的类型是int()〔3〕
  (5)int(ptr)〔4〕;指针的类型是int()〔4〕
  怎么样?找出指针的类型的方法是不是很简单?
  指针所指向的类型
  当通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
  从语法上看,小伙伴们只需把指针声明语句中的指针名字和名字左边的指针声明符去掉,剩下的就是指针所指向的类型。
  上述例子中各个指针所指向的类型:
  (1)intptr;指针所指向的类型是int
  (2)charptr;指针所指向的的类型是char
  (3)intptr;指针所指向的的类型是int
  (4)int(ptr)〔3〕;指针所指向的的类型是int()〔3〕
  (5)int(ptr)〔4〕;指针所指向的的类型是int()〔4〕
  在指针的算术运算中,指针所指向的类型有很大的作用。
  指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当小伙伴们对C越来越熟悉时,就会发现,把与指针搅和在一起的类型这个概念分成指针的类型和指针所指向的类型两个概念,是精通指针的关键点之一。
  笔者看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。
  指针的值
  即指针所指向的内存区或地址。
  指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。
  在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。
  以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
  指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。
  以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?
  指针本身所占据的内存区
  指针本身占了多大的内存?只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据4个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。
  0x02函数
  面向过程对象模块的基本单位,以及对应各种组合,函数指针,指针函数
  一个函数就是一个业务逻辑块,是面向过程,单元模块的最小单元,而且在函数的执行过程中,形参,实参如何交换数据,如何将数据传递出去,如何设计一个合理的函数,不单单是解决一个功能,还要看是不是能够复用,避免重复造轮子。
  函数指针和指针函数,表面是两个字面意思的互换实际上含义截然不同,指针函数比较好理解,就是返回指针的一个函数,函数指针这个主要用在回调函数,很多人觉得函数都没还搞明白,回调函数更晕菜了。其实可以通俗的理解指向函数的指针,本身是一个指针变量,只不过在初始化的时候指向了函数,这又回到了指针层面。没搞明白指针再次深入的向前走特别难。
  C语言的开发者们为后来的开发者做了一些省力气的事情,他们编写了大量代码,将常见的基本功能都完成了,可以让别人直接拿来使用。但是那么多代码,如何从中找到自己需要的呢?将所有代码都拿来显然是不太现实。
  但是这些代码,早已被早期的开发者们分门别类地放在了不同的文件中,并且每一段代码都有唯一的名字。所以其实学习C语言并没有那么难,尤其是可以在动手锻炼做项目中进行。使用代码时,只要在对应的名字后面加上()就可以。这样的一段代码就是函数,函数能够独立地完成某个功能,一次编写完成后可以多次使用。
  很多初学者可能都会把C语言中的函数和数学中的函数概念搞混淆。其实真相并没有那么复杂,C语言中的函数是有规律可循迹的,只要搞清楚了概念你会发现还挺有意思的。函数的英文名称是Function,对应翻译过来的中文还有功能的意思。C语言中的函数也跟功能有着密切的关系。
  我们来看一小段C语言代码:
  include
  intmain()
  {
  puts(HelloWorld);
  return0;
  }
  把目光放在第4行代码上,这行代码会在显示器上输出HelloWorld。前面我们已经讲过,puts后面要带(),字符串也要放在()中。
  在C语言中,有的语句使用时不能带括号,有的语句必须带括号。带括号的就是函数(Function)。
  C语言提供了很多功能,我们只需要一句简单的代码就能够使用。但是这些功能的底层都比较复杂,通常是软件和硬件的结合,还要要考虑很多细节和边界,如果将这些功能都交给程序员去完成,那将极大增加程序员的学习成本,降低编程效率。
  有了函数之后,C语言的编程效率就好像有了神器一样,开发者们只需要随时调用就可以了,像进程函数、操作函数、时间日期函数等都可以帮助我们直接实现C语言本身的功能。
  C语言函数是可以重复使用的。
  函数的一个明显特征就是使用时必须带括号(),必要的话,括号中还可以包含待处理的数据。例如puts(果果小师弟)就使用了一段具有输出功能的代码,这段代码的名字是puts,尚观科技是要交给这段代码处理的数据。使用函数在编程中有专业的称呼,叫做函数调用(FunctionCall)。
  如果函数需要处理多个数据,那么它们之间使用逗号,分隔,例如:
  pow(10,2);
  该函数用来求10的2次方。
  好了,看到这里你有没有觉得其实C语言函数还是比较有意思的,而且并没有那么复杂困难。以后再遇到菜鸟小白的时候,你一口一个C语言的函数,说不定就能当场引来无数膜拜的目光。
  0x03结构体、递归
  很多在大学学习C语言的,很多课程都没学完,结构体都没学到,因为从章节的安排来看好像,结构体学习放在教材的后半部分了,弄得很多学生觉得结构体不重要,如果只是应付学校的考试,或者就是为了混个毕业证,的确学的意义不大。
  如果想从事编程这个行业,对这个概念还不了解,基本上无法构造数据模型,没有一个业务体是完全使用原生数据类型来完成的,很多高手在设计数据模型的时候,一般先把头文件中的结构体数据整理出来。然后设计好功能函数的参数,以及名字,然后才真正开始写c源码。
  如果从节省空间考虑结构体里面的数据放的顺序不一样在内存中占用的空间也不一样,结构体与结构体之间赋值,结构体存在指针那么赋值要特别注意,需要进行深度的赋值。
  递归一般用于从头到位统计或者罗列一些数据,在使用的时候很多初学者都觉得别扭,怎么还能自己调用自己?而且在使用的时候,一定设置好跳出的条件,不然无休止的进行下去,真就成无线死循环了。
  对于结构体方面的知识,可以参见此前推送的文章《C语言结构体(struct)最全的讲解(万字干货)》。具体也可以参见大佬的经验:
  相信大家对于结构体都不陌生。在此,分享出本人对C语言结构体的研究和学习的总结。如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了。当然,水平有限,若发现不足之处恳请指出。代码文件test。c我放在下面。在此,我会围绕以下2个问题来分析和应用C语言结构体:
  1。C语言中的结构体有何作用
  2。结构体成员变量内存对齐有何讲究(重点)
  对于一些概念的说明,我就不把C语言教材上的定义搬上来。我们坐下来慢慢聊吧。
  1。结构体有何作用
  三个月前,教研室里一个学长在华为南京研究院的面试中就遇到这个问题。当然,这只是面试中最基础的问题。如果问你你怎么回答?我的理解是这样的,C语言中结构体至少有以下三个作用:
  (1)有机地组织了对象的属性。
  比如,在STM32的RTC开发中,我们需要数据来表示日期和时间,这些数据通常是年、月、日、时、分、秒。如果我们不用结构体,那么就需要定义6个变量来表示。这样的话程序的数据结构是松散的,我们的数据结构最好是高内聚,低耦合的。所以,用一个结构体来表示更好,无论是从程序的可读性还是可移植性还是可维护性皆是:
  typedefstruct公历日期和时间结构体
  {
  vu16year;
  vu8month;
  vu8date;
  vu8hour;
  vu8min;
  vu8sec;
  }calendarobj;
  calendarobjcalendar;定义结构体变量
  (2)以修改结构体成员变量的方法代替了函数(入口参数)的重新定义。
  如果说结构体有机地组织了对象的属性表示结构体中看,那么以修改结构体成员变量的方法代替函数(入口参数)的重新定义就表示了结构体中用。继续以上面的结构体为例子,我们来分析。假如现在我有如下函数来显示日期和时间:
  voidDsipDateTime(calendarobjDateTimeVal)
  那么我们只要将一个calendarobj这个结构体类型的变量作为实参调用DsipDateTime()即可,DsipDateTime()通过DateTimeVal的成变量来实现内容的显示。如果不用结构体,我们很可能需要写这样的一个函数:
  voidDsipDateTime(vu16year,vu8month,vu8date,vu8hour,vu8min,vu8sec)
  显然这样的形参很不可观,数据结构管理起来也很繁琐。如果某个函数的返回值得是一个表示日期和时间的数据,那就更复杂了。这只是一方面。
  另一方面,如果用户需要表示日期和时间的数据中还要包含星期(周),这个时候,如果之前没有用机构体,那么应该在DsipDateTime()函数中在增加一个形参vu8week:
  voidDsipDateTime(vu16year,vu8month,vu8date,vu8week,vu8hour,vu8min,vu8sec)
  可见这种方法来传递参数非常繁琐。所以以结构体作为函数的入口参数的好处之一就是函数的声明voidDsipDateTime(calendarobjDateTimeVal)不需要改变,只需要增加结构体的成员变量,然后在函数的内部实现上对calendar。week作相应的处理即可。这样,在程序的修改、维护方面作用显著。
  typedefstruct公历日期和时间结构体
  {
  vu16year;
  vu8month;
  vu8date;
  vu8week;
  vu8hour;
  vu8min;
  vu8sec;
  }calendarobj;
  calendarobjcalendar;定义结构体变量
  (3)结构体的内存对齐原则可以提高CPU对内存的访问速度(以空间换取时间)。
  并且,结构体成员变量的地址可以根据基地址(以偏移量offset)计算。我们先来看看下面的一段简单的程序,对于此程序的分析会在第2部分结构体成员变量内存对齐中详细说明。
  include
  intmain()
  {
  struct声明结构体charshortlong
  {
  charc;
  shorts;
  longl;
  }charshortlong;
  struct声明结构体longshortchar
  {
  longl;
  shorts;
  charc;
  }longshortchar;
  struct声明结构体charlongshort
  {
  charc;
  longl;
  shorts;
  }charlongshort;
  printf();
  printf(Sizeofchardbytes,sizeof(char));
  printf(Sizeofshrotdbytes,sizeof(short));
  printf(Sizeoflongdbytes,sizeof(long));
  printf();charshortlong
  printf(Sizeofcharshortlongdbytes,sizeof(charshortlong));
  printf(Addrofcharshortlong。c0xp(10进制:d),charshortlong。c,charshortlong。c);
  printf(Addrofcharshortlong。s0xp(10进制:d),charshortlong。s,charshortlong。s);
  printf(Addrofcharshortlong。l0xp(10进制:d),charshortlong。l,charshortlong。l);
  printf();
  printf();longshortchar
  printf(Sizeoflongshortchardbytes,sizeof(longshortchar));
  printf(Addroflongshortchar。l0xp(10进制:d),longshortchar。l,longshortchar。l);
  printf(Addroflongshortchar。s0xp(10进制:d),longshortchar。s,longshortchar。s);
  printf(Addroflongshortchar。c0xp(10进制:d),longshortchar。c,longshortchar。c);
  printf();
  printf();charlongshort
  printf(Sizeofcharlongshortdbytes,sizeof(charlongshort));
  printf(Addrofcharlongshort。c0xp(10进制:d),charlongshort。c,charlongshort。c);
  printf(Addrofcharlongshort。l0xp(10进制:d),charlongshort。l,charlongshort。l);
  printf(Addrofcharlongshort。s0xp(10进制:d),charlongshort。s,charlongshort。s);
  printf();
  return0;
  }
  程序的运行结果如下(注意:括号内的数据是成员变量的地址的十进制形式):
  2。结构体成员变量内存对齐
  首先,我们来分析一下上面程序的运行结果。前三行说明在我的程序中,char型占1个字节,short型占2个字节,long型占4个字节。charshortlong、longshortchar和charlongshort是三个结构体成员相同但是成员变量的排列顺序不同。并且从程序的运行结果来看,
  Sizeofcharshortlong8bytes
  Sizeoflongshortchar8bytes
  Sizeofcharlongshort12bytes比前两种情况大4byte!
  并且,还要注意到,1byte(char)2byte(short)4byte(long)7byte,而不是8byte。
  所以,结构体成员变量的放置顺序影响着结构体所占的内存空间的大小。一个结构体变量所占内存的大小不一定等于其成员变量所占空间之和。如果一个用户程序或者操作系统(比如uCOSII)中存在大量结构体变量时,这种内存占用必须要进行优化,也就是说,结构体内部成员变量的排列次序是有讲究的。
  结构体成员变量到底是如何存放的呢?
  在这里,我就不卖关子了,直接给出如下结论,在没有pragmapack宏的情况下:
  原则1结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
  原则2结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
  原则3结构体作为成员时,结构体成员要从其内部最大元素大小的整数倍地址开始存储。(structa里存有structb,b里有char,int,double等元素时,那么b应该从8的整数倍地址处开始存储,因为sizeof(double)8bytes)
  这里,我们结合上面的程序来分析(暂时不讨论原则3)。
  先看看charshortlong和longshortchar这两个结构体,从它们的成员变量的地址可以看出来,这两个结构体符合原则1和原则2。注意,在charshortlong的成员变量的地址中,charshortlong。s的地址是1244994,也就是说,1244993是空的,只是被占位了!
  成员变量
  成员变量十六进制地址
  成员变量十进制地址
  charlongshort。c
  0x0012FF2C
  1244972hrcharlongshort。l
  0x0012FF30
  1244976hrcharlongshort。s
  0x0012FF34
  1244980hr可见,其内存分布图如下,共12bytes:
  首先,1244972能被1整除,所以charlongshort。c放在1244972处没有问题(其实,就char型成员变量自身来说,其放在任何地址单元处都没有问题),根据原则1,在之后的12449731244975中都没有能被4(因为sizeof(long)4bytes)整除的,1244976能被4整除,所以charlongshort。l应该放在1244976处,那么同理,最后一个。s(sizeof(short)2bytes)是应该放在1244980处。
  是不是这样就结束了?不是,还有原则2。根据原则2的要求,charlongshort这个结构体所占的空间大小应该是其占内存空间最大的成员变量的大小的整数倍。如果我们到此就结束了,那么charlongshort所占的内存空间是12449721244981共计10bytes,不符合原则2,所以,必须在最后补齐2个bytes(12449821244983)。
  至此,一个结构体的内存布局完成了。
  下面我们按照上述原则,来验证这样的分析是不是正确。按上面的分析,地址单元1244973、1244974、1244975以及1244982、1244983都是空的(至少charlongshort未用到,只是占位了)。如果我们的分析是正确的,那么,定义这样一个结构体,其所占内存也应该是12bytes:
  struct声明结构体charlongshortnew
  {
  charc;
  charadd1;补齐空间
  charadd2;补齐空间
  charadd3;补齐空间
  longl;
  shorts;
  charadd4;补齐空间
  charadd5;补齐空间
  }charlongshortnew;
  可见,我们的分析是正确的。至于原则3,大家可以自己编程验证,这里就不再讨论了。
  所以,无论你是在VC6。0还是KeilC51,还是KeilMDK中,当你需要定义一个结构体时,只要你稍微留心结构体成员变量内存对齐这一现象,就可以在很大程度上节约MCU的RAM。这一点不仅仅应用于实际编程,在很多大型公司,比如IBM、微软、百度、华为的笔试和面试中,也是常见的。
  这三大块硬骨头是学习C语言的绊脚石,下功夫拿掉基本上C语言的大动脉就打通了,那么再去学习别的内容就相对比较简单了。编程学习过程中越是痛苦的时候,学到的东西就会越多,克服过去就会自己的技能,放弃了前面的付出的时间都将清零。越是难学的语言在入门之后,在入门之后越觉得过瘾,而且还容易上瘾。你上瘾了没?还是放弃了?

刘国梁妻子王瑾16岁早恋退队,创业成亿万富婆,和婆婆亲如母女爱情也好,婚姻也罢,有时真的就是一场赌博。16岁的男女懂得什么是真爱吗?又有多少可以修成正果呢?可凡事无绝对,因为这样的幸运就在刘国梁与妻子王瑾身上开出了美丽的花朵。……Dior2017年春夏高定秀场妆容怎么拥有?每年时尚流行趋势都在不停的变化,那么今年2017年春夏最流行彩妆妆容又有怎样的变化?你又是否Get到了呢?快速掌握流行趋势,跟小编走进秀场一看究竟!迪奥春夏高定秀场妆容D……MissHana花娜小姐遮瑕膏怎么样MissHana花娜小姐来自中国宝岛台湾的一款化妆品牌,旗下的多款品牌在国内也有很多人喜欢使用,MissHana花娜小姐遮瑕膏便是其中的一款,下面我们就来说说MissHana花……巧用windows11安装助手,告别漫长等待你也可以直升wi随着win11的陆续推送,很多小伙们都想尝鲜最新的系统带来的变化,但是由于是逐步推送,因此有些小伙伴们可能没有在第一时间内接到推送,有点光火。其实有一个方法可以不用等待官方推送……卸妆水的正确使用方法卸妆产品的使用方法今天小编要和大家说到的是卸妆的问题,爱漂亮的美美们每天出门前总会对自己妆扮一番,大家都知道如果卸妆不正确便会导致化妆品对皮肤造成伤害,所以卸妆一定要掌握正确的使用方法,同时根据……marcheur三色遮瑕膏色号marcheur三色遮瑕膏试色一款平价的ispa三色遮瑕,在很多美妆博主的视频中都有推荐,来自日本的marcheur三色遮瑕膏,非常滋润遮瑕度很高的一款产品,不容易发干,妹纸们屯起来吧!marcheur三色……25岁用什么面霜好适合25岁用的面霜25岁时女人肌肤刚开始衰老,这个时候要使用抗衰老的产品,日常要多做面部保养。那么25岁用什么面霜好?下面提供适合25岁用的面霜。25岁用什么面霜好1、后津率享红华凝香集锦……女子网购化妆品遇寒潮到手成冰坨化妆品冻了还能用吗近日有一则新闻,一女子在网上网购了化妆品,但是近几天不是寒潮么,东西到手后,发现全部被冻住了,面对这种问题要怎么办呢?冻住的化妆品还能用吗?详细新闻报道近日,住在德阳的一……各国都吹过的牛,只有中国当真了,人工合成淀粉技术有望扎根火星人工合成淀粉对中国未来航天事业以及建立火星基地有多重要?之前小编也对这方面的可行性进行过一次探索,经过两天时间的资料查询,目前为止已经获得足够多的信息量,证明中国这项人工……大地色眼影的画法步骤图解大地色眼影教程大地色眼影是最日常最百搭的一个眼影配色,化妆新手一般都建议从大地色眼影开始画起,大地色眼影画的好能吸引更多的眼光,下面来看一下大地色眼影的画法步骤图解,大地色眼影教程。大地色眼……关注自动驾驶车易污染环境?机构称车载计算机对碳排放影响严重文:懂车帝原创刘艺伟〔懂车帝原创行业〕日前,据外媒报道,美国麻省理工学院(MIT)研究人员进行的最新研究显示,如果自动驾驶汽车被广泛采用,为它们提供算力的车载计算机所导致……兰蔻196口红试色兰蔻196朱砂橘兰蔻是很有名的一个知名彩妆品牌,兰蔻的化妆品一直做得很好,口红是我们必买的一个化妆品,兰蔻口红有很多系列,兰蔻196是最近很火的一个口红色号,下面我们就来看一下兰蔻196口红试……
香水小样可以带上飞机吗香水能随身带上飞机吗香水是大家都很喜欢用的彩妆产品,香水是可以带上飞机的,不过携带的容量是有限的,香水小样可以带上飞机,一般超过100毫升的香水就不能带上飞机了。香水小样可以带上飞机吗可以。……人民日报评在线会员乱象屡现少给用户挖坑,多给服务提质消费者侯先生在某互联网婚恋平台注册会员,按照协议,他可以获得服务费全额返还,该公司却以各种理由拖延;消费者蔡先生购买某互联网公司的云服务后,选择关闭自动续费服务,该公司依然扣除……注意!湖北恩施市籍人员非必要不得前往柬埔寨缅甸等八国湖北恩施发布恩施市籍人员非必要不得前往柬埔寨等八国是指,恩施市政府发布了一项措施,限制该市居民前往柬埔寨以及其他八个国家的旅行。需要关注以下几个方面的信息:对象:恩施市籍人员是……娇兰口红能不买壳子么娇兰口红不买盖可以吗娇兰的口红一直深受大家的欢迎与喜爱,娇兰宝石口红是很火的一个系列,这个系列的口红是需要配壳子购买的,有些人想知道娇兰口红能不能只买芯。娇兰口红能不买壳子么娇兰口红可以不买……刚刚,吴忠琼下达开工令!全市361个重大项目协同联动开工2月6日上午,2023年省市县三级重大项目协同联动开工暨项目大会战动员大会之后,市委、市政府接着举行2023年全市重大项目联动开工活动,全面吹响今年项目建设的冲锋号。列入本次联……琶洲省级经济开发区揭牌,独角兽企业为高质量发展添砖加瓦珠江岸旁,高楼大厦拔地而起,鳞次栉比,形成一片由科技与经济汇成的繁荣丛林。2月3日,春暖之际,海珠区召开了全区高质量发展大会,与此同时,正式为这片茂林琶洲省级经济开发区揭……安美素颜霜能直接涂吗基础护肤之后再涂男生都说喜欢素颜的女生,其实透过这句话你应该理解为:我喜欢素颜,但皮肤好的,火爆一时的安美素颜霜想必大家都知道,这款素颜霜价格不高,性价比比较好,下面5号网小编带大家来看一下安……amy安美是什么牌子?amy安美化妆品怎么样?amy安美这个牌子,从名字上就可以看出这个品牌的理念,安心美丽,不过这个牌子的价格非常低,所以很多人用起来非常担心是什么野鸡品牌!下面一起了解一下吧!amy安美是什么牌子……素颜霜可不可以美白素颜霜美白效果怎么样素颜霜是很多人喜欢用的一款护肤品,素颜霜有很好的美白肌肤效果,可以调亮肤色,在基础护肤护理的最后一步使用,是含有美白成分的面霜。素颜霜可不可以美白素颜霜是可以美白的。烟味……做资源咖,他凭啥?立春还没到的时候,刘宇宁又双叒叕进组了,搭档的是女主角宋祖儿,演的是鹅家的古偶《折腰》。很多人惊叹,他凭啥?靠腿长吗?1。hr上一部搭档刘诗诗的《一念关山》1……素颜霜怎么判定变质素颜霜变质的体现素颜霜是很多人伪素颜必备的一个神奇,素颜霜既有美颜的效果还能护理肌肤,素颜霜在使用过程中,一定要注意尽快使用和好好保存,变质的素颜霜一定不要使用。素颜霜怎么判定变质没判断……聚焦观察解密童心大荔县洛滨幼儿园教育集团共读活动打开一本好书,如与益友交谈;阅读一本好书,如受良师教诲;合上一本好书,如与知己握别。提升教师素养,从专业阅读开始。3月28日,大荔县洛滨幼儿园教育集团开展了《幼儿行为观察与案例……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网