翁恺老师说static

我们在C的时候就学到过static,static在C就是一个很复杂的东西,因为static关键字被赋予了完全不同的职责,出现在不同地方代表了完全不同的含义,对C来说static就是两义的,它出现在不同地方代表的是完全不同的含义。
第一层含义代表其存储是持久存储的
第二层含义代表其访问性是受局限的
这是两个完全不同的事情,一个是说你在哪里,另一个是说谁能看到你
在c++中static的含义变得更复杂,c++中有成员变量和成员函数。
在C中一个全局变量是static的这个全局变量就只在当前的.c文件中有效。一个本地变量是static的这个本地变量就具有持久存储了。
实际上static的本地变量就是全局变量,其存储位置和全局变量一致。一个static的函数只能在当前.c文件被访问。
c++中static的普通函数和全局变量已经过时,static的本地变量是持久存储的,static的成员变量在所有对象之间共享和static的成员函数在所有对象之间共享且只能访问静态的成员变量。

static free functions - deprecated
static global variables - deprecated
static local variables - persistent storage
static member variables - shared by all instances
static member function - shared by all instances,can only access static member varibles

一个.c文件中的全局变量在另一个.c文件中使用时需加上extern关键字。一个.c文件中的static的全局变量在另一个.c文件不能通过extern关键字使用。
c++中static的本地对象,只在第一次进函数时调用构造函数,其内存空间在编译时分配。

class X
{X(int,int);
~X();
...
}
void f()
{
static X my_x(10,20);
...
}

全局对象的空间在全局数据区,编译链接时分配空间,全局变量的构造的执行在main函数之前,所以main可能不是程序第一个被调用的函数。main结束或者调用exit结束程序时执行析构函数。

extern int i;

上述这句话是一句声明,在声明这句话的.cpp文件中并没有i的位置,这句话只是告诉编译器有一个i的东西存在,但不知道具体位置,将来链接器会去找。

class A
{
public:
    A();
    void print(){cout << i << endl;}
    void set(int ii){ i = ii; }
private:
    static int i;
};
int main()
{
    A a,b;
    a.set(10);
    b.print();
    return 0;
}

上述代码编译通不过,因为static int i只是声明不是定义,必须在本.cpp或者其他cpp文件将i定义出来即int A::i;
静态的成员变量必须将i定义出来才可以使用。
两段错误代码:

class A
{
public:
    A:i(0)();//error,静态成员变量只能在其定义的地方初始化
    void print(){cout << i << endl;}
    void set(int ii){ i = ii; }
private:
    static int i;
};
int A::i=0;//right,这里是i的定义
int main()
{
    A a,b;
    a.set(10);
    b.print();
    return 0;
}
class A
{
public:
    A();
    void print(){cout << i << endl;}
    void set(int ii){ i = ii; }
private:
    static int i;
};
static int A::i;//error,从C语言的角度看这个i只能在当前.cpp文件中被访问,这和类静态成员的访问属性相违背,因为静态成员是可能在外部被访问的,不能加static,会导致编译错误。
int main()
{
    A a,b;
    a.set(10);
    b.print();
    return 0;
}

静态的成员函数只能访问静态的成员变量,因为静态的成员函数可以通过类名直接调用可与对象无关,所以静态成员变量没有隐藏的this指针,不能访问类中的非静态成员变量。

### 翁恺与编程教学 翁恺是中国知名的计算机教育专家,长期从事程序设计语言的教学工作,在C语言、Java以及面向对象编程等领域具有广泛影响力[^1]。其授课风格深入浅出,注重实践能力培养,尤其适合初学者建立扎实的编程基础[^7]。 ### C语言在嵌入式系统中的应用 C语言因其高效性和对硬件操作的良好支持,被广泛应用于嵌入式系统的开发中。特别是在资源受限环境下,C语言能够实现底层寄存器访问和内存管理优化,是嵌入式软件开发的核心工具之一[^8]。 ### ADC采样的基本原理及其C语言实现 模数转换(Analog-to-Digital Conversion, ADC)是嵌入式系统感知外部模拟信号的关键环节,常见于传感器数据采集场景。典型的ADC过程包括采样、保持、量化和编码四个阶段。在实际工程中,常通过微控制器内置的ADC模块完成电压信号数字化处理[^9]。 以下是一个基于通用单片机平台的ADC采样C语言示例代码: ```c #include <stdint.h> // 假设使用STM32系列MCU,启用ADC通道0 #define ADC_CHANNEL_0 ((uint8_t)0) extern void adc_init(void); extern uint16_t adc_read(uint8_t channel); int main(void) { uint16_t adc_value; adc_init(); // 初始化ADC外设 while (1) { adc_value = adc_read(ADC_CHANNEL_0); // 读取ADC值 // 处理采样结果,例如发送至串口或用于控制逻辑 } } ``` 该代码展示了如何初始化ADC并周期性获取模拟输入的数字量,适用于温度传感、光强检测等典型应用场景[^10]。 ### 教学资源整合建议 学习者可通过中国大学MOOC平台查找由翁恺主讲的《C语言程序设计》课程,其中涵盖了变量、循环、函数等核心语法结构,并辅以大量实例练习[^7]。虽然公开资料未明确显示其直接讲解ADC相关内容,但其所授基础知识可作为后续深入嵌入式方向的重要支撑。 对于希望进一步掌握嵌入式系统中ADC编程的学习路径,推荐结合ARM Cortex-M架构下的HAL库或标准外设库进行实战训练,理解DMA传输、中断触发机制及精度校准方法[^10]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值