1. 首先确定一点,int const i;与const int i;是一样的,都是定义一个只读的int i。
2. 所以int const *p;与const int *p;也是一样的,都是定义一个只读的int *p。
但是,不管是int const *p;还是const int *p;,这里有几点需要注意。
#include <stdio.h>
int main()
{
int i1 = 30;
int i2 = 40;
const int *p = &i1;
p = &i2; // no problem
i2 = 80;
printf("%d\n", *p); // output: 80
// *p = 100; // error: assignment of read-only location
return 0;
}
首先是*p只读,并不是p只读,所以p的值是可以改的(p = &i2;);第二,&i1应该只是一个int *,所以把一个int *赋值给const int *是可以的(const int *p = &i1;);第三,p = &i2;之后,对&i2这块地址的访问就有两种方式,一是非const的i2,二是const的*p,所以可以有i2 = 80;,而不能有*p = 100;
3. int * const p;是定义了一个只读的p,所以假如有int * const p = &i1;之后,就不能再有p = &i2;了。但是*p的值是可以随便改的。
4. 把一个const int *赋值给int *也是可以的(MinGW下)(int *p3 = &ci)
#include <stdio.h>
int main()
{
const int ci = 200;
int *p3 = &ci;
*p3 = 250;
printf("%d\n", *p3); // output: 250
return 0;
}
这样其实是可以去修改一个const int的……
5. const int * const p;就是说p和*p都是只读的,结合2、3即可得它的特性。
分享到:
相关推荐
ldr sp, DW_STACK_START @ setup stack pointer mov fp, #0 @ no previous frame, so fp=0 @ copy U-Boot to RAM ldr r0, =TEXT_BASE mov r1, #0x0 mov r2, #0x30000 bl nand_read_ll tst r0, #0x0 beq ok_...
### 想成为嵌入式程序员应知道的0x10个基本问题 #### C语言测试的重要性 在招聘嵌入式系统程序员的过程中,C语言测试不仅是一种必要的手段,也是一种非常有效的筛选方式。通过这种方式,面试官可以深入了解应聘者...
CRect operator+(const RECT* lpRect) const; CRect operator-(const RECT* lpRect) const; }; ///////////////////////////////////////////////////////////////////////////// // CPoint - A 2-D point, ...
`volatile`和`const`可以结合使用,但意义不大,因为`const`已经限制了变量的可变性。如果一个变量被声明为`volatile const`,那么它仍然是不可变的,但是编译器不会进行优化。 #### 九、sizeof() **对于以下定义...
- **初始堆栈指针(MSP)**:当Cortex-M3处理器上电或复位后,它会从地址`0x00000000`读取前四个字节作为MSP(Main Stack Pointer)的值。 - **程序计数器(PC)**:接着,从地址`0x00000004`读取四个字节作为PC...
#define _LIBICONV_VERSION 0x010E /* version number: (major) + minor */ extern @DLL_VARIABLE@ int _libiconv_version; /* Likewise */ /* We would like to #include any system header file which could ...
**Use of const**:`const`关键字应当广泛使用,以表明某个变量或参数在函数内部不会被修改。 ##### 12. **Integer Types**:整型变量应当根据实际需求选择合适的类型,以确保足够的精度和性能。 ##### 13. **64-...
*(int *const)(0x67a9) = 0xaa55; ``` 这是一种更复杂但同样有效的实现方式,它直接对绝对地址进行类型转换并赋值,但这种方式可能不如前一种直观易懂。 #### 2. 中断处理 中断是嵌入式系统的核心组件之一,用于...
// pointer to the interface used for drawing SIZE m_frameSize; SIZE m_frameOffset; UINT m_nDelay; // delay (in 1/100s of a second) UINT m_nDisposal; // disposal method }; #pragma pack(1) // turn...
- 示例:假设 `p` 是指向变量 `x` 的指针,则 `Format('Pointer is %p', [p])` 可能输出 "Pointer is 0x7FF812F548"。 9. **`s`: 字符串** - 适用于字符串类型。 - 示例:`Format('String is %s', ['Hello'])` ...
Friends Exceptions Run-Time Type Information (RTTI) Casting Streams Preincrement and Predecrement Use of const Integer Types 64-bit Portability Preprocessor Macros 0 and NULL sizeof Boost C++0x ...
- 十六进制前缀: `0x` 或 `0X`。 - **字符常量 (Character Constants):** - 普通字符: `'a'`。 - 八进制转义序列: `'\007'`。 - 十六进制转义序列: `'\x0a'`。 - **特殊字符 (Special Characters):** - 换行...
` 和32位小端系统中的内存布局问题,假设 `iValue` 的地址为 `0x10000`,那么它占用的四个字节按小端序排列(最低有效字节在前面),则从 `0x10000` 开始的四个字节分别为 `FF`, `FF`, `FF`, `FE`(以16进制表示)。...
3. **文件指针(File Pointer)**:在C语言中,用于指向文件的特殊指针类型,通常用`FILE *`表示。 #### 实现方法 本节基于一个具体的示例代码来解析串口编程的过程。示例代码展示了如何打开串口、发送数据、接收...
- **十六进制前缀**: `0x` 或 `0X`。 - **字符常量**: 如 `'a'`, `'\ooo'`, `'\xhh'`。 - **特殊字符**: 如 `\n`, `\r`, `\t`, `\b`。 - **字符串常量**: 以 `"abcde"` 形式表示。 #### 六、指针、数组与结构体 - ...
- **十六进制前缀**:`0x` 或 `0X`。 - **字符常量**:单引号内的字符,可以是八进制或十六进制形式。 - **特殊字符**:转义序列如 `\n`(换行)、`\r`(回车)、`\t`(制表符)、`\b`(退格)。 - **字符串常量**:...
`,这里的`BIT3`通常定义为`(0x1)`,`|=`操作会将`a`的第3位设置为1,其他位保持不变。 - 清除位:`a &= ~BIT3;`,`~`是按位非操作,`&=`会将`a`的第3位设置为0,其他位保持不变。 5. **访问绝对地址**: 在纯...
function IsFile64Bit(const FileName: string): Boolean; var DllHandle: THandle; ImageNtHeaders: PImageNtHeaders; ImageDosHeader: PImageDosHeader; Buffer: Pointer; Size: Integer; begin Result := ...
- **Use of const**:合理使用`const`关键字可以提高代码的安全性和可读性。 - **Integer Types**:选择正确的整型类型对于确保程序的性能和兼容性至关重要。 - **64-bit Portability**:编写能在64位系统上良好工作...