指向类和结构体的指针

指向类的指针

class PointerTestClass {
    var intNum = 3
    var another = 56
    var another1 = 59
}

下面是验证代码

let pointer: UnsafeMutablePointer<PointerTestClass> = UnsafeMutablePointer.allocate(capacity: 3)
let testInstance = PointerTestClass()
pointer.initialize(repeating: testInstance, count: 3)
// ?? 下面这个会报错,因为还处于 uninit 状态
//                pointer.assign(repeating: testInstance, count: 3)
testInstance.intNum = 4
//改了一个,所有的都会改,因为指向了同一个地址。
expect(pointer.pointee.intNum).to(equal(4))
expect(pointer[1].intNum).to(equal(4))
expect(pointer[2].intNum).to(equal(4))
// 证明是同一个地址
var instanceAddress: String!
withUnsafeBytes(of: testInstance, { (rawBuffer) in
    let data = Data.init(bytes: rawBuffer.baseAddress!, count: rawBuffer.count)
    instanceAddress = data.hexView
})
(0..<3).forEach({ (offset) in
    pointer.advanced(by: offset).withMemoryRebound(to: UInt8.self, capacity: 8, { (uInt8Pointer) in
        let data = Data.init(bytes: uInt8Pointer, count: 8)
        expect(data.hexView).to(equal(instanceAddress))
    })
})

?

指向struct 的指针

struct 定义如下:

struct PointerTestStruct {
    var intNum = 3
    var another = 56
    var another1 = 59
}

下面是验证代码

                let pointer: UnsafeMutablePointer<PointerTestStruct> = UnsafeMutablePointer.allocate(capacity: 3)
                var testInstance = PointerTestStruct()
                //可以用assign,因为是 trival type
                pointer.assign(repeating: testInstance, count: 3)
                testInstance.intNum = 4
                //改了一个,其他的不会受影响,因为是不同的实例。
                expect(pointer.pointee.intNum).to(equal(3))
                expect(pointer[1].intNum).to(equal(3))
                expect(pointer[2].intNum).to(equal(3))

                var memory: String!
                let stride = MemoryLayout.stride(ofValue: testInstance)
                withUnsafeBytes(of: testInstance, { (rawBuffer) in
                    let data = Data.init(bytes: rawBuffer.baseAddress!, count: rawBuffer.count)
                    memory = data.hexView
                })
                (0..<3).forEach({ (offset) in
                    pointer.advanced(by: offset).withMemoryRebound(to: UInt8.self, capacity: stride, { (uInt8Pointer) in
                        let data = Data.init(bytes: uInt8Pointer, count: stride)
                        expect(data.hexView).toNot(equal(memory))
                    })
                })

?

原文地址:https://www.cnblogs.com/huahuahu/p/zhi-xiang-lei-he-jie-gou-ti-de-zhi-zhen.html

时间: 2024-10-09 04:43:34

指向类和结构体的指针的相关文章

黑马程序员 C语言-枚举,结构体,指针

一.枚举 ※枚举变量的定义 前面只是定义了枚举类型,接下来就可以利用定义好的枚举类型定义变量. 跟结构体一样,有3种方式定义枚举变量 1.先定义枚举类型,再定义枚举变量 enum Season {spring, summer, autumn, winter}; enum Season s; 2.定义枚举类型的同时定义枚举变量 enum Season {spring, summer, autumn, winter} s; 3.省略枚举名称,直接定义枚举变量 enum {spring, summer

深入了解Windows句柄到底是什么(句柄是逻辑指针,或者是指向结构体的指针,图文并茂,非常清楚)good

总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解.今天比较闲,我上网查了查,光是百度百科词条“句柄”中就有好几种说法,很多叙述还是错误的,天知道这些误人子弟的人是想干什么. 这里我列举词条中的关于句柄的叙述不当之处,至于如何不当先不管,继续往下看就会明白: 1.windows 之所以要设立句柄,根本上源于内存管理机制的问题—虚拟地址,简而言之数据的

指针 指针与数组 指针与字符串 指针与函数 结构体与指针 宏

指针 指针与数组 指针与字符串 指针与函数?? 指针与数组 1.数组名:数组元素首地址 eg: int array[3]={1,3,6}; 这里array 恒等于&array[0] 2.int *p = a; int *p = 0; int a[]={0}; 3.int *p = a; 均指向数组的首地址 *p是? *(p+1)是?(*p)+1是? *(p+1)决定向下移动几个字节是类型 4.指针可以当数组名使用 p[1] = 3; 恒等于a[1] ;恒等于*(p+1);恒等于*(a+1) 5.

指向结构体的指针

运用指向结构体数组的指针输出学生信息 说明:指针指向结构体数组,就得到了该结构体数组的起始地址.通过该地址可以访问结构体数组中的所有成员变量.其中,指向结构体的指针的算术运算与 指向数组的指针的用法相似. #include<stdio.h> #define N 10 //结构体类型及变量的定义,初始化 struct student { char *number; char *name; char sex; int age; float score; }stu[3]={{"06001&

代码案例(结构体,函数指针,指针函数,冒泡排序) 修改

#import <Foundation/Foundation.h> typedef struct {     char name[20];     int age;     float score; }Stu; //建立字符串和函数之间的一一对应关系. typedef BOOL (*PStu) (Stu stu1,Stu stu2) ; typedef struct nameFunctionPair{     char name[20]; //存储函数对应的字符串     PStu funct

【C语言】用结构体数组指针完成:有三个学生信息,存放在结构体数组中,要求输出全部信息

//用结构体数组指针完成:有三个学生信息,存放在结构体数组中,要求输出全部信息 #include <stdio.h> struct Stu { int num; char name[20]; char sex; int age; }; int main() { struct Stu student[3]={{317,"han",'m',20},{318,"hun",'w',22},{311,"dan",'w',18}}; struct

EDKII CR宏:根据成员指针获取父结构体变量指针

核心提示: 1. CR宏 (Containing Record):根据成员指针获取父结构体变量指针 2. 0 指针的妙用. 在EDKII 的代码中有不少关于CR宏的使用,如 时钟中断处理函数CoreTimerTick. VOID EFIAPI CoreTimerTick ( IN UINT64 Duration ) { IEVENT *Event; ... if (!IsListEmpty (&mEfiTimerList)) { Event = CR (mEfiTimerList.Forward

C Language Study - 结构体成员指针初始化

结构体成员指针初始化 不可以正确运行的初始化方式(1): #include <stdio.h> #include <string.h> #include <malloc.h> //#include "a.h" //char a[100]; struct stu { char* name; int num; }*pst,st; void init_pst() { pst = (struct stu *)malloc(sizeof(struct stu)

代码案例(结构体,函数指针,指针函数,冒泡排序)

typedef struct {     char name[20];     int age;     float score; }Stu; #import <Foundation/Foundation.h> //姓名升序 void sortByName(Stu *p , int count ) {     for (int i = 0 ; i < count -1; i ++) {         for (int j= 0 ; j < count -1-i; j ++) {