使用vector遇到c2036 XXXX*const 未知的大小 的错误

在VS2019/MFC环境下开发时,遇到编译错误C2036,原因是未定义拷贝构造函数。博客详细分析了错误原因,并探讨了解决此类问题的方法。

开发环境:VS2019 / MFC

先定义一个类 Leg

class Leg
{
   
   
public:
	int length;
public:
	Leg();
	~Leg();
}

再定义一个类 Monkey

class 
<think>首先,用户的问题是:“我想询问C语言中常量指针的声明是否正确 请问C语言中 int * const p 的声明是否合法”。这是一个关于C语言语法的问题。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但这里没有数学表达式,所以不需要。 - 独立公式必须使用$$...$$格式并单独成段,但这个问题是关于代码声明的,所以我应该用代码块。 - LaTeX语法正确,但这里主要是代码。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 用户的问题是关于C语言中常量指针的声明:`int * const p`是否合法。 从提供的引用中: - 引用[1]:解释了`const int * p`, `int const * p`, `int * const p`的区别。其中提到`int * const p`表示指针p是常量,不能改变指向,但可以改变指向的值。 - 引用[2]:强调了const用于防止修改。 - 引用[3]:讨论了数组形式,但核心相同。 - 引用[4]:详细说明了`int * const p`的含义:const修饰p,所以p的值(地址)不能改变,但*p的值可以改变。 所以,声明`int * const p`在C语言中是合法的。它定义了一个常量指针,即指针本身是常量,不能改变指向,但可以改变指向的值。 回答结构: - 由于指令要求“回答结构清晰,帮助用户逐步解决问题”,我应该先确认声明的合法性,然后解释其含义。 - 使用中文。 - 在回答中,如果引用内容,添加引用标识。例如,参考引用[1]和[4]。 步骤: 1. 直接回答:声明是合法的。 2. 解释含义:`int * const p`表示p是一个常量指针,指向一个整数;p的值(地址)不能改变,但*p的值可以改变。 3. 提供示例代码来演示。 4. 生成相关问题。 生成相关问题: - 根据指令“生成相关问题”,我应该基于主题创建2-3个问题。主题是C语言常量指针。 - 可能的问题: - 1. `const int * p` 和 `int * const p` 有什么区别? - 2. 如何声明一个指向常量的常量指针? - 3. 在C语言中,const关键字的其他用法是什么? 确保回答真实可靠:基于C语言标准,`int * const p`是合法的语法。 最终回答结构: - 开头确认合法性。 - 解释含义。 - 代码示例。 - 相关问题。</think>### C语言中 `int * const p` 声明的合法性 在C语言中,声明 `int * const p` 是**完全合法的**。这种语法定义了一个**常量指针**constant pointer),即指针 `p` 本身是常量,不能改变其指向的地址,但可以通过 `p` 修改其指向的整数值。下面我将逐步解释其含义和用法,确保回答清晰可靠。 #### 1. **声明含义与合法性** - `int * const p` 的语法符合C语言规范: - `const` 关键字修饰的是指针 `p`(即 `p` 本身),而不是指针所指向的数据。 - 因此: - `p` 的指向地址不可改变(如不能重新赋值 `p = &another_var`)。 - 但 `*p` 的值可以修改(如 `*p = 10` 是允许的)。 - 这与 `const int * p`(指向常量的指针)不同,后者允许改变指针指向,但禁止修改指向的值[^1][^4]。 这种声明在C语言中广泛用于保护指针的稳定性,同时允许操作指向的数据,例如在函数参数或硬件寄存器访问中。 #### 2. **代码示例演示** 以下是一个简单的C程序,展示 `int * const p` 的合法性和行为: ```c #include <stdio.h> int main() { int a = 5; int b = 10; // 声明常量指针 p,指向 a int * const p = &a; // 允许修改 *p 的值 *p = 6; // a 的值变为 6 printf("a = %d\n", a); // 输出: a = 6 // 尝试改变 p 的指向(非法,编译错误) // p = &b; // 错误: assignment of read-only variable 'p' return 0; } ``` - **编译结果**:上述代码在GCC或Clang编译器下能正常编译运行,但如果取消注释 `p = &b;` 行,会报错 `assignment of read-only variable 'p'`,证明 `p` 的指向是只读的[^1][^4]。 #### 3. **与类似声明的区别** 为了更全面理解,对比其他常见指针声明: - `const int * p` 或 `int const * p`:指向常量的指针(指针可重定向,值不可修改)。 - `int * const p`:常量指针(指针不可重定向,值可修改)。 - `const int * const p`:指向常量的常量指针(指针和值均不可修改)[^1][^2][^4]。 #### 4. **实际应用场景** - 在嵌入式系统中,常量指针常用于访问固定的硬件地址(如 `volatile int * const reg = 0xFFFF;`),确保指针不意外改变。 - 在函数参数中,`int * const p` 可防止函数内部修改指针指向,提升代码安全性[^4]。 如果您有更多上下文(如具体代码片段),我可以进一步分析潜在问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值