(一)使用sizeof获取基础变量需要内存空间大小
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//基础类型变量,需要内存空间
NSLog(@"BOOL 需要内存空间字节数:%lu", sizeof(BOOL));
NSLog(@"int 需要内存空间字节数:%lu", sizeof(int));
NSLog(@"float 需要内存空间字节数:%lu", sizeof(float));
NSLog(@"double 需要内存空间字节数:%lu", sizeof(double));
NSLog(@"NSInteger 需要内存空间字节数:%lu", sizeof(NSInteger));
NSLog(@"NSUInteger 需要内存空间字节数:%lu", sizeof(NSUInteger));
}
return 0;
}
打印结果如下:
BOOL 需要内存空间字节数:1
int 需要内存空间字节数:4
float 需要内存空间字节数:4
double 需要内存空间字节数:8
NSInteger 需要内存空间字节数:8
NSUInteger 需要内存空间字节数:8
Note:sizeof是编译时一元运算符,是在编译期间就计算出内存空间大小.sizeof不是函数,函数是在程序运行时执行的.
(二)查看指针变量类型需要内存空间大小
//打印指针变量类型,需要内存空间
NSLog(@"BOOL * 需要内存空间字节数:%lu", sizeof(BOOL *));
NSLog(@"int * 需要内存空间字节数:%lu", sizeof(int *));
NSLog(@"float * 需要内存空间字节数:%lu", sizeof(float *));
NSLog(@"double * 需要内存空间字节数:%lu", sizeof(double *));
NSLog(@"NSInteger * 需要内存空间字节数:%lu", sizeof(NSInteger *));
NSLog(@"NSUInteger * 需要内存空间字节数:%lu", sizeof(NSUInteger *));
打印结果如下:
BOOL * 需要内存空间字节数:8
int * 需要内存空间字节数:8
float * 需要内存空间字节数:8
double * 需要内存空间字节数:8
NSInteger * 需要内存空间字节数:8
NSUInteger * 需要内存空间字节数:8
(三)创建指针变量,使用sizeof继续验证
// 创建基础变量
BOOL isFlag_BOOL = false;
int i1_int = 9;
float f1_float = 1.22;
double d1_double = 3.33;
NSInteger nsi1_NSInteger = 199;
NSUInteger nsui1_NSUInteger = 3456;
// 创建指针变量
BOOL *p_BOOL = &isFlag_BOOL;
int *p_int = &i1_int;
float *p_float = &f1_float;
double *p_double = &d1_double;
NSInteger *p_NSInteger = &nsi1_NSInteger;
NSUInteger *p_NSUInteger = &nsui1_NSUInteger;
NSLog(@" BOOL变量: %lu %lu %lu", sizeof(isFlag_BOOL), sizeof(&isFlag_BOOL), sizeof(p_BOOL));
NSLog(@" int变量: %lu %lu %lu", sizeof(i1_int), sizeof(&i1_int), sizeof(p_int));
NSLog(@" float变量: %lu %lu %lu", sizeof(f1_float), sizeof(&f1_float), sizeof(p_float));
NSLog(@" double变量: %lu %lu %lu", sizeof(d1_double), sizeof(&d1_double), sizeof(p_double));
NSLog(@" NSInteger变量: %lu %lu %lu", sizeof(nsi1_NSInteger), sizeof(&nsi1_NSInteger), sizeof(p_NSInteger));
NSLog(@"NSUInteger变量: %lu %lu %lu", sizeof(nsui1_NSUInteger), sizeof(&nsui1_NSUInteger), sizeof(p_NSUInteger));
打印结果如下:
BOOL变量: 1 8 8
int变量: 4 8 8
float变量: 4 8 8
double变量: 8 8 8
NSInteger变量: 8 8 8
NSUInteger变量: 8 8 8
变量 i1_int 是int类型,需要4个字节内存空间.
指针变量 p_int 指向int变量 i1_int, 存放的是int变量的地址,所以需要8个字节.
(四)地址验证
// 打印地址
NSLog(@" BOOL变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &isFlag_BOOL, p_BOOL, &p_BOOL);
NSLog(@" int变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &i1_int, p_int, &p_int);
NSLog(@" float变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &f1_float, p_float, &p_float);
NSLog(@" double变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &d1_double, p_double, &p_double);
NSLog(@" NSInteger变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &nsi1_NSInteger, p_NSInteger, &p_NSInteger);
NSLog(@"NSUInteger变量地址:%p 指针变量指向数据地址:%p 指针变量的地址:%p", &nsui1_NSUInteger, p_NSUInteger, &p_NSUInteger);
打印结果如下:
BOOL变量地址:0x7ffeefbff50f 指针变量指向数据地址:0x7ffeefbff50f 指针变量的地址:0x7ffeefbff4e0
int变量地址:0x7ffeefbff508 指针变量指向数据地址:0x7ffeefbff508 指针变量的地址:0x7ffeefbff4d8
float变量地址:0x7ffeefbff504 指针变量指向数据地址:0x7ffeefbff504 指针变量的地址:0x7ffeefbff4d0
double变量地址:0x7ffeefbff4f8 指针变量指向数据地址:0x7ffeefbff4f8 指针变量的地址:0x7ffeefbff4c8
NSInteger变量地址:0x7ffeefbff4f0 指针变量指向数据地址:0x7ffeefbff4f0 指针变量的地址:0x7ffeefbff4c0
NSUInteger变量地址:0x7ffeefbff4e8 指针变量指向数据地址:0x7ffeefbff4e8 指针变量的地址:0x7ffeefbff4b8
还是继续用整形变量 i1_int,加上xcode工具View memory验证.
(1)首先通过指针p_int变量的地址0x7ffeefbff4d8查看指针变量存储的值是否是地址0x7ffeefbff508
(2)通过整形变量p_int的地址找到其存储数据的值是9.
通过变量的地址走到存储数据的值.png
网友评论