`

[#0x0049] Const Pointer

 
阅读更多

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即可得它的特性。

分享到:
评论

相关推荐

    uboott移植实验手册及技术文档

    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个基本问题

    ### 想成为嵌入式程序员应知道的0x10个基本问题 #### C语言测试的重要性 在招聘嵌入式系统程序员的过程中,C语言测试不仅是一种必要的手段,也是一种非常有效的筛选方式。通过这种方式,面试官可以深入了解应聘者...

    stdafx.h代码

    CRect operator+(const RECT* lpRect) const; CRect operator-(const RECT* lpRect) const; }; ///////////////////////////////////////////////////////////////////////////// // CPoint - A 2-D point, ...

    c语言常见笔试题 c语言常见笔试题

    `volatile`和`const`可以结合使用,但意义不大,因为`const`已经限制了变量的可变性。如果一个变量被声明为`volatile const`,那么它仍然是不可变的,但是编译器不会进行优化。 #### 九、sizeof() **对于以下定义...

    gcc_arm启动

    - **初始堆栈指针(MSP)**:当Cortex-M3处理器上电或复位后,它会从地址`0x00000000`读取前四个字节作为MSP(Main Stack Pointer)的值。 - **程序计数器(PC)**:接着,从地址`0x00000004`读取四个字节作为PC...

    cocos2d-x c++的iconv.rar

    #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 ...

    Google C++ Style Guide(谷歌C++编码规范 )

    **Use of const**:`const`关键字应当广泛使用,以表明某个变量或参数在函数内部不会被修改。 ##### 12. **Integer Types**:整型变量应当根据实际需求选择合适的类型,以确保足够的精度和性能。 ##### 13. **64-...

    中科红旗面试题目

    *(int *const)(0x67a9) = 0xaa55; ``` 这是一种更复杂但同样有效的实现方式,它直接对绝对地址进行类型转换并赋值,但这种方式可能不如前一种直观易懂。 #### 2. 中断处理 中断是嵌入式系统的核心组件之一,用于...

    PictureEx头文件

    // 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...

    嵌入式C语言开发面试题

    *(int * const)(0x67a9) = 0xaa55; ``` 这种方式虽然语法上更复杂,但其实现效果相同。这里使用了一个常量指针来直接访问指定地址。 **面试技巧建议:** - 在面试时推荐使用第一种方案,因为它更加直观易懂。 -...

    Delphi format的用法.doc

    - 示例:假设 `p` 是指向变量 `x` 的指针,则 `Format('Pointer is %p', [p])` 可能输出 "Pointer is 0x7FF812F548"。 9. **`s`: 字符串** - 适用于字符串类型。 - 示例:`Format('String is %s', ['Hello'])` ...

    Google C++ Style Guide(Google C++编程规范)高清PDF

    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 ...

    c reference card

    - 十六进制前缀: `0x` 或 `0X`。 - **字符常量 (Character Constants):** - 普通字符: `'a'`。 - 八进制转义序列: `'\007'`。 - 十六进制转义序列: `'\x0a'`。 - **特殊字符 (Special Characters):** - 换行...

    C编程 面试题 D卷

    ` 和32位小端系统中的内存布局问题,假设 `iValue` 的地址为 `0x10000`,那么它占用的四个字节按小端序排列(最低有效字节在前面),则从 `0x10000` 开始的四个字节分别为 `FF`, `FF`, `FF`, `FE`(以16进制表示)。...

    串口编程 - 基于C标准库.txt

    3. **文件指针(File Pointer)**:在C语言中,用于指向文件的特殊指针类型,通常用`FILE *`表示。 #### 实现方法 本节基于一个具体的示例代码来解析串口编程的过程。示例代码展示了如何打开串口、发送数据、接收...

    C Reference Card (ANSI)

    - **十六进制前缀**: `0x` 或 `0X`。 - **字符常量**: 如 `'a'`, `'\ooo'`, `'\xhh'`。 - **特殊字符**: 如 `\n`, `\r`, `\t`, `\b`。 - **字符串常量**: 以 `"abcde"` 形式表示。 #### 六、指针、数组与结构体 - ...

    C语言快速参考(PDF文件)

    - **十六进制前缀**:`0x` 或 `0X`。 - **字符常量**:单引号内的字符,可以是八进制或十六进制形式。 - **特殊字符**:转义序列如 `\n`(换行)、`\r`(回车)、`\t`(制表符)、`\b`(退格)。 - **字符串常量**:...

    嵌入式C 常见面试题

    `,这里的`BIT3`通常定义为`(0x1)`,`|=`操作会将`a`的第3位设置为1,其他位保持不变。 - 清除位:`a &= ~BIT3;`,`~`是按位非操作,`&=`会将`a`的第3位设置为0,其他位保持不变。 5. **访问绝对地址**: 在纯...

    delphi 判断 exe 是否是 x64位可执行文件

    function IsFile64Bit(const FileName: string): Boolean; var DllHandle: THandle; ImageNtHeaders: PImageNtHeaders; ImageDosHeader: PImageDosHeader; Buffer: Pointer; Size: Integer; begin Result := ...

    c 编码规范

    - **Use of const**:合理使用`const`关键字可以提高代码的安全性和可读性。 - **Integer Types**:选择正确的整型类型对于确保程序的性能和兼容性至关重要。 - **64-bit Portability**:编写能在64位系统上良好工作...

Global site tag (gtag.js) - Google Analytics