如何:获取指针变量的值

使用指针间接运算符可获取位于指针所指向的位置的变量。 表达式采用下面的形式,其中, 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#使用指针表达式的更多相关文章

  1. C指针决心 ------ 指针表达式

    本文是自己学习所做笔记.欢迎转载.但请注明出处:http://blog.csdn.net/jesson20121020 所谓的指针表达式是指一个表达式.其结果是一个指针. 例1. int  a,b; ...

  2. 【C】对指针表达式的个人总结与思考

    本文内容参考<c 和 指针>. 声明:本博文只为那些能沉得住气,认真研究,探索真知的人参考,浮躁的人请离开,因为看不懂. 感觉以前学c的时候,学的指针真是白学了,今天看到这个内容,困惑后, ...

  3. <c和指针>学习笔记3之操作符,表达式与指针

    1 操作符 (1)移位操作符 左移<<:值最左边的几位丢弃,右边多出来的几个空位用0补齐 01101101 011(丢弃)01101000(后面三位补0) 右移>>: 算术左移 ...

  4. c/c++ 函数、常量、指针和数组的关系梳理

    压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和 ...

  5. 《C与指针》第八章练习

    本章问题 1.根据下面给出的声明和数据,对每个表达式进行求值并写出它的值.在对每个表达式进行求值时使用原先给出的值(也就是说,某个表达式的结果不影响后面的表达式).假定ints数组在内存中的起始位置是 ...

  6. C/C++学习笔记----指针的理解

    指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...

  7. 《C与指针》第六章练习

    本章问题 1.如果一个值的类型无法简单的通过观察它的位模式来判断,那么机器是如何知道应该怎样对这个值进行操纵的? answer:The machine doesn't make this determ ...

  8. 《C与指针》第一章练习

    本章例程 程序1.1 重排字符 #include <stdio.h> #include <stdlib.h> #include <string.h> #define ...

  9. c/c++: c++继承 内存分布 虚表 虚指针 (转)

    http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base  {  pu ...

随机推荐

  1. 10大html5前端框架

    Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( 呵呵了 ),这是说明它的强大之处,拥有框架一壁江山的势气.自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者 ...

  2. Swift和Objective-C混编注意

    前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋们来讲,的确算是福音,但对于整个iOS编程从业者来讲 ...

  3. linux如何修改主机名

    一:#hostname hn1 二:修改/etc/sysconfig/network中的 HOSTNAME=hn1三:修改/etc/hosts文件  127.0.0.1 hn1

  4. juery 选择器 选择多个元素

    使用,号: $("#goodSource,#mailState") 选择了id为goodSource或者mailState的元素,当两者之间有任何一个有改变时,将会触发该操作. / ...

  5. android 定制目录

    首先简单介绍一下安卓系统文件夹对照表 主要介绍的是Android系统的文件夹结构,帮助大家更直观地了解系统 \\system\\app这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结 ...

  6. intel vt-x处于禁用状态下如何处理

    1.首先看你的bios选项里面有没有该选项,如果没有就更新,更新之后还没有,则不支持 2.找到intel Virtualization Technology 将状态改为Enabled  同时找到int ...

  7. Error initializing endpoint java.lang.Exception: Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??

    2010-5-18 22:00:38 org.apache.catalina.core.AprLifecycleListener lifecycleEvent 信息: The Apache Tomca ...

  8. java 面向对象编程--第17章 I/O系统

    1.I/O操作指的是输入和输出流的操作.相对内存而言,当我们从数据源中将数据读取到内存中,就是输入流,也叫读取流.当我们将内存中处理好的数据写入数据源,就是输出流,也叫写入流. 2.流按照内容分类:字 ...

  9. 客户端访问AIDLService(远程绑定Service)

    import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android. ...

  10. Flickr 网站架构分析

    Flickr 网站架构分析 Flickr.com 是网上最受欢迎的照片共享网站之一,还记得那位给Windows Vista拍摄壁纸的Hamad Darwish吗?他就是将照片上传到Flickr,后而被 ...