美文网首页
你并不一定了解的指针

你并不一定了解的指针

作者: 旺仔Milk | 来源:发表于2019-07-17 17:20 被阅读0次

Q: int *p 怎么理解?
A:p是一个变量名, int * 标识p变量只能存储int类型变量的地址

什么是指针?

指针是C语言的灵魂

定义

Q: 地址是什么?
A:

  • 地址是内存单元的编号
  • 从零开始的非负整数

Q: 那么指针到底什么?
A:

  • 指针就是地址, 地址就是指针
  • 指针变量是存放内存单元地址的变量
  • 指针的本质是一个操作受限的非负整数

内存的取值范围

  • 32位系统 0 - FFFFFFFF(2的32次方 得到结果 0 到 4G -1)
  • 64位系统下 为2的64次方 理论上可以到达17179869184G, 不过目前windows系统只支持最大128G内存

举个栗子

int a = 10;   
int *p = &a;    
printf("p = %p,*p = %d,&p = %p,a = %d,&a = %p",p,*p,&p,a,&a);
/*结果:
p = 0x7ffeeb92e49c,
*p = 10,
&p = 0x7ffeeb92e490,
a = 10,
&a = 0x7ffeeb92e49c
*/
指针地址 指针变量名 所保存的内容
0x7ffeeb92e490 p 0x7ffeeb92e49c
0x7ffeeb92e49c a 10

逐一解释一下

  • p,因为p是一个指针的变量名,会输出名字为p的指针中所保存的内容 既0x7ffeeb92e49c(p指针中保存的就是这个)
  • *p呢意思就是将p指针中的内容取出来 所以输出为 10
  • &p的意思就是取p这个指针自己的地址
  • ap的意思一样取出变量名为a的指针中保存的内容
  • &a&p又是一样的取到变量名为a自己的指针

解释了一通之后再来看一下上面的两行代码

int a = 10;   
int *p = &a;    

int a = 10;声明一个指针变量名字为a 保存int类型的指针,其保存的内容为 10
int *p = &a; 声明一个指针变量名字为p 保存int类型地址的指针,其保存的内容为a的指针地址

怎么一样现在对指针的了解是不是不一样了呢?

iOS的NSLog为什么打印出来的不是内存地址呢?和上面说的不一样啊?

开发中通过NSLog的%@打印自定义的对象时,
只会打印出一个对象的内存地址。
例如:(xxxview:0xb677420)
但是打印系统的类型,例如NSArray就不会这样。

这是为什么呢?

原因:调用NSLog方法在底层对象会收到description消息,该方法所返回的描述信息将取代“%@”。
所以重写这个description方法就可以设定打印的东西。
还有一个方法可以重写,就是debugDescription方法:是开发者在调试器中以控制台命令打印对象时才调用的。在NSObject类的默认实现中,此方法只是直接调用了description。
当希望调试的时候可以看见打印的地址和信息,在正常打印的时候不需要地址时候,就可以像下面这样重写两个方法。

// 自定义对象需要重写description方法
 - (NSString *)description
{
    return [NSStringstringWithFormat:@"<%@>",@{@"name":_name,@"work":_work}];
}

- (NSString *)debugDescription
{
    return [NSStringstringWithFormat:@"<%@ : %p, %@>",[selfclass],self,@{@"name":_name,@"work":_work}];
}

// 如果想打印指针地址的话 需要使用 %p
NSString *str = @"SunSatan";    
NSLog(@"指针所指向对象的内存地址:%p",str);
NSLog(@"指针自己的内存地址:%p",&str);

参考资料

软件运行与内存的关系
内存是在操作系统的统一管理下使用的
1.软件在运行前需要向操作系统申请存储空间,在内存空闲空间足够时,操作系统将分配一段内存空间并将外存(硬盘等介质)中的软件拷贝一份存入该内存空间,并执行该软件。
2.在软件运行期间,该软件所占内存空间不再分配给其他软件使用。(恶意程序会在这里做文章)
3.当软件运行完毕后,操作系统将回收该内存空间(注意:操作系统并不会清空该内存空间中遗留下来的数据),以便再次分配给其他软件使用。
-综上所述,一个软件所分配到的空间中既有可能存在着以前其他软件使用过后的残留数据,这些数据被称之为垃圾数据。所有通常情况下我们声明一个新的变量,新的数组,分配好存储空间之后都要对该内存空间进行初始化操作! 确保不会有脏数据产生。

1.指针变量也是变量,只不过它存放的不能是内存单元的内容,只能存放内存单元的地址
2.普通变量前面不能加*号
3.常量和表达式前面不能加&(取地址符)

相关文章

  • 你并不一定了解的指针

    Q: int *p 怎么理解?A:p是一个变量名, int * 标识p变量只能存储int类型变量的地址 什么是指针...

  • Day5

    学习内容:指针的概念与应用收获: 了解了内存的相关概念; 了解了指针的相关概念; 了解了指针变量的使用; 了解了字...

  • 42/每天500字——请你勇敢点。

    今日白茶分享会,从茶友那更加了解了白茶。你可能并不一定知道茶的来源,也并不一定了解各种茶类,但,你的感官直接的...

  • 指针

    PS:本文假设你对指针已有一定的了解,能熟练运用最简单的指针。 概念 首先解释一下两个概念 指针的类型 指针指向的...

  • 记一次内存泄漏

    这次c++底层的内存泄漏怎么说呢,让你了解了更多指针内存的东西,说更多了解,反而发现有更多的不了解了,比如指针和整...

  • 洞察人性。

    人与人之间表面了解和表面的交流或表面常说些客套话,并不一定代表你跟他非常有交集,也并不一定代表她一定很了解你,有可...

  • 指针初步了解

    结构体和类 本质区别: 类的本质是结构体,但是指针指向一个类 和指向一个结构体是不同的概念 例证: nsstrin...

  • 😊iOS开发中的野指针问题

    随机性强、难以定位不是必现的提高野指针的崩溃率对象内存填充hook dealloc野指针指向的地址并不一定会cra...

  • 可爱的指针(二)

    可爱的指针(二) 在上一篇可爱的指针(一)中,我们了解了指针的基本内容。在这一篇中,我们主要了解指针与字符串、二维...

  • 【今日一课】指针详解之指针的运算(一)

    我们已经了解过指针是什么了 下面让我们继续来学习指针 今天的主题是指针的运算(一)

网友评论

      本文标题:你并不一定了解的指针

      本文链接:https://www.haomeiwen.com/subject/lkiqlctx.html