学习笔记02

----------20150913----------------
1. 函数参数 a[]和*a为啥是一样的?
即fun(char a[])和fun(char *a)是一样的
找了一个比较好的分析:
最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误。一时也不能说得很明白,网上也搜了一下相关文章发现一些写的比较好的,综合了一下当教育资料备用。
 
char *s1 = "hello";
char s2[] = "hello";
 
【区别所在】
char *s1 的s1,指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
char s2[]的s2 是数组对应着一块内存区域,其地址和容量(数组大小)在生命期里不会改变,只有数组的内容可以改变
 
【内存模型】
       +-----+     +---+---+---+---+---+---+
   s1: |  *======> | h | e | l | l | o |\0 |
       +-----+     +---+---+---+---+---+---+
       +---+---+---+---+---+---+
   s2: | h | e | l | l | o |\0 |
       +---+---+---+---+---+---+
 
场景一)
char *s1 = "hello";
char s2[] = "hello";
s2=s1;  //编译ERROR
s1=s2;  //OK
 
分析:s2其地址和容量在生命期里不能改变
 
场景二)
char s2[] = "hello";
char *s1 = s2;  //编译器做了隐式的转换 实际为&s2

char *s1 = &s2;
 
分析:以上两个指针复值完全等价,由于编译器会做这个隐式转换也容易导致初学者误认为 char *s 与char s[]是一回事。
      另用第二种在一些编译器甚至会报警告信息。
 
场景三)
char *s1 = "hello";
char s2[] = "hello";
s1[0]='a';  //×运行ERROR( 这一句好像在一些的编译器不会出错,原因待查)
s2[0]='a';  //OK
 
分析:运行时会报错,原因在于企图改变s1的内容,由于s1指向的是常量字符串,其内容是不可修改的,因此在运行时不会通过。而s2指向的是变量区字符串,可以修改。
 
场景四)
让我们来给一个指针的指针赋值,在使用某些含char**参数的函数时会用到,场景二的增强版。
    char *s1="hello";
    char s2[]="hello";
    char *s3=s2;       //★注意这句必须要★
    char **s4=&s3;   //s2(char[])要用两步才能完成赋值
    char **s5=&s1;   //s1(char*) 只需一步
    printf("s4=[%s]\n",*s4);//打印结果:s4=[hello]
    printf("s5=[%s]\n",*s5);//打印结果:s5=[hello]
 
分析:这个例子应当说最能反映出char *与char []的差异,但是由于使用场合不多,新人尤其需要注意。
 
下面是一些char *s1 和 char s2[]相同的地方(同样编译器对char[]做了隐式变化):
1)作为形参完全相同
如:
   void function(char *s1);
   void function(char s1[]);
 
2)只读取不修改的时候
如:
    char *s1="hello";
    char s2[]="hello";
    printf("s1[1]=[%c]\n",s1[1]);   //s1[1]=[e] 
    printf("s2[1]=[%c]\n",s2[1]);   //s2[1]=[e] 
    printf("s1=[%s]\n",s1);         //s1=[hello]
    printf("s2=[%s]\n",s2);         //s2=[hello]


2. 二维指针**p怎么解释?
把两颗星看做一个整体符号吧,一个星的指针存放的是变量的地址。两颗星的指针存放的是指针的地址,这样理解一下。 举例:int i=5; int *p=&i; int **q=&p; 此时,一级指针p存放的是变量i的地址,通过p可以从地址层上操作i。 其次,二级指针q存放的是指针变量p的地址,通过q可以从地址层上去改变p的值,改变的p的值意味着什么?意味着p的指向发生了改变。 常见的情况用在二维数组比较多。


3.关于sort排序函数的调用:
sort函数的用法:
做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件<algorithm.h>。
这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。
拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len);
对向量v排序也差不多,sort(v.begin(),v.end());
排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。
如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp


bool cmp(int a,int b)
{
  return a>b;
}
 
排序的时候就写sort(a,a+100,cmp);
假设自己定义了一个结构体node
struct node{
  int a;
  int b;
  double c;
}
有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数:
以下是代码片段:
bool cmp(node x,node y)
{
   if(x.a!=y.a) return x.a
   if(x.b!=y.b) return x.b>y.b;
   return return x.c>y.c;
}
排序时写sort(arr,a+100,cmp);



### 关于SAP PP模块的学习资料 #### 物料主数据 物料主数据是在整个企业资源规划(ERP)系统中用于描述产品和服务的基础信息集合。这些信息对于采购、销售以及生产计划至关重要。在SAP PP环境中,物料主数据包含了有关原材料、半成品和最终产品的所有必要细节,比如物理属性、成本核算参数以及其他特定业务流程所需的信息[^1]。 #### BOM (Bill of Materials) BOM即物料清单,在制造过程中扮演着重要角色。它列出了构成某个具体项目所需的全部组件及其数量关系。通过定义不同层次上的子项结构,可以精确控制生产和装配过程中的材料消耗情况。此外,还可以关联到其他相关对象如工作中心或工艺路线来支持更复杂的加工逻辑。 #### 工作中心 工作中心是指执行某些操作的具体地点或者设备组;它们可能是机器、生产线甚至是人工工位等实体设施。为了有效管理生产能力并合理安排任务调度,每种类型的作业都需要指定相应的工作中心作为其运行场所。这有助于优化资源配置,并确保各项工序能够按照预定的时间表顺利完成。 #### 工艺路线 工艺路线详细规定了一个零件从投入到产出所经历的一系列连续的操作步骤。每个阶段都指定了具体的处理方法、预计耗时及负责该环节的工作中心位置。这种标准化的过程设计不仅提高了生产的可预测性和可控性,同时也便于追踪产品质量追溯路径。 #### 生产版本 当存在多种可能的产品变体或是不同的生产工艺可供选择时,则需要用到所谓的“生产版本”。这一概念允许企业在同一套基本框架下灵活调整实际使用的配方组合方式,从而更好地适应市场需求变化和技术进步趋势。例如,针对季节性因素影响下的特殊需求规格制定专门的生产方案。 ```python # Python代码示例:模拟创建简单的物料主记录类 class MaterialMasterRecord: def __init__(self, material_number, description, unit_of_measure): self.material_number = material_number self.description = description self.unit_of_measure = unit_of_measure def display_info(self): print(f"Material Number: {self.material_number}") print(f"Description: {self.description}") print(f"Unit of Measure: {self.unit_of_measure}") material_example = MaterialMasterRecord('MAT001', 'Example Product', 'PCS') material_example.display_info() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值