C#使用指针表达式
如何:获取指针变量的值
使用指针间接运算符可获取位于指针所指向的位置的变量。 表达式采用下面的形式,其中, p 是指针类型:
*p;
不能对除指针类型以外的任何类型的表达式使用一元间接寻址运算符。 此外,不能将它应用于 void 指针。
当向 null 指针应用间接寻址运算符时,结果将取决于具体的实现。
下面的示例使用不同类型的指针访问 char 类型的变量。
注意,theChar 的地址在不同的运行中是不同的,因为分配给变量的物理地址可能会更改。
unsafe class TestClass
{
static void Main()
{
char theChar = 'Z';
char* pChar = &theChar;
void* pVoid = pChar;
int* pInt = (int*)pVoid; System.Console.WriteLine("Value of theChar = {0}", theChar);
System.Console.WriteLine("Address of theChar = {0:X2}",(int)pChar);
System.Console.WriteLine("Value of pChar = {0}", *pChar);
System.Console.WriteLine("Value of pInt = {0}", *pInt);
}
}
//out-------------
theChar 的值 = Z
theChar 的地址 = 12F718
pChar 的值 = Z
pInt 的值 =
如何:获取变量的地址
要获取计算结果为固定变量的一元表达式的地址,请使用 address-of 运算符 [&]:
int number;
int* p = &number; //取地址符: &
address-of 运算符仅适用于变量。 如果该变量是可移动变量,则在获取其地址之前,可以使用 fixed 语句暂时固定此变量。
确保初始化该变量是程序员的责任。 如果变量未初始化,编译器不会发出错误消息。
不能获取常数或值的地址。
此示例声明一个指向 int 的指针 p,并将整数变量 number 的地址赋值给该指针。 给 *p 赋值的结果是初始化变量 number。
如果对此赋值语句进行注释,则将取消对变量 number 的初始化,但是不会发出编译时错误。
注意该示例如何使用成员访问运算符 -> 来获取和显示存储在指针中的地址。
class AddressOfOperator
{
static void Main()
{
int number; unsafe
{
// Assign the address of number to a pointer:
int* p = &number; // Commenting the following statement will remove the
// initialization of number.
*p = 0xffff; // Print the value of *p:
System.Console.WriteLine("Value at the location pointed to by p: {0:X}", *p); // Print the address stored in p:
System.Console.WriteLine("The address stored in p: {0}", (int)p);
} // Print the value of the variable number:
System.Console.WriteLine("Value of the variable number: {0:X}", number); System.Console.ReadKey();
}
}
/* Output:
Value at the location pointed to by p: FFFF
The address stored in p: 2420904
Value of the variable number: FFFF
*/
如何:通过指针访问成员
要访问在不安全的上下文中声明的结构的成员,您可以使用以下示例中所示的成员访问运算符,其中,p 是指向包含成员 x 的结构的指针。
CoOrds* p = &home;
p -> x = 25; //member access operator ->
此示例声明并实例化了包含两个坐标(x 和 y)的结构CoOrds。 此示例通过使用成员访问运算符 -> 和一个指向实例 home 的指针为 x 和 y 赋值。
请注意,表达式 p->x 等效于表达式 (*p).x,使用这两个表达式可获得相同的结果。
struct CoOrds
{
public int x;
public int y;
} class AccessMembers
{
static void Main()
{
CoOrds home; unsafe
{
CoOrds* p = &home;
p->x = ;
p->y = ; System.Console.WriteLine("The coordinates are: x={0}, y={1}", p->x, p->y );
}
}
}
如何:通过指针访问数组元素
在不安全的上下文中,可通过使用指针元素访问来访问内存中的元素,如下面的示例所示:
char* charPointer = stackalloc char[123];
for (int i = 65; i < 123; i++)
{
charPointer[i] = (char)i; //access array elements
}
方括号中的表达式必须能够隐式转换为 int、uint、long 或 ulong。 操作 p[e] 等效于 *(p+e)。 与 C 和 C++ 一样,指针元素访问不检查越界错误。
在此示例中,123 内存位置被分配给字符数组 charPointer。 该数组用于在两个 for 循环中显示小写字母和大写字母。
请注意,表达式 charPointer[i] 与表达式 *(charPointer + i) 等效,使用这两个表达式可获得相同的结果。
class Pointers
{
unsafe static void Main()
{
char* charPointer = stackalloc char[]; for (int i = ; i < ; i++)
{
charPointer[i] = (char)i;
} // Print uppercase letters:
System.Console.WriteLine("Uppercase letters:");
for (int i = ; i < ; i++)
{
System.Console.Write(charPointer[i]);
}
System.Console.WriteLine(); // Print lowercase letters:
System.Console.WriteLine("Lowercase letters:");
for (int i = ; i < ; i++)
{
System.Console.Write(charPointer[i]);
}
}
}
//Output----------------
大写字母:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
小写字母:
abcdefghijklmnopqrstuvwxyz
C#使用指针表达式的更多相关文章
- C指针决心 ------ 指针表达式
本文是自己学习所做笔记.欢迎转载.但请注明出处:http://blog.csdn.net/jesson20121020 所谓的指针表达式是指一个表达式.其结果是一个指针. 例1. int a,b; ...
- 【C】对指针表达式的个人总结与思考
本文内容参考<c 和 指针>. 声明:本博文只为那些能沉得住气,认真研究,探索真知的人参考,浮躁的人请离开,因为看不懂. 感觉以前学c的时候,学的指针真是白学了,今天看到这个内容,困惑后, ...
- <c和指针>学习笔记3之操作符,表达式与指针
1 操作符 (1)移位操作符 左移<<:值最左边的几位丢弃,右边多出来的几个空位用0补齐 01101101 011(丢弃)01101000(后面三位补0) 右移>>: 算术左移 ...
- c/c++ 函数、常量、指针和数组的关系梳理
压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和 ...
- 《C与指针》第八章练习
本章问题 1.根据下面给出的声明和数据,对每个表达式进行求值并写出它的值.在对每个表达式进行求值时使用原先给出的值(也就是说,某个表达式的结果不影响后面的表达式).假定ints数组在内存中的起始位置是 ...
- C/C++学习笔记----指针的理解
指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...
- 《C与指针》第六章练习
本章问题 1.如果一个值的类型无法简单的通过观察它的位模式来判断,那么机器是如何知道应该怎样对这个值进行操纵的? answer:The machine doesn't make this determ ...
- 《C与指针》第一章练习
本章例程 程序1.1 重排字符 #include <stdio.h> #include <stdlib.h> #include <string.h> #define ...
- c/c++: c++继承 内存分布 虚表 虚指针 (转)
http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base { pu ...
随机推荐
- jquery UI datepicker时间控件的使用
参考: http://api.jqueryui.com/datepicker/#method-show 英文 http://www.helloweba.com/view-blog-168.html 中 ...
- Java 集合系列 15 Map总结
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Q: How could I use MATLAB interface for parameter selection?
Q: How could I use MATLAB interface for parameter selection? One can do this by a simple loop. See t ...
- Javascript 严格模式详解(转)
一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. ...
- Spring学习(二)——Spring中的AOP的初步理解[转]
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- ID3
# -*- coding: utf-8 -*- import copy from numpy import * import math class ID3DTree(object): def __in ...
- java之通过反射,来获得某对象的所有方法(类方法提取器)
参考Thinging in Java 在编程时, 如果不记得一个类是否有某个方法,或者不知道一个类究竟能做些什么,而又不想通过索引或 类的层次结构去查找jdk文档,这时通过反射的小工具能节省很多时间. ...
- hduacm 5104
http://acm.hdu.edu.cn/show #include <cstdio> #include <cstring> #include <algorithm&g ...
- js 替换 当前URL 特定参数
js 替换 当前URL 特定参数 2012-12-24 20:45:53| 分类: JS&JQuery |举报 |字号 订阅 //替换指定传入参数的值,paramName为参数,repl ...
- Python背景色与语法高亮主题配置
使用python idle的人恐怕都无法忍受默认的白色背景,及其语法高亮主题. 大家更倾向于使用黑色背景. 用户目录 的.idlerc 目录: 下面的各个系统下对应的该文件的位置: 在Linux系列系 ...