指针示例

==========================================示例一

结论:

1,栈中的内存块按4的倍数进行分配(不是按照类型的大小分配的)
2,指针类型强制转换,得到的内容将无意义

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static unsafe void Main(string[] args)
{
//1,栈中的内存块按4的倍数进行分配(不是按照类型的大小分配的)
//2,指针类型强制转换,得到的内容将无意义
int x = 10;
short y = -1;
byte y2 = 4;
double z = 10.1;
int* pX;
short* pY;
double* pZ;
pX = &x;
pY = &y;
pZ = &z;
//6B7E738   4   10
Console.WriteLin("address of x  is {0:X},size is {1},value is {2}", (uint)&x, sizeof(int), x);
//6B7E734   2   -1
Console.WriteLine("address of y  is {0:X},size is {1},value is {2}", (uint)&y, sizeof(short), y);
//6B7E730   1   4     
Console.WriteLine("address of y2 is {0:X},size is {1},value is {2}", (uint)&y2, sizeof(byte), y2);
//6B7E728   8   10.1
Console.WriteLine("address of z  is {0:X},size is {1},value is {2}", (uint)&z, sizeof(double), z);
//6B7E724   4   6B7E738     (取的指针的地址)
Console.WriteLine("address of pX is {0:X},size is {1},value is {2:X}", (uint)&pX, sizeof(int*), (uint)pX);
//6B7E720   4   6B7E734     (取的指针的地址)
Console.WriteLine("address of pY is {0:X},size is {1},value is {2:X}", (uint)&pY, sizeof(short*), (uint)pY);
//6B7E71C   4   6B7E728     (取的指针的地址)
Console.WriteLine("address of pZ is {0:X},size is {1},value is {2:X}", (uint)&pZ, sizeof(double*), (uint)pZ);
//改变了x的值
*pX = 20;   //x=20,*pX=20
//指针强制装换,得到的值将无意义
pZ = (double*)pX;//*pZ的内容无意义
Console.ReadKey();
           
}
}
}

==========================================示例二

结论:

1,使用算法,改变指针

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
    class Program
    {
        static unsafe void Main(string[] args)
        {

            CurrencyStruce amount1, amount2;
            CurrencyStruce* pAmount = &amount1;
            long* pDollars = &(pAmount->Dollars);
            byte* pCents = &((*pAmount).cents);
            //642ED1C 16
            Console.WriteLine("address of amount1  is {0:X},size is {1}", (uint)&amount1, sizeof(CurrencyStruce));
            //642ED0C 16
            Console.WriteLine("address of amount2  is {0:X},size is {1}", (uint)&amount2, sizeof(CurrencyStruce));
            //642ED08 4 642ED1C
            Console.WriteLine("address of pAmount  is {0:X},size is {1},value is {2:X}", (uint)&pAmount, sizeof(CurrencyStruce*), (uint)pAmount);
            //642ED04 4 642ED1C
            Console.WriteLine("address of pDollars is {0:X},size is {1},value is {2:X}", (uint)&pDollars, sizeof(CurrencyStruce*), (uint)pDollars);
            //642ED00 4 642ED24
            Console.WriteLine("address of pCents   is {0:X},size is {1},value is {2:X}", (uint)&pCents, sizeof(CurrencyStruce*), (uint)pCents);
            *pDollars = 20;
            //$20.0 $0.0
            Console.WriteLine("amount1 is {0},amount2 is {1}", amount1, amount2);
            //=================pAmount指针递减之后,其地址指向amount2(因为amount2栈中的地址在amount1的下面)
            pAmount--;
            //642ED08 4 642ED0C
            Console.WriteLine("address of pAmount  is {0:X},size is {1},value is {2:X}", (uint)&pAmount, sizeof(CurrencyStruce*), (uint)pAmount);

            //=================pCents目前指向amount1.cents,使其指向amount2.cents
            CurrencyStruce* pTempCurrency = (CurrencyStruce*)pCents;//pTempCurrency指针指向642ED24
            pCents = (byte*)(--pTempCurrency);//pTempCurrency-1(因为CurrencyStruce占用16个字节)所以结果指向642ED14
            *pCents = 3;
            //$20.0 $0.3
            Console.WriteLine("amount1 is {0},amount2 is {1}", amount1, amount2);
 
            //=================查看类成员指针
            CurrentClass c = new CurrentClass();
            fixed (long* pCDollars = &(c.Dollars))
            fixed (byte* pCCents = &(c.cents))
            {
                Console.WriteLine("address of c.Dollars is {0:X}",(uint)pCDollars);
                Console.WriteLine("address of c.cents   is {0:X}", (uint)pCCents);
                *pCCents = 9;
                Console.WriteLine(c);//输出:$0.9
            }
 
            Console.ReadKey();
 
 
        }
    }
    //结构
    struct CurrencyStruce
    {
        public long Dollars;
        public byte cents;
        public override string ToString()
        {
            return "$" + Dollars + "." + cents;
        }
    }
    //类
    class CurrentClass
    {
        public long Dollars;
        public byte cents;
        public override string ToString()
        {
            return "$" + Dollars + "." + cents;
        }
    }

}
时间: 2024-12-25 11:29:16

指针示例的相关文章

C之指针示例

C中重要的概念就是指针了,指针可以方便我们实现一些功能,但同时我么也要承担使用指针的风险.下面是使用指针的一个小例子. #include<stdio.h> void swap(int *, int *); int main(void){ int m, n; m = 5; n = 10; printf("Before change m = %d and n = %d.\n", m, n); swap(&m, &n); printf("After ch

第九课、智能指针示例------狄泰软件学院

一.内存泄漏(臭名昭著的bug) (1).动态申请堆空间,用完后不归还 (2).c++语言中没有垃圾回收机制 (3).指针无法控制所指向的堆空间生命周期(如局部指针生命周期结束了堆空间的生命周期还未结束) 二.智能指针 1.当代c++平台的智能指针 (1).指针生命周期结束时主动释放堆空间 (2).一片堆空间最多只能由一个智能指针标识 (3).杜绝指针运算和指针比较 2.智能指针的设计方案 (1).通过类模板描述指针的行为:能够定义不同类型的指针变量 (2).重载指针特征操作符(->和*):利用

智能指针示例

智能指针实际上就是通过模板技术实现的一个类 内存泄露(臭名昭著的Bug)——在软件开发和测试阶段都不容易被发现-动态申请堆空间,用完后不归还-C++语言中没有垃圾回收的机制-指针无法控制所指堆空间的生命周期 当代C++软件平台中的智能指针-指针生命周期结束时主动释放堆空间-一片堆空间最多只能由一个指针标识 -杜绝指针运算和指针比较 智能指针的设计方案-通过类模板描述指针的行为 能够定义不同类型的指针对象-重载指针特征操作符(->和*) 利用对象模拟原生指针的行为 SmartPointer.h #

C++ 之 指针详解篇(二)

使用关键字new动态分配内存,在new后面为其分配内存对象的类型,让编译器知道需要多少内存.new的返回值是一个内存地址,内存的地址被存储在指针中,因此将new的返回值赋给一个指针.如 short int* p; p = new short int; 或者声明指针的同时直接初始化, short int* p= new short int; 无论用哪种方式,p都指向了short int,然后就可以向变量的指针那样使用如 *p = 72; //将72放在动态内存中 使用完了指针记得一定要释放指针.可

指针数组??数组指针的区别.xml

pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6;font-style:italic;font-weight:bold;} .selfFuc{color:#800080;} .bool{color:#d2576f;} .condition{color:#000080;font-weight:bold;} .key{color:#000080;} .

不可或缺 Windows Native (7) - C 语言: 指针

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #ifndef _MYHEAD_POINTER_ #define _MYHEAD_POINTER_ #ifdef __cplusplus extern "C" #endif char *demo_cPointer(); #endif cPointer.c /* * 指针 */ #include "pch.h" #include "c

PCRE函数简介和使用示例【转】

PCRE函数简介和使用示例 标签: 正则表达式listbuffercompilationnullperl 原文地址:http://blog.csdn.net/sulliy/article/details/6247155 PCRE是一个NFA正则引擎,不然不能提供完全与Perl一致的正则语法功能.但它同时也实现了DFA,只是满足数学意义上的正则. PCRE提供了19个接口函数,为了简单介绍,使用PCRE内带的测试程序(pcretest.c)示例用法. 1. pcre_compile 原型: #in

C#的delegate与C的函数指针

引子: 一个小示例,希望可以帮助广大侠士们来理解delegate. 在C中的函数指针示例: 1 #include <stdio.h> 2 3 // 减法运算 4 int minus(int a, int b) { 5 return a - b; 6 } 7 8 // 加法运算 9 int sum(int a, int b) { 10 return a + b; 11 } 12 13 // 这个counting函数是用来做a和b之间的计算,至于做加法还是减法运算,由函数的第1个参数决定 14 v

函数指针及其的运用(上)——何为函数指针

=========================引子========================= 我们都知道,数组名就是指向数组第一个元素的常量指针(详见<数组拾遗>).同理,对于一个函数而言,函数名也是指向函数第一条指令的常量指针.而编译器要做的就是在程序编译之后,为每个函数分配一个首地址,即该函数第一条指令的地址.一般情况下,我们可以用一个指针来保存这个地址,而这个指针就是函数指针,该指针可以看作是它指向函数的别名,所以我们可以用该指针来调用这个函数. ==============