对 C 语言指针最详尽的讲解

指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。

 

为什么需要指针?

 

指针解决了一些编程中基本的问题。

 

第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然小伙伴们也可以通过数据的复制达到相同的效果,但是这样往往效率不太好。

因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。

但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有4字节或者8字节或者其他可能)。

 

第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。

 

第三,有些操作必须使用指针。如操作申请的堆内存。

还有:C语言中的一切函数调用中,值传递都是“按值传递”的。

如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。

 

 

指针是什么?

 

 

我们知道:C语言中的数组是指一类类型,数组具体区分为  int 类型数组,double类型数组,char数组 等等。

同样指针这个概念也泛指一类数据类型,int指针类型,double指针类型,char指针类型等等。

 

通常,我们用int类型保存一些整型的数据,如 int num = 97 , 我们也会用char来存储字符:char ch = ‘a’。

 

我们也必须知道:任何程序数据载入内存后,在内存都有他们的地址,这就是指针。

而为了保存一个数据在内存中的地址,我们就需要指针变量。

 

因此:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。

 

 对 C 语言指针最详尽的讲解

 

 

为什么程序中的数据会有自己的地址?

 

弄清这个问题我们需要从操作系统的角度去认知内存。

 

电脑维修师傅眼中的内存是这样的:内存在物理上是由一组DRAM芯片组成的。

 

对 C 语言指针最详尽的讲解

 

而作为一个程序员,我们不需要了解内存的物理结构,操作系统将RAM等硬件和软件结合起来,给程序员提供的一种对内存使用的抽象。

这种抽象机制使得程序使用的是虚拟存储器,而不是直接操作和使用真实存在的物理存储器。

所有的虚拟地址形成的集合就是虚拟地址空间。

 

对 C 语言指针最详尽的讲解

 

在程序员眼中的内存应该是下面这样的。

 

对 C 语言指针最详尽的讲解

 

也就是说,内存是一个很大的,线性的字节数组(平坦寻址)。每一个字节都是固定的大小,由8个二进制位组成。

最关键的是,每一个字节都有一个唯一的编号,编号从0开始,一直到最后一个字节。

如上图中,这是一个256M的内存,他一共有256x1024x1024  = 268435456个字节,那么它的地址范围就是 0 ~268435455  。

 

由于内存中的每一个字节都有一个唯一的编号。

因此,在程序中使用的变量,常量,甚至数函数等数据,当他们被载入到内存中后,都有自己唯一的一个编号,这个编号就是这个数据的地址。

指针就是这样形成的。

 

下面用代码说明

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#include <stdio.h>
int main(void){ char ch = 'a'; int num = 97;    printf("ch 的地址:%p",&ch);   //ch 的地址:0028FF47    printf("num的地址:%p",&num);  //num的地址:0028FF40 return 0;}

 

对 C 语言指针最详尽的讲解

 

指针的值实质是内存单元(即字节)的编号,所以指针单独从数值上看,也是整数,他们一般用16进制表示。

指针的值(虚拟地址值)使用一个机器字的大小来存储。

也就是说,对于一个机器字为w位的电脑而言,它的虚拟地址空间是0~2w - 1 ,程序最多能访问2w个字节。

这就是为什么xp这种32位系统最大支持4GB内存的原因了。

 

我们可以大致画出变量ch和num在内存模型中的存储。(假设 char占1个字节,int占4字节)

 对 C 语言指针最详尽的讲解

 

 

变量和内存

 

为了简单起见,这里就用上面例子中的  int num = 97 这个局部变量来分析变量在内存中的存储模型。

 对 C 语言指针最详尽的讲解

 

已知:num的类型是int,占用了4个字节的内存空间,其值是97,地址是0028FF40。我们从以下几个方面去分析。

 

1、内存的数据

 

内存的数据就是变量的值对应的二进制,一切都是二进制。

97的二进制是 : 00000000 00000000 00000000 0110000 , 但使用的小端模式存储时,低位数据存放在低地址,所以图中画的时候是倒过来的。

 

2、内存数据的类型

 

内存的数据类型决定了这个数据占用的字节数,以及计算机将如何解释这些字节。

num的类型是int,因此将被解释为 一个整数。

 

3、内存数据的名称

 

内存的名称就是变量名。实质上,内存数据都是以地址来标识的,根本没有内存的名称这个说法,这只是高级语言提供的抽象机制 ,方便我们操作内存数据。

而且在C语言中,并不是所有的内存数据都有名称,例如使用malloc申请的堆内存就没有。

 

4、内存数据的地址

 

如果一个类型占用的字节数大于1,则其变量的地址就是地址值最小的那个字节的地址。

因此num的地址是 0028FF40。内存的地址用于标识这个内存块。

 

5、内存数据的生命周期

 

num是main函数中的局部变量,因此当main函数被启动时,它被分配于栈内存上,当main执行结束时,消亡。

    

如果一个数据一直占用着他的内存,那么我们就说他是“活着的”,如果他占用的内存被回收了,则这个数据就“消亡了”。

C语言中的程序数据会按照他们定义的位置,数据的种类,修饰的关键字等因素,决定他们的生命周期特性。

实质上我们程序使用的内存会被逻辑上划分为:栈区,堆区,静态数据区,方法区。

不同的区域的数据有不同的生命周期。

 

无论以后计算机硬件如何发展,内存容量都是有限的,因此清楚理解程序中每一个程序数据的生命周期是非常重要的。

 

指针变量和指向关系

 

用来保存指针的变量,就是指针变量。

如果指针变量p1保存了变量 num的地址,则就说:p1指向了变量num,也可以说p1指向了num所在的内存块 ,这种指向关系,在图中一般用 箭头表示。

 对 C 语言指针最详尽的讲解

 

上图中,指针变量p1指向了num所在的内存块 ,即从地址0028FF40开始的4个byte 的内存块。

 

定义指针变量

 

C语言中,定义变量时,在变量名前写一个 * 星号,这个变量就变成了对应变量类型的指针变量。必要时要加 ( ) 来避免优先级的问题。

 

引申:C语言中,定义变量时,在定义的最前面写上 typedef ,那么这个变量名就成了一种类型,即这个类型的同义词。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
int a ; //int类型变量 aint *a ; //int* 变量aint arr[3]; //arr是包含3个int元素的数组int (* arr )[3]; //arr是一个指向包含3个int元素的数组的指针变量
//-----------------各种类型的指针------------------------------
int *p_int; //指向int类型变量的指针 
double *p_double; //指向idouble类型变量的指针 
struct Student *p_struct; //结构体类型的指针
int(*p_func)(int,int); //指向返回类型为int,有2个int形参的函数的指针
int(*p_arr)[3]; //指向含有3个int元素的数组的指针
int **p_pointer; //指向 一个整形变量指针的指针

 

取地址

 

既然有了指针变量,那就得让他保存其它变量的地址,使用& 运算符取得一个变量的地址。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
int add(int a , int b){    return a + b;}
int main(void){ int num = 97; float score = 10.00F; int arr[3] = {1,2,3};
//-----------------------
int* p_num = &num; float* p_score = &score; int (*p_arr)[3] = &arr; int (*fp_add)(int ,int ) = add; //p_add是指向函数add的函数指针 return 0;}

 

特殊的情况,他们并不一定需要使用&取地址:

 

  • 数组名的值就是这个数组的第一个元素的地址。

  • 函数名的值就是这个函数的地址。

  • 字符串字面值常量作为右值时,就是这个字符串对应的字符数组的名称,也就是这个字符串在内存中的地址。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
int add(int a , int b){    return a + b;}int main(void){    int arr[3] = {1,2,3};    //-----------------------    int* p_first = arr;    int (*fp_add)(int ,int )  =  add;    const char* msg = "Hello world";    return 0;}

 

解地址

 

我们需要一个数据的指针变量干什么?

当然使用通过它来操作(读/写)它指向的数据啦。

对一个指针解地址,就可以取到这个内存数据,解地址的写法,就是在指针的前面加一个*号。

 

解指针的实质是:从指针指向的内存块中取出这个内存数据。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
int main(void){    int age = 19;    int*p_age = &age;    *p_age  = 20;  //通过指针修改指向的内存数据
printf("age = %d",*p_age); //通过指针读取指向的内存数据 printf("age = %d",age);
return 0;}

 

指针之间的赋值

 

指针赋值和int变量赋值一样,就是将地址的值拷贝给另外一个。

指针之间的赋值是一种浅拷贝,是在多个编程单元之间共享内存数据的高效的方法。

 

 

  •  
  •  
  •  
  •  
int *p1  = & num;int *p3 = p1;
//通过指针 p1 、 p3 都可以对内存数据 num 进行读写,如果2个函数分别使用了p1 和p3,那么这2个函数就共享了数据num。

 

对 C 语言指针最详尽的讲解

 

空指针

 

指向空,或者说不指向任何东西。

在C语言中,我们让指针变量赋值为NULL表示一个空指针,而C语言中,NULL实质是 ((void*)0) ,  在C++中,NULL实质是0。

 

换种说法:任何程序数据都不会存储在地址为0的内存块中,它是被操作系统预留的内存块。

 

下面代码摘自 stdlib.h

 

  •  
  •  
  •  
  •  
  •  
#ifdef __cplusplus     #define NULL    0#else         #define NULL    ((void *)0)#endif

 

坏指针

 

指针变量的值是NULL,或者未知的地址值,或者是当前应用程序不可访问的地址值,这样的指针就是坏指针。

不能对他们做解指针操作,否则程序会出现运行时错误,导致程序意外终止。

 

任何一个指针变量在做解地址操作前,都必须保证它指向的是有效的,可用的内存块,否则就会出错。

坏指针是造成C语言Bug的最频繁的原因之一。

 


下面的代码就是错误的示例。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
void opp(){     int *p = NULL;     *p = 10;      //Oops! 不能对NULL解地址}
void foo(){ int *p; *p = 10; //Oops! 不能对一个未知的地址解地址}
void bar(){ int *p = (int*)1000; *p =10; //Oops! 不能对一个可能不属于本程序的内存的地址的指针解地址}

 

 

指针的2个重要属性

 

指针也是一种数据,指针变量也是一种变量,因此指针 这种数据也符合前面变量和内存主题中的特性。

这里要强调2个属性:指针的类型,指针的值。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
int main(void){    int num = 97;    int *p1  = &num;    char *p2 = (char*)(&num);
    printf("%d",*p1);     //输出  97    putchar(*p2);          //输出  a return 0;}

 

指针的值:很好理解,如上面的num 变量 ,其地址的值就是0028FF40 ,因此 p1的值就是0028FF40。

数据的地址用于在内存中定位和标识这个数据,因为任何2个内存不重叠的不同数据的地址都是不同的。

 

指针的类型:指针的类型决定了这个指针指向的内存的字节数并如何解释这些字节信息。

一般指针变量的类型要和它指向的数据的类型匹配。

 

由于num的地址是0028FF40,因此 p1 和 p2 的值都是0028FF40

 

*p1  :  将从地址0028FF40 开始解析,因为p1是int类型指针,int占4字节,因此向后连续取4个字节,并将这4个字节的二进制数据解析为一个整数 97。

 

*p2  :  将从地址0028FF40 开始解析,因为p2是char类型指针,char占1字节,因此向后连续取1个字节,并将这1个字节的二进制数据解析为一个字符,即’a’。

 

同样的地址,因为指针的类型不同,对它指向的内存的解释就不同,得到的就是不同的数据。

 

void*类型指针 

 

由于void是空类型,因此void*类型的指针只保存了指针的值,而丢失了类型信息,我们不知道他指向的数据是什么类型的,只指定这个数据在内存中的起始地址。

如果想要完整的提取指向的数据,程序员就必须对这个指针做出正确的类型转换,然后再解指针。

因为,编译器不允许直接对void*类型的指针做解指针操作。

 

结构体和指针

 

结构体指针有特殊的语法:-> 符号

如果p是一个结构体指针,则可以使用 p ->【成员】 的方法访问结构体的成员

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
typedef struct{    char name[31];    int age;    float score;}Student;
int main(void){ Student stu = {"Bob" , 19, 98.0}; Student*ps = &stu;
ps->age = 20; ps->score = 99.0; printf("name:%s age:%d",ps->name,ps->age); return 0;}

 

数组和指针

 

1、数组名作为右值的时候,就是第一个元素的地址。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
int main(void){    int arr[3] = {1,2,3};
int *p_first = arr;    printf("%d",*p_first);  //1 return 0;}

 

2、指向数组元素的指针 支持 递增 递减 运算。
(实质上所有指针都支持递增递减 运算 ,但只有在数组中使用才是有意义的)

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
int main(void){    int arr[3] = {1,2,3};
int *p = arr; for(;p!=arr+3;p++){        printf("%d",*p);  } return 0;}

 

3、p= p+1 意思是,让p指向原来指向的内存块的下一个相邻的相同类型的内存块。

 

同一个数组中,元素的指针之间可以做减法运算,此时,指针之差等于下标之差。

 

4、p[n]    == *(p+n)

     p[n][m]  == *(  *(p+n)+ m )

 

5、当对数组名使用sizeof时,返回的是整个数组占用的内存字节数。当把数组名赋值给一个指针后,再对指针使用sizeof运算符,返回的是指针的大小。

 

这就是为什么将一个数组传递给一个函数时,需要另外用一个参数传递数组元素个数的原因了。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
int main(void){    int arr[3] = {1,2,3};
int *p = arr;    printf("sizeof(arr)=%d",sizeof(arr));  //sizeof(arr)=12    printf("sizeof(p)=%d",sizeof(p));   //sizeof(p)=4
return 0;}

 

函数和指针

 

函数的参数和指针

 

C语言中,实参传递给形参,是按值传递的,也就是说,函数中的形参是实参的拷贝份,形参和实参只是在值上面一样,而不是同一个内存数据对象。

这就意味着:这种数据传递是单向的,即从调用者传递给被调函数,而被调函数无法修改传递的参数达到回传的效果。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
void change(int a){    a++;      //在函数中改变的只是这个函数的局部变量a,而随着函数执行结束,a被销毁。age还是原来的age,纹丝不动。}int main(void){    int age = 19;    change(age);    printf("age = %d",age);   // age = 19    return 0;}

 

有时候我们可以使用函数的返回值来回传数据,在简单的情况下是可以的。

但是如果返回值有其它用途(例如返回函数的执行状态量),或者要回传的数据不止一个,返回值就解决不了了。

 

传递变量的指针可以轻松解决上述问题。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
void change(int *pa){    (*pa)++;   //因为传递的是age的地址,因此pa指向内存数据age。当在函数中对指针pa解地址时,               //会直接去内存中找到age这个数据,然后把它增1}int main(void){    int age = 19;    change(&age);    printf("age = %d",age);   // age = 20    return 0;}

 

再来一个老生常谈的,用函数交换2个变量的值的例子:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#include <stdio.h>
void swap_bad(int a,int b);void swap_ok(int*pa,int*pb);
int main(){ int a = 5; int b = 3; swap_bad(a,b); //Can`t swap; swap_ok(&a,&b); //OK return 0;}
//错误的写法void swap_bad(int a,int b){ int t; t=a; a=b; b=t;}
//正确的写法:通过指针void swap_ok(int*pa,int*pb){ int t; t = *pa; *pa = *pb; *pb = t;}

 

对 C 语言指针最详尽的讲解

对 C 语言指针最详尽的讲解

 

有的时候,我们通过指针传递数据给函数不是为了在函数中改变他指向的对象。

相反,我们防止这个目标数据被改变。传递指针只是为了避免拷贝大型数据。

 

考虑一个结构体类型Student。我们通过show函数输出Student变量的数据。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
typedef struct{    char name[31];    int age;    float score;}Student;

//打印Student变量信息void show(const Student * ps){    printf("name:%s , age:%d , score:%.2f",ps->name,ps->age,ps->score);   }

 

我们只是在show函数中取读Student变量的信息,而不会去修改它,为了防止意外修改,我们使用了常量指针去约束。

另外我们为什么要使用指针而不是直接传递Student变量呢?

 

从定义的结构看出,Student变量的大小至少是39个字节,那么通过函数直接传递变量,实参赋值数据给形参需要拷贝至少39个字节的数据,极不高效。

而传递变量的指针却快很多,因为在同一个平台下,无论什么类型的指针大小都是固定的:X86指针4字节,X64指针8字节,远远比一个Student结构体变量小。

 

函数的指针

 

每一个函数本身也是一种程序数据,一个函数包含了多条执行语句,它被编译后,实质上是多条机器指令的合集。

在程序载入到内存后,函数的机器指令存放在一个特定的逻辑区域:代码区。

既然是存放在内存中,那么函数也是有自己的指针的。

 

C语言中,函数名作为右值时,就是这个函数的指针。

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
void echo(const char *msg){    printf("%s",msg);}int main(void){    void(*p)(const char*) = echo;   //函数指针变量指向echo这个函数
p("Hello "); //通过函数的指针p调用函数,等价于echo("Hello ")    echo("World"); return 0;}

 

const和指针

 

const到底修饰谁?谁才是不变的?

 

如果const 后面是一个类型,则跳过最近的原子类型,修饰后面的数据。
(原子类型是不可再分割的类型,如int, short , char,以及typedef包装后的类型)

 

如果const后面就是一个数据,则直接修饰这个数据。

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
int main(){    int a = 1;
int const *p1 = &a; //const后面是*p1,实质是数据a,则修饰*p1,通过p1不能修改a的值 const int *p2 = &a; //const后面是int类型,则跳过int ,修饰*p2, 效果同上
    int *const p3 = NULL;      //const后面是数据p3。也就是指针p3本身是const .
    const int *const p4 = &a;  // 通过p4不能改变a 的值,同时p4本身也是 const    int const *const p5 = &a;  //效果同上
return 0;
} typedef int *pint_t;  //将 int* 类型 包装为 pint_t,则pint_t 现在是一个完整的原子类型
int main(){ int a = 1; const pint_t p1 = &a; //同样,const跳过类型pint_t,修饰p1,指针p1本身是const pint_t const p2 = &a; //const 直接修饰p,同上
    return 0;}

 

深拷贝和浅拷贝

 

如果2个程序单元(例如2个函数)是通过拷贝他们所共享的数据的指针来工作的,这就是浅拷贝,因为真正要访问的数据并没有被拷贝。

如果被访问的数据被拷贝了,在每个单元中都有自己的一份,对目标数据的操作相互不受影响,则叫做深拷贝。

 对 C 语言指针最详尽的讲解

 

 

附加知识

 

指针和引用这个2个名词的区别。他们本质上来说是同样的东西。

指针常用在C语言中,而引用,则用于诸如Java,C#等 在语言层面封装了对指针的直接操作的编程语言中。

 

大端模式和小端模式

 

1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。个人PC常用,Intel X86处理器是小端模式。

 

2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

 

采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。

有些机器同时支持大端和小端模式,通过配置来设定实际的端模式。

 

假如 short类型占用2个字节,且存储的地址为0x30。

short a = 1;

 

如下图:

 

 对 C 语言指针最详尽的讲解

 

//测试机器使用的是否为小端模式。是,则返回true,否则返回false
//这个方法判别的依据就是:C语言中一个对象的地址就是这个对象占用的字节中,地址值最小的那个字节的地址。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
bool isSmallIndain(){      unsigned int val = 'A';      unsigned char* p = (unsigned char*)&val;  //C/C++:对于多字节数据,取地址是取的数据对象的第一个字节的地址,也就是数据的低地址
return *p == 'A';}

 

 

– EOF –

转自:https://mp.weixin.qq.com/s/IZgKdwJbH-5C2LoWOhZNaQ

俞敏洪回忆强势的母亲:妈妈是一种无限的存在

俞敏洪回忆强势的母亲:妈妈是一种无限的存在

我从父亲那里学到了宽厚,学到了退一步海阔天高的态度,又从母亲那里继承了坚忍不拔、决不放弃的精神。父母成就了我的个性,我的个性中融入了父母的优点,他们个性中的矛盾也结合到了我一个人身上。今天我做事的风格和为人处世的态度,几乎每一点都能够从我的父母身上找到来源。

俞敏洪回忆强势的母亲:妈妈是一种无限的存在
我从小就知道生活的艰辛和不易,知道人需要坚毅和努力,这要归功于我的母亲。
母亲总共生了三个孩子,我上面有一个姐姐和一个哥哥。但我哥哥在四岁的时候得了肺炎,我外婆迷信,说是被鬼相了,不让送医院,结果最后一刻送到医院肺都烧黑了,医生说来晚了一个小时,最后只能眼睁睁地看着我哥哥离开这个世界。母亲撕心裂肺哭了很长时间,回头把全部的爱都倾泻到了我身上。
我小时候很不争气,同时得了哮喘病和肝炎,把我父母弄得提心吊胆了很多年,最后总算活了下来。小时候我能记得的第一件事情就是天天打针,每天因为打针我像杀猪一样地哭。我母亲被我哥哥的死弄得胆战心惊,只要我有一点毛病就送我去打针。我姐比我大五岁,高中毕业后当了赤脚医生。这事和我有很密切的关系,因为我姐当了医生,给我打针就方便了。
母亲是个个性很刚强的女人。母亲有兄弟姐妹八个,因此我有六个舅舅和一个姨妈,从我记事起我的这些舅舅和姨妈就很听母亲的话。谁家要有了问题,只要母亲一出面,她怎样决断大家就怎样做,从来没有人反对,不是因为她凶,而是因为她的威望高。据说在母亲很小的时候,她的这些哥哥姐姐们就都听她的指挥。
母亲是我们生产队的妇女队长,生产队的工作没有她的决策就几乎没法进行下去。她公正无私,做事情带头吃苦,所以威望极高。我记忆中的两件事情说明母亲是个极好的人,一是有一次突然下大雨,家家户户场上晒着粮食,母亲带领全家拼命帮助人家把粮食往回搬,结果自己家的粮食被淋了个透湿。还有一件事情是每当村上有人家断了炊,母亲一定是第一个把自己家剩下的粮食分出一半送过去的人,所以整个村庄都佩服她,听她的调遣也就成了很自然的事情。
老太太在北京住了十几年,但只要一回到村上,大家就会很自然地把村上搁置下来的事情交给她来决断。从我记事起,我家的事情就都由母亲说了算,父亲落得什么都不管,自己喝酒快活,所以养成了什么都无所谓的宽厚个性。
尽管母亲很爱我,但却从来没有宠过我。她也许是太了解生活的艰难了,所以从小就训练我面对生活的勇气。我从小就在农田里干活,插秧、割稻、撒猪粪,样样都干,从来没有过被娇宠的感觉。父母下地干活,我就在家做饭、炒菜、洗衣服,到现在我还保留着自己做饭洗衣服的习惯。每天放学回家,我就忙着割草、喂猪、放羊,一年里的几头猪几只羊,是全家能够换点钱过年的唯一保证。有一年冬天下了雪,家里没有了草喂猪喂羊,母亲让我拎着篮子到野地里去,把雪拨开,把雪底下的青草一棵棵割起来。我割了整整一天,冻得半死,但却收获了满满两大篮子的青草。这一天成了我童年里最艰苦也最美好的记忆之一。
在我的记忆中,母亲几乎没有打过我。她根本不需要打我,只要看我两眼,我就知道自己必须加倍努力,否则事情会很严重,所以我的勤奋很大程度上是被我妈逼出来的。如果没有我的母亲,我肯定到不了今天这个地步。
俞敏洪回忆强势的母亲:妈妈是一种无限的存在
母亲唯一一次打我是因为一双凉鞋。农村孩子从小赤脚,很少穿鞋。大概在我八岁的时候,母亲用她攒了很久的几块钱,一狠心给我买了一双崭新的凉鞋。我穿上后那个高兴啊,一路就向小朋友们炫耀,然后又和他们一起到河里游泳,游完泳就赤着脚回了家,完全忘了凉鞋的事。回家后母亲一眼就看到了没有凉鞋,马上和我一起去河边找,哪里还有凉鞋的影子。母亲那个气啊,揪住我一顿臭打,把一根竹竿都打断了。刚打完,别人就把捡到的凉鞋送来了。晚上我疼得屁股都坐不下去,母亲又抱着我哭了一夜。
我后来能够上大学,能够成为老师,也是因为母亲。从小母亲就说在农村一辈子太苦了,能够当个先生最好。农村人嘴里的先生就是老师的意思,所以我从小被母亲念叨得对老师这个职业充满了憧憬,因此不管怎样被老师折磨,都认为老师是神圣不可侵犯的崇高人物。还好我从小就喜欢读书,尽管上学成绩不好,但从不厌学。
高中毕业时的1978年,中国迎来了全国第一次高考统考,我也参加了考试。结果自然是一败涂地,英语才考了33分。回到农村种地,我死心了母亲不死心。听说家乡的一所初中缺英语老师,她就拼命到校长家走关系,说我高考考的就是英语,英语水平很好,硬是把我塞进学校去当了代课老师。那一年我16岁,英语是勉强能背完26个字母的水平,哪里能够教学生。但农村的初一似乎怎么教都行,学生还很喜欢我。从当代课老师开始,我决定第二次参加高考,结果又落榜了。之所以决定考第三次,也是母亲起了重要作用。我本来都打算放弃高考了,但母亲听说县政府正在办一个高考外语补习班,就拼命在城里请人帮忙让我进去。她一个农村妇女,在城里哪有什么关系啊,可她硬是找到了补习班的班主任老师,把老师感动得不得不收下了我。母亲从城里回来那天晚上,刚好下着大暴雨,路上她摔沟里去了好几次。我在家里等着母亲,一看到她浑身泥水雨水,成了个落汤鸡的模样,立刻就明白了这一次只有一条路了。拼命了一年以后,我终于走进了北京大学。在我拿到录取通知书之后,母亲一高兴,把家里的两头猪都给宰了,让全村人足足吃了两天。
开办新东方以后,我经济上宽裕了一些,就把母亲接来了北京。老太太闲不住,经常会到新东方来转转,结果新东方所有的人都开始跟她熟识起来。老太太热心,总是这样那样帮助别人排忧解难,因此赢得了很多人的敬重,大家都热情地叫她阿婆。
我从父亲那里学到了宽厚,学到了退一步海阔天高的态度,又从母亲那里继承了坚忍不拔、决不放弃的精神。父母成就了我的个性,我的个性中融入了父母的优点,他们个性中的矛盾也结合到了我一个人身上。今天我做事的风格和为人处世的态度,几乎每一点都能够从我的父母身上找到来源。

转自:https://mp.weixin.qq.com/s/EiGwisdtH9GutDbkUtzk1A

美国“悍然”切断44条中美航班,背后的深意令人细思极恐!

◎智谷趋势(ID:zgtrend) |  杨轨山

美国“悍然”中断了中国44个往返美国的航班。
根据路透社的报道,1月21日美国交通部将暂停4家中国航空公司执飞中美航线的44个航班。这项措施将从1月30日起生效,直至3月29日,受影响的四家中国航班包括,厦门航空、中国国际航空、中国南方航空和中国东方航空的航班。
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
美国在中美航线搞事情,这已经是第4次了。只不过,这次最过分。
原因是从2021年12月31日到2022年1月18日,中国相关机构向美国三大航空公司发出20多份熔断令,总共涉及44班。美国方面以“对等”为借口发起所谓反制。
在中国农历春节前夕,美国的做法无异于斩断了旅美中国人归乡路。
很多中国人认为,这是美国打着“公平”幌子,在为自己糟糕的疫情防控继续着不负责任的甩锅行为;甚至有相当一部分中国人相信,美国就是在故意要把病毒输入中国。
但从更长远来看,“禁航”事件不经意间展示了未来在中国与海外之间防疫策略可能的冲突。
由于西方权威专家相信,新冠病毒无法消灭,但新冠全球大流行即将迎来终结,这使得中国全面清零与外国的与病毒共存两种防疫体制的冲突迟早会被激发。
禁航事件,无疑就是这一冲突的一次提前预演。
事实上,来自外部的压力已经初步显现。
就在2天前,世界卫生组织发出最新建议:恢复国际旅行,取消疫苗签证!
昨天,国际货币基金组织的经济展望论坛上,有专家认为:中国的清零政策让世界经济承受了很大负担。
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
那么,中国未来能够面对来自外界的这种压力吗?
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
美国“禁航令”对于准备从美国返回中国过春节与家人团聚的游子几乎是“致命的”。
2021年12月13日,达美航空DL287号航班在距离上海仅剩3个小时航程时,于俄罗斯边界上空突然返航,导致该航班乘客滞留美国西雅图。
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
当时在美国,只有六座城市有航班飞回国,它们分别是西雅图、底特律、旧金山、洛杉矶、达拉斯、纽约。
很多学校不在这六座城市的乘客,为了赶上这趟飞机回国,都是从美国其他城市辗转过来的,甚至还有的乘客是从别的国家过来。
有很多留学生,已经把公寓都退了。这一返航,意味着很多人无家可归。
当时,有留学生看到,有个妈妈带着个小推车,里面躺着几个月大宝宝,还有两三岁的小孩子,受不了长时间折腾,都哭了。
而当时的返航事件对一些人造成的最严重后果是:飞机返航航班取消回美国,很多人的签证都已过期,他们还要面临非法入境的问题。
美国这次禁航令,又不知要断了多少海外游子无法安放的乡愁。
很多海外华人已经连续两年多的时间没有回到中国,今时今日,对于他们来说,回家是他们最为期待的事情。
新冠疫情大流行这两年来,往返中国的航班供不应求,机票一票难求可以说是常态。
航班和机票供应的短缺,给了大量黑中介从中非法牟利的机会。许多原本数千元的机票,常常被他们炒到数万元一张。
如果说,供应短缺机票价格高昂尚有一线生机。航班取消,则打破了他们最后一点的希望。
面对浩瀚无边的太平洋,他们纵使有“徒步翻秦岭、跨渭河”之心,也无跨越万水千山之力,总不能只身游过太平洋吧?
按照美国交通局的说法,作出这一决定是出于对中国熔断美国航司航班的报复。
去年12月以来,奥密克戎在美国的飞速传播,入境航班病例也不断上升。自1月4日起,中国民航局多次发布熔断指令,熔断了美国、法国、加拿大等多个国家的入境航班。这些入境航班中,包括了美联航、美航、达美三家美国航空公司共44班次的入华航班。
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
因此,美国交通局也作出暂停中国航司44班航班作为对中国的报复。
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
需要注意的是,如果上面这些航班中国已经决定熔断,但未通知美方,美国将不会将其计算在44班航班内,再后续继续追加补足。
据不完全统计,目前中国的国际航班总数每周只有200个,航班数只有疫情前的2%。
这一下,意味着3月底之前本就不多的中国航司运营往返美国的直飞航班惨遭大砍。
目前,1-3月能飞的航班仅仅只剩下了这些:
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
(以航司的实际公布信息为准)
美方称:如果中方打算放宽,美国也愿意放宽;如果中方继续熔断美国航司,美方也将继续。
美国的借口很冠冕堂皇,但更是美国对待疫情的真实态度大暴露。
要知道,美国日新增目前保持在70万以上,美国已经不在公布每日新增、死亡病例的数据,美国事实上已经“放弃”了。美国才不在乎,是不是会因此把病毒输入给别的国家。
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
 
但中国和美国完全不同。
自2020年3-4月武汉疫情人数清零,内地迎来新冠疫情战争的阶段性胜利以来,海外输入就成为新冠疫情最大的传播风险。
停飞疫情高风险国家(地区)的航班,成了包括中国在内的世界各国通行做法。
比如,去年12月23日,南非发现奥密克戎时,英国交通大臣沙普斯就果断宣布,从当地时间24日上午9点起,停飞所有英国往返南非的航班。
面对大量海外疫情输入的风险,中国民航从2020年3月29日开始,实施“五个一”政策,即一家航司一个国家一条航线一周一班,将国际航班保持最低量运行。
同时,民航局为控制境外疫情通过国际航班输入,自2020年6月开始依据入境感染人数实施航班奖励和“熔断”政策。2021年4月,由于新变异病毒德尔塔传播性更强,民航局更新了“熔断”政策,2021年5月1日0时后的国际客运航班都按照新的“熔断”政策执行。
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
奥密克戎在全球范围内开始大范围流行后,“熔断”航班开始急剧上升。
相对于阿尔法、德尔塔等毒株,奥密克戎在前期的病毒载量很低,不容易被检测出来。而奥密克戎在美国感染占比已达99.5%,这无疑加重了中国检疫工作的负担。
根据第一财经记者的统计,自2022年1月6日以来的一周里,中国民航局几乎每天都会发布航班熔断令,已累计向41个回国航班发出熔断指令,取消回国航班142架次,而在2020年全年,因熔断取消的航班为272架次。今年1月的半个月内,被熔断取消的航班量就达到了2020年全年的一半。
显然,熔断并非单独针对美国,而是对包括中国在内的所有国家的航空公司一视同仁。
而且,中国的熔断政策与世界其他国家和地区此前颁布的停飞政策并无二致,都是为了快速切断境外传播渠道。
只不过,从中国人的观点来看,美国航空公司做得实在是太糟糕了。
2022年开年不到三个星期,美国三大航司几乎所有飞往中国的航班全都上了中国的熔断名单,按照每班最低5人计算,这意味着美国航空公司至少把50-100名新冠病人运到了中国。
美国机场防控不说是形同虚设吧,至少也是漏洞百出。
其实,美国在中国熔断机制上挑事已经不是第一次了,但从前至少还勉强过得去,为什么偏偏这一次就反应如此之大呢?
今时不同往日,具备强传播、低死亡特性的奥密克戎,让西方发达国家抓住了一个千载难逢的机会。
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
在此前的文章《突然宣布!新冠大流行,今年3月结束!?》中,我们已经介绍了权威医学杂志《柳叶刀》的一些最新结论和预测。
对于奥米克戎,西方相当主流的观点是偏乐观的,甚至认为“奥米克戎”是天然疫苗。
我们知道,抗体的白细胞分为两种,一种是B细胞,它扮演的是战士的角色,负责正面对抗病原体;另一种是T细胞,它扮演的是斥候的角色,负责侦查病原体的入侵并通知B细胞。
大部分B细胞和T细胞都会在战胜病毒后死亡。但是,有一种T细胞会继续留在人体内,时刻准备着在遭遇病原体入侵时再次调动免疫系统,攻击被感染的细胞,并促进人体产生新的抗体。
《华尔街日报》文章表示,在T细胞作用下,感染奥密克戎很有可能激发对新冠或其他潜在冠状病毒有效和持久的保护,即便日后产生更强的新冠变种毒株,这便是所谓的“超免疫”。
奥密克戎的轻度症状、快速传播特性让mRNA疫苗接种率较高的西方国家纷纷选择与病毒共存。
奥密克戎在一些高疫苗接种率的西方国家看来,和流感基本没什么差别。
去年圣诞季,西方许多国家感染奥密克戎的人数直线上升。
大多数人感染后的结果是什么?无非流几天鼻涕头痛几天就完事了。
西方国家的另一大底气就是新冠口服药已经研发成功,大规模上市指日可待。事实上,辉瑞已经在全球授权大约20家代工厂抓紧生产,其中还包括至少5家中国工厂。
但在中国的情况就大不一样了。
为了应对疫情,我们走了一条非常具有中国特色并且十分务实的防疫道路。
为什么这么说?
这首先是基于中国的现实:
中国的医疗资源在地区分布、城乡分布上差异较大。
现行新冠防疫政策,是一种利用政策治理上的优势,尽可能杜绝疫情对生产力的影响,排除疫苗研究空档期的防疫空白的防疫策略。
通过灭活疫苗快速铺开接种人数,并以政策精准防控,动态清零,以求快速恢复生产和生活秩序。
过去这两年,在全世界都为疫情所扰,死亡人数居高不下,生产停滞供应躺平的情况下,中国成为了全世界最稳定最重要的生产供应方。
因此,我们看到,即便在美国尚未完全解除对华的高关税政策的前提下,西方国家也不顾一切从中买买买。由于供应端的稳定,中国对外贸易在疫情中几乎是一路狂飙。
2021年,中国全年的GDP增速达到了8.1%,全年进出口贸易总额突破6万亿大关。能够取得这样喜人的经济成果,毫无疑问与中国的防疫政策密不可分。
中国的防疫政策,让中国快速抢占了战略机遇,为中国经济的战略转型赢得了宝贵的空间和时间。
但是,现在的局势已经开始产生了根本性的变化、
美国“悍然”切断44条中美航班,背后的深意令人细思极恐!
“动态清零”政策的终点在哪里?
说白了,“动态清零”是一条与时间赛跑的政策。
中国最初的想法是,控制住国内的疫情,等到西方国家研制出超级疫苗及特效药,当病毒变得高度可控,中国面对外来新冠威胁也就迎刃而解。
然而,如今主流的科学界已经达成共识,人类不可能完全消灭新冠病毒。
在奥密克戎面前,西方发达国家的疫苗和治疗药物能有效降低重症率和死亡率,但并不能阻止其快速传播和传染。
如今西方国家决定与病毒共存,这让中国面临的防疫政策压力接踵而至。
就拿“熔断”政策来说。
很多人可能会认为,停飞就停飞,没什么大不了的,还能少放点病毒进来。
问题是,现在与病毒共存在全球其他国家正越来越接近成为一个事实。
过去,全人类共同抗疫,视病毒为大敌。现在,西方决定与病毒共存后,新冠病毒在西方人看来,与流感无异,新冠在未来将不再被西方视为头等大事。
按照《柳叶刀》的推测,到今年3月奥米克戎会感染全球一半的人,在发达国家这个感染率可能会达到90%,其中有一半是无症状感染者……
如果真到了那一天,如果其它国家一多半的人口都感染过病毒了,中国要如何和它们相处?毕竟,它们是中国在世界上最重要的贸易伙伴。
全球对待新冠病毒的态度转变,正在把这个超级选择题抛到前半程的防疫优等生——中国面前。
美国眼下的禁航可以说是,给中国提了个醒。
从中国自身角度出发,“动态清零”依然是唯一可行的防疫政策。
只不过,中国现在必须要考虑一下未来要怎么办?未雨绸缪。中国有充分的时间去选择和判断。
在病毒面前,我们已经坚持了两年多的时间。现在,我们唯有在和时间赛跑的马拉松上,继续前行,期待真正曙光的到来。
 

转自:https://mp.weixin.qq.com/s/zzebvxbvl5YPYxiJrsI60A

宋城演艺

本周(2022年1月17日到21日)上证指数微涨0.04%,收于3522.57点,深证成指下跌0.86%,收于14029.55点,创业板大跌2.72%,收于3034.68点。

2022年前三周,本来以为会来个开门红,没想到持续下跌,特别是创业板,累计跌幅已经达到了8.67%,可谓非常惨烈。

以目前创业板的估值来看,虽然近期下跌了不少,但十一哥认为未来大概率还会继续下跌,当前创业板的主要成分股估值还是偏高,调整不够彻底,只有经历了充分的调整之后才会迎来彻底的反转。

宋城演艺周五晚上发布了2021年的业绩预告,很多朋友叫我解读一下,目前在公开组合里面,宋城演艺是第一大重仓股,仓位已经超过了20%了,我们先来看一下宋城演艺的业绩预告:

墙裂看好,这家公司未来潜力巨大!!

2021年净利润预计在2.58亿-3.58亿,这个业绩十一哥认为算是符合预期d的,宋城前三季度的净利润是4.33亿元,说明四季度有0.75亿-1.75亿元的亏损。

很多朋友会感到非常奇怪,第四季度有国庆长假,为什么还会亏损呢?其实也是很好理解的,四季度开始国内局部疫情时有发生,只要疫情一来,受影响最大的就是旅游景区,杭州、西安、上海景区四季度全部闭园。

特别是杭州景区闭园,对宋城的影响是非常大的,宋城的演艺王国是从杭州起家的,杭州景区虽然过了十几年了,但当前依然门庭若市,是宋城演艺最大的收入来源,四季度的闭园直接导致了公司的亏损。

不过宋城演艺在2021年这样的疫情大年能够保持3亿元以上的净利润已经算是非常不错了,大家可以看一下2021年的旅游股,能够保持盈利的屈指可数,更不用说有超过3亿的盈利了。

从确定性的角度来看,未来宋城演艺的确定性是非常强的,杭州景区、丽江景区、三亚景区、桂林景区和九寨沟景区已经充分证明了宋城商业模式的成功,小资金投入,每年都给公司带来源源不断的现金流。

上海千古情、西安千古情和张家界也在过去的一年陆续开业,虽然刚开业就面临疫情的影响,但这些项目并没有让公司出现多大的亏损,一旦疫情结束,旅游放开,这些景区将会持续放量,给公司带来更大的利润。

未来还有珠海、佛山、西塘等景区,这些景区的地理位置都非常好,有巨大的流量和很强的消费能力,这些景区也为未来宋城的增长提供了足够的想象空间。

2022年花房集团很有可能会在港股上市,宋城演艺持股占比达到了37.06%,为第二大股东,虽然花房集团上市之后应该也不会有多大的市值,但宋城收购花房集团的资金在去年已经做了减值处理,把所有的风险都已经计提了,如果花房上市的话,对我们这些股东来说,意味着这部分资产算是白送的。

宋城演艺最大的优势就是它的商业模式,节目不断变化,根据各个地方的特色推出差异化的节目,并且不断推陈出新,吸引观众重复消费,这是其他旅游景点无法复制的。

跟地方政府合作开发景区,尽量走轻资产模式,地方政府搭台,宋城唱戏,一次性投入,长期有收益的稀缺的收租模式,随着折旧和摊销成本的降低,企业的盈利能力和净资产收益率将会越来越高。

再加上政策支持,国家十四五旅游规划对未来的旅游业有了详细的规划,旅游行业作为拉动经济,推动就业、弘扬中国文化的重要产业,政策是大力支持的。

对于宋城演艺来说,目前唯一的不确定性因素就是疫情,只要这个因素排除了,宋城未来的前景是非常大,在A股旅游板块,宋城演艺很有可能是第一个千亿级别的公司。

有朋友可能会说,十一哥,你把宋城说的那么好,那现在还可以加仓吗?

从估值来看,我认为当前宋城已经脱离了低估区域,我之前也曾经多次说过,宋城的低估区域在360亿市值以内,其实在过去的一年当中,是有很多建仓机会的。

对于没有建仓的朋友来说,也不需要着急,只要耐心等待,肯定会有机会的,投资股票在任何时候都千万不要着急,股市从来不缺机会,缺的是耐心。

 

2022年,市场将走向何种风格?

不可能三角形的二元体系

1/7

风格转变

A股最大的特点是容易走极端,2020年,把增速稳定的海天味业、爱尔眼科炒到100多和200多倍PE;到了2021年,市场只要挖出跟新能源搭一点边的公司,就以新能源的高景气为标准,拍出三年业绩。

走极端的结果就是不断风格转换,任何一个板块都走不长,相比之下,美股的科技股龙头慢牛可以晃晃悠悠地走上十年。

为什么A股这么容易走极端呢?

我之前在《怎么获得赚钱的“节奏感”?》一文中分析过一个不可能三角形,即任何股票投资者,都会面对“确定性、景气度和估值”的不可能三角形,你至少要放弃一个因素,才能获得稳定的可投资机会,形成稳定的投资风格。

这个不可能三角形的三个组合,就形成了三种基本风格:

 

2022年,市场将走向何种风格?

一种投资风格用的人多了,就是变成了当下占优的“市场风格”,而风格极端化,就是市场从放弃一个维度开始,走到极端时,再弱化一个,只剩下一个维度。

以2020年为例,先是在流动性泛滥的情况下,放弃了估值维度,变成“景气度——确定性”的二元框架,到年底连景气度这个维度也弱化了,无视食品饮料、医疗的景气度长期走平,只剩下一个确定性,这才把增速平稳的大白马炒到百倍以上估值。

如果用这个“不可能三角形”的二元体系判断2022年的风格,我们实际上就要搞清楚,到底今年是放弃景气度,进入“估值——确定性”的体系?还是放弃确定性,进入“估值——景气度”的体系?或者是放弃估值,进入“景气度——确定性”的体系?

我们还是先从2017年开始,回顾每一阶段风格转换的原因及规律

2/7

2017~2019年:确定性——估值

2010~2015这几年,老一代的股民都应该记得这几个特点:小盘不败,回避大盘股,龙头折价、题材为王,创业板科技股为王,这一风格是由几个原因共同推动形成的:

  • 当时的宏观经济还是有利于积极资本扩张的中小企业

  • 以散户游资为主的投资者结构有利于小盘股的题材炒作

  • 在周期性上呈现几年一波资金大牛市的“老股民收割新韭菜”

可到了2016年末到2017年初,茅台、平安、招行等一批低估值蓝筹白马悄然走强,但在小盘风格占优多年的思维惯性下,大部分投资者仍然认为,这不过是强监管背景下的一次风格高低切换。

直到下半年,蓝筹股连续走强,小盘股被资金抛弃,大部分投资者才隐约感觉到一个新风格的来临。

2017~2019年是“确定性——估值”的二元结构市场,市场放弃了景气度,放弃传统的炒题材的A股特色,寻找低估值高确定性的白马,并将其投资逻辑命名为“蓝筹股革命”。

一个新风格的形成,投资者要在心理上经历“风格漂移——风格平衡——风格反转——理念颠覆”的变化,是一个历时较长的过程,相关风格需要“低估到高估”的较大空间,所以,新起来的风格必然是一个之前被抛弃的低配风格。市场的资金是相对有限的,推动新风格形成的流入资金必然来自原来超配风格的流出,即原有的优势风格。

这就是二元体系的第一个规律:

每一个阶段都是对前一个阶段最核心的因素的反动,此前占优的二元因素中过度演绎的那一个,会被抛弃,此前被抛弃的因素会成为新主导因素,组合成新的二元结构。

物极必反是市场的内在动力,宏观环境的变化是外在条件,但从量变到质变,最关键的因素是“投资者结构的变化”——外资影响了整个市场风格。

为什么外资的持股比例才上升了几个点,就足以改变A股长期的生态呢?因为这一段时间没有新“韭菜”,“总舵主”身陷牢狱足以震慑各种游资,场内资金呈无规律的布朗运动,所以新资金配置的方向,就成为唯一能上涨的方向,吸引存量资金进入。

这就是二元风格体系变化的第二条规律:

增量资金的风格决定市场风格变化的方向,并导致存量资金从高配板块流向低配板块。

事实上,外资风格同样多元,并非简单的“骑白马”,只是当时的A股对比海外的估值体系,价值蓝筹成为明显的风格洼地,吸引了大量偏好“确定性——估值”的低估蓝筹风格的资金。

市场总是急于用一套理论去解释当前的风格,于是就有了“蓝筹股革命理论”,这套理论有了巴菲特的加持(实质上巴菲特并不完全是这个风格),逐渐被大量散户接受,也埋下了日后“茅指数”风格极端化的祸根。

任何一种风格当然都能找到理论依据,但任何一种风格不过是特定的宏观环境与某一类风格偏好的增量资金共振的结果。由于资本市场的跟风效应,任何一种风格都会被过度演绎,一旦宏观环境变化,风格转换就在悄然之间出现。

3/7

2020年:确定性——景气度

2020年是“确定性——景气度”的二元结构市场,市场放弃了估值,因为经过三年的上涨,高确定性的白马股中已经找不到低估值品种,低估值的银行地产大多有商业模式上的缺陷,加上全球流动性大泛滥,丧失了估值锚。

根据规律一,疫情泛滥,让长久期的高确定性资产更加稀缺,只能放弃估值,之前被弱化的景气度维度重新被纳入体系,形成了2020年的“确定性——景气度”的二元体系。全年的风格,一是高确定性的白马,二是医药疫苗、必选消费、电动车等疫情益或政策加持的高景气度资产。

在“确定性——景气度”的二元体系中,确定性是主导风格,这体现了“增量资金决定市场风格”的第二条规律:2020年是公募基金大发展的一年,增量资金从外资变成了公募,特别是明星基金经理加持的巨型公募基金,由于规模过于庞大,主要投资高确定性、大市值的白马,导致在“确定性——景气度”的二元框架中,以确定性为主,景气度为辅。

4/7

2021年:景气度——估值

根据规律一,2020年白马股的过度演绎,让高确定性资产估值过高,导致2021年市场放弃了确定性。

 

同时,中小盘经过几年的下跌,出现了很多估值洼地,估值被重新纳入核心风格因素,进入“景气度——估值”的二元体系。

高景气度行业是指预期当年增速最快的几个行业,通常有两类:

  • 下游需求爆发,短期的供需矛盾引发的行业业绩大爆发,比如去年的电动车、上游大宗商品;

  • 强政策引导,政府和各类市场资源导入,引发行业爆发式增长,比如去年的光伏风电。

在2015年以前,由于中国经济内在增速高,高景气度板块以前一类为主,2015年以后,我国经济进入政府全面主导的阶段,后一类行业往往更有爆发力。

从宏观上看,2021年是强产业政策影响的一年,双碳政策全年高强度影响多个行业,景气度成为最显性的因素,最终强化为“赛道投资”。

从规律二“增量资金”的风格看,整个2021年有增量资金的渠道包括量化基金、私募基金和银行理财产品净值化后对“固收+”产品的需求,追求的目标是收益增强,所以呈现快速的板块轮动,在高景气的赛道中,寻找有相对低估值的板块。

由于放弃了确定性,2021年又回到A股的传统特色,黑马股、低价题材股满天飞,但毕竟市场已经事过境迁,相比2016年以前的游资题材炒作,现在更注重公司的业绩释放能力,这也是“题材市”与“景气度投资”的区别所在。

5/7

2022年风格可能之一:延续“估值——景气度”的体系

分析完前几年风格变迁的内在逻辑,我们就可以来尝试推测一下今年的主要市场风格。

一轮风格的最终走完,需要相关板块及指数完成一定的涨幅,“确定性——估值”体系之所以在2017——2019年走了三年,因为2018年的大熊市延缓了风格的最终完成;而“确定性——景气度”的风格只用了一年,因为2020年的涨幅太大。

考虑到2021年整个指数涨幅一般,如果2022年政策影响仍然很大(从目前看可能如此),那么2022年仍然可能延续2021年的“景气度——估值”的二元体系。

即使市场仍然追逐景气度,但“岁岁年年人不同”,由于去年的几大赛道资金太过拥挤,特别是新能源,高层有纠偏的意思,地方政府自然不再肯花出不了政绩的冤枉钱,重仓赛道股的机构降低仓位,这也是近期市场调整的主要原因。

当然,政府永远需要新的产业经济政策,所以大概率会有新的方向出来。很多人认为今年很可能是数字经济。去年反垄断,结果我们本来领先的互联网经济落后了,政策又不可能走回头路,所以数字经济很可能是由国家主导、国企央企投资的偏金融IT、工业互联网、信创、网络基础建设这一类民企不太会去做的东西。具体是什么,可能要到两会后才会有具体方向,所以资金也不敢加仓太多,也是近期反弹无力的原因。

当然,这个二元体系也可能变成更注重“低估值”的“估值——景气度”,其逻辑,我在《2022,七“贱”下天山》中有过详细分析,不再赘述。

这两个方向虽然因素相同,但重点不同,注意区别:

“景气度——估值”体系:在高景气度的板块,寻找相对低估值的标的

“估值——景气度”体系:在低估值的板块中,寻找景气度有一定边际变化的板块

具体以哪一个因素为主,取决于增量资金的来源,今年公募资金的发行可能仍然没有很大的启示,市场仍然需要消化前两年基金过度发行造成的赎回压力,今年最有可能的增量资金仍然是“固收+”。

“固收+”资金来源复杂,如果是银行理财和公募基金,与去年类似,则对市场影响延续去年“景气度——估值”的风格。如果是以保险资金为主,有可能变为“估值——景气度”,因为低估值策略更符合保险类长期资金的偏好,甚至可能转向下面的“估值——确定性”的新风格。

6/7

2022年风格可能之二:“估值——确定性”的体系

2022年另一种相对较小的可能性是“确定性——估值”或者“估值——确定性”体系,即放弃了连续两年占优的景气度因素,其宏观背景可能来源于三点:

1、国内变化:如果国内“稳增长”政策未见效,且央行释放的流动性无法顺利传导至实体经济,就连重新启动房地产这个“夜壶”也因购房需求不振而无效;

2、国际变化:如果国外疫情过去后,经济并非恢复常态,而是转向衰退,但货币宽松的空间已经没了;或者疫情再次变异,流动性收缩政策中止;

3、利率变化:如果多次超预期降息降准,无风险利率大幅下行。

为什么此类宏观背景下,市场会放弃景气度追逐确定性呢?

从景气度自身看,“稳增长”是大原则,如果刺激经济的手段不够,财政无法负担的话,就只能“休养生息”,即放松那些妨碍“稳增长”目标的监管政策,以增强民间经济的活力,这么一来,也可能今年“稳”字当头,并没有很强的政策题材。

此时,市场就会更关注高确定性的行业和龙头。

再从DCF估值的角度看,景气度代表的是未来自由现金折现的“近端现金流”部分,而确定性大部分代表“远端现金流”部分。

当经济处于景气恢复时,“近端现金流”对估值贡献更明显,市场更关注率先恢复的高景气度资产,这就是去年风格的市场逻辑;

当经济处于衰退时,市场更倾向保留“远端现金流”占比高的高确定性资金,即这是2017~2019年,我国经济增速下行期市场表现出的风格。

 

2022年,市场将走向何种风格?

而“估值——确定性”体系则可能是资金层面的原因,即公募基金进入“赎回——减仓——下跌——更多赎回”的负反馈,不得不抛售重仓股,导致市场只有机构低配的低估值行业龙头相对抗跌,这一风格是典型熊市的特征。

7/7

风格变化与风格长存

A股的大部分散户和大量机构投资者只有五年以内的投资经验,往往只在某一种市场风格中赚过钱,容易形成强烈的路径依赖,认为找到了稳定的‘致富之路’。一旦风格转变,前一种风格中最赚钱的人,就会成为下一个风格中亏钱最多的。

尽管如此,稳定的风格与投资体系仍然是你赚钱的根本。

一个有效的方法,保持有效性的前提是——它需要在某些情况下失效,以减少该方法的使用人数,使之不至于走向极端,所以最好的方法,随时会失效但长期总体有效。

风格是用来限制你的选择自由,而不是增加你的选择自由。新手最自由,什么股都敢买,成熟的标志就是不喜欢参与某些风格,失去了自由。

但越不自由,赚钱的概率就越大。

转自:https://mp.weixin.qq.com/s/OtHORXHXuFIwjo17xCHPug