如何:获取指针变量的值

使用指针间接运算符可获取位于指针所指向的位置的变量。 表达式采用下面的形式,其中, 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. iOS开发中你是否遇到这些经验问题

    前言 小伙伴们在开发中难免会遇到问题, 你是如何解决问题的?不妨也分享给大家!如果此文章其中的任何一条问题对大家有帮助,那么它的存在是有意义的! 反正不管怎样遇到问题就要去解决问题, 在解决问题的同时 ...

  2. 未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。解决办法

    找到使用中的程序池,右键,设置应用程序默认设置,如下 确定即可.

  3. GridView列的排序功能

    首先要给GridView设置三个属性 GridView4.AllowSorting = true; GridView4.Attributes.Add("SortExpression" ...

  4. java并发带返回结果的批量任务执行

    转载:http://www.it165.net/pro/html/201405/14551.html 一般情况下,我们使用Runnable作为基本的任务表示形式,但是Runnable是一种有很大局限的 ...

  5. 项目管理办公室 PMO

    项目管理办公室是组织中指导,协调,支持项目管理工作的一个常设职能部门,也就是管理项目管理的常设职能部门. 它负责指定和贯彻标准化的项目管理方法论(包括工作流程与规章制度等),协调所辖的各项目对资源,工 ...

  6. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  7. 理解squid的正向和反向代理

    1.相同点: 访问的走向都是:客户端 -> 代理服务器 ->真实服务器 ->代理服务器->客户端 2.不同点:正向代理语义上更侧重于,让代理服务器去帮忙请求某个网址.让代理服务 ...

  8. mybatis使用

    mybatis网站:http://mybatis.github.io/spring/zh/ mybatis spring下载网址:https://github.com/mybatis/spring/r ...

  9. windows下mysql主从同步备份步骤

    目的:有两台MySQL数据库服务器A和B,使A为主服务器,B为从服务器,初始状态时,A和B中的数据信息相同,当A中的数据发生变化时,B也跟着发生相应的变化,使得A和B的数据信息同步,达到备份的目的. ...

  10. Halcon 10.0:Hobject图像转CBitmap

    void HImage2CBitmap(Hobject pImage,CBitmap *wImage) { char lpcsType[MAX_STRING]; Hlong lPointer,widt ...