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 的值 = 90

如何:获取变量的地址

要获取计算结果为固定变量的一元表达式的地址,请使用 address-of 运算符:

int number;
int* p = &number; //address-of operator &

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 = 25;
            p->y = 12;

            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[123];

        for (int i = 65; i < 123; i++)
        {
            charPointer[i] = (char)i;
        }

        // Print uppercase letters:
        System.Console.WriteLine("Uppercase letters:");
        for (int i = 65; i < 91; i++)
        {
            System.Console.Write(charPointer[i]);
        }
        System.Console.WriteLine();

        // Print lowercase letters:
        System.Console.WriteLine("Lowercase letters:");
        for (int i = 97; i < 123; i++)
        {
            System.Console.Write(charPointer[i]);
        }
    }
}
//Output----------------
大写字母:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
小写字母:
abcdefghijklmnopqrstuvwxyz
时间: 2025-01-01 00:32:33

C#使用指针表达式的相关文章

C 指针&&表达式&&常量

一.指针 在计算机语言中,由于通过地址能找到所需的变量,可以说地址指向该变量单元,因此把地址形象的称为'指针',意思是能通过它来找到以它为地址的内存单元. 1.1.指针&&变量 指针变量与普通变量一样,使用之前不仅要定义说明而且必须要赋具体的值,未经赋值的指针变量不能使用:可以对指针变量初始化为NULL,但是不能对值为NULL的指针变量解引用. 如下定义一个指针变量p指向a,这样就可以通过p访问a并对a进行操作. int a=0; int *p=NULL; p=&a; *p=10;

C语言中,为什么指针表达式的值+1.对应的地址值却+4?/为什么两个数组元素的地址相减之差不为地址之差?

在C语言中,我们常常用到的一个运算是让某个变量的值+1. 例如 M = M + 1. 而在实际运用中,我们发现 对于指针进行+1运算,算出来的结果是+4. 如下图 图中我们定义的 变量M 和指针Matrix如下: int M = 3; int* Matrix = {1,2,3}; 可以看到,对于M和 Matrix ,+1运算的效果是不同的. 这个差异是因为C语言的标准中规定了 加法与减法运算对于地址的操作和对于值的操作是不同的,如下文中粗体所示: C89 3.3.6 Additive opera

C语言提高之——指针表达式

在理解指针表达式之前先有一个概念就是"左值"和"右值",对于左值就是可以出现在赋值符号左边的东西,右值就是那些可以出现在赋值符号右边的东西.进一步抽象可以这样理解:左值应该可以作为一个地址空间用来存放一个值,而右值可以作为一个值来处理,当然需要说明的是有些是既可以作为左值也可以作为右值的,例如:定义a为一个指针指向b,那么*a既可以作为一个右值即地址b中存放的数据,也可以作为一个左值即表示b的地址.其实说到这里就已经说明了一个简单的指针表达式了,那就是:*a.下边就

C指针解析 ------ 指针表达式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 所谓的指针表达式是指一个表达式,其结果是一个指针. 例1. int  a,b; int array[20]; int *p; p = &a;             //&a 就是一个指针表达式,因为&a的结果就是一个指针. int **q = &p;     //&p也是一个指针表达式. *q = &b;            //*p和

经典指针表达式程序 -- 简版find指令实现

#include <stdio.h>#include <string.h>#define MAXLINE 1000int getline(char *line, int max);/* find: print lines that match pattern from 1st arg */main(int argc, char *argv[]){    char line[MAXLINE];    long lineno = 0;    int c, except = 0, num

c指针-专题

六---指针 内存和地址怎么理解呢? 机器中有一些位置,每一个位置被称为[字节]/byte,许多现代机器上,每个字节包含8个位.更大内存单位[字],通常包含2个或4个字节组成. 一个字包含4个字节,它的地址是什么? 他仍然只有一个地址,是最左边还是最右边的那个字节的位置,取决于机器. 机器事实-关于整型的起始位置: 在要求边界对齐(boundaryalignment)的机器上,整型存储的起始位置只能是某些特定的字节,通常是2或4的倍数. 变量名和地址关系? 所有高级语言的特性之一,就是通过名字而

【转】让你不再害怕指针——C指针详解(经典,非常详细)

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧: [cpp] view plain copy int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,

指针的本质---如何确定指针的类型

前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍 一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一 个类型里会出现很多运算符,他们也像普通的表达式一样,有优先 级,其优先级和运算优先级一样,所以我总结了一下其原则: 从变量名处起,根据运算符优先级结合,一步一步分析. 下面让我们先从简单的类型开始慢慢分析吧: int p; int *p; //这是一个普通的整型变量 //首先从 P 处开始,先与*结合,所以说明 P 是一 //个指针,然后再与 int 结合,

[转]C 语言指针的使用

第一章 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让 我们分别说明. 先声明几个指针放着做例子: 例一: (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文?lt;<如何