星号也可以靠在变量名前面, int *p 要同时定义多个相同类型的指针,则为 int *pl, *p2 注意,每个变量之前都必须有* 19.4初始化指针变量 是变量就存在一个初始化的问题。一个不能确定是住着什么人的房间,总是有点恐怖。 19.4.1指向不明的指针 我先定义一个整型指针 nt* p 现在,p是一个指针,int规定它只能存放整型变量的地址,而不是其它如字符型,布尔型 等等 我们称:p是一个整型指针。 不过,现在p指向哪里(即:p存储的是哪个变量的地址)? 变量在没有赋值之前,其值不定的。对于指针变量,值不定可以表述为:指向不明 重点来了!一个指向不明的指针,是一个危险的家伙。很多软件有BUG,其最后的原因 就在这里。 来看看下而的“恐怖片
星号也可以靠在变量名前面,如: int *p; 要同时定义多个相同类型的指针,则为: int *p1, *p2; 注意,每个变量之前都必须有 * 。 19.4 初始化指针变量 是变量就存在一个初始化的问题。一个不能确定是住着什么人的房间,总是有点恐怖。 19.4.1 指向不明的指针 我先定义一个整型指针: int* p; 现在,p 是一个指针,int 规定它只能存放整型变量的地址,而不是其它如字符型,布尔型 等等。 我们称:p 是一个整型指针。 不过,现在 p 指向哪里 (即:p 存储的是哪个变量的地址 )? 变量在没有赋值之前,其值不定的。对于指针变量,值不定可以表述为:指向不明。 重点来了! 一个指向不明的指针,是一个危险的家伙。很多软件有 BUG,其最后的原因, 就在这里。 来看看下而的“恐怖片”:
打开火折,但见 你来到一间阴森森的 你前往这纸条 纸条内容:“XX街3K XXX街3K号”里住着 房间,这房间里有一张 千年老妖!你 > 0x3F0073D是哪里的 程序访问了一个没有 程序随即访问内存?说不定正好是 初始化的指针: p的内存是随机的一个 内存地址 Windows老大要用的内 数,比如:0x3FF0073D 0x3FF0073D 存,你竟敢访问 Windows一生气,蓝屏 既然没有赋值的指针这么危险,下面来看看如何给指针赋值。 19.4.2给指针变量赋值 (1) int k= 100 int米 p=&k;//p取得变量k的地址(也称:p指向k) 第1行定义一个整型变量k 第2行定义了一个整型指针p 而第3行,“指针p存储了变量k的地址”。短的说法是“p指向了k” 执行了上面三行代码后,结果是:p指向k。我们来看具体的内存示意图
你来到一间阴森森的 房间,这房间里有一张 纸条 ---> 打开火折,但见 纸条内容:“XXX 街 3K 号” ---> 你前往这纸条 的神秘地 址…… ---> “XXX 街 3K 号”里住着 一千年老妖!你…… 程序访问了一个没有 初始化的指针: int* p; p 的内存是随机的一个 数,比如: 0x3FF0073D 程序随即访问 内存地址: 0x3FF0073D 0x3FF0073D 是哪里的 内 存 ? 说 不 定 正 好 是 Windows 老大要用的内 存,你竟敢访问! Windows 一生气,蓝屏。 既然没有赋值的指针这么危险,下面来看看如何给指针赋值。 19.4.2 给指针变量赋值 (1) int k = 100; (2) int* p; (3) p = &k; //p 取得变量 k 的地址 (也称:p 指向 k) 第 1 行定义一个整型变量 k。 第 2 行定义了一个整型指针 p。 而第 3 行,“指针 p 存储了变量 k 的地址”。短的说法是“p 指向了 k”。 执行了上面三行代码后,结果是: p 指向 k。我们来看具体的内存示意图
且k:|100 11000002 变员k 11000006 1100000 110014004 p指向k示意图 上图中,红色数字代表什么?红数字11000002是变量k的内存地址 指针初始化的结果,就是让它存储下另一个变量的地址。简称指向另一个变量 下面说说三种常见的,给指针赋值的操作: 、用&取得普通变量的地址。 要想让指针指向某个普通变量,需要通过&来得到该普通变量的地址。 nt k int*p=&k 指针之间的赋值 两个指针之间也可以相互赋值,此时不需要通过&来取址。 It k int* pl
p 指向 k 示意图 上图中,红色数字代表什么?红数字 11000002 是 变量 k 的内存地址。 指针初始化的结果,就是让它存储下另一个变量的地址。简称指向另一个变量。 下面说说三种常见的,给指针赋值的操作: 一、用 & 取得普通变量的地址。 要想让指针指向某个普通变量,需要通过 & 来得到该普通变量的地址。 int k; int* p = &k; 二、指针之间的赋值。 两个指针之间也可以相互赋值,此时不需要通过 & 来取址。 int k; int* p1
//p1先指向 //然后,p2也指向 注意,p2=p1的结果是:让p2也指向“p1所指的内容”,而不是让p2指向“p1本身” 上面的情况可以改为直接在定义时就赋值 t**p1=&k 三、让指针指向数组 数组本身就是地址,所以对数组变量也不用通过&来取址 char name[]="NanYu char*p=name;//不用取址符& 或者 int arr[3]={100,99,80}; 四、让指针指向一个新地址 前而的赋值方法都是让指针指向一个已有的内存空间的地址。比如:int*p=&k:指针变 量p存放的是已有的变量k的地址。其实指针也可以指向一个新开辟的内存空间,这一内存空 间不归属于其它变量
int* p2; p1 = &k; //p1 先指向 k p2 = p1; //然后 ,p2 也指向 k。 注意,p2 = p1 的结果是:让 p2 也指向“p1 所指的内容”,而不是让 p2 指向“p1 本身”。 上面的情况可以改为直接在定义时就赋值: int k; int* p1 = &k; int* p2 = p1; 三、让指针指向数组 数组本身就是地址,所以对数组变量也不用通过 & 来取址。 char name[] = "NanYu"; char* p = name; //不用取址符 & 或者: int arr[3] = {100,99,80}; int* p = arr; 四、让指针指向一个新地址 前而的赋值方法都是让指针指向一个已有的内存空间的地址。比如:int* p = &k; 指针变 量 p 存放的是已有的变量 k 的地址。其实指针也可以指向一个新开辟的内存空间,这一内存空 间不归属于其它变量
在C++中,常用一个关键字:new来为指针开辟一段新空间。比如 int* p= new int 现在,指针变量p存储着一个内存地址,该内存地址确实存在一一它是由new操作符申请 而得。可以这样认为,new是一位特权人物,不通过它,指针只能指向已有的“房间”:而使 用了它,则可以要求系统为指针“新开辟一片空地,然后建上新房间”。 有特权的人不仅仅是“new”,还有几个系统定义的函数,及 Windows提供的函数,都可以 实现“向系统要空间”的功能。我们将在后面专门的章节详细讲解。 19.5地址解析及其操作符* *在C,C++语言里除了起“乘号”的作用以外,前面我们还刚学了它可以在定义变量时,表 明某个变量是属于“指针类型”。现在,则要讲到它还能起“地址解析”的作用。 什么叫“地址解析”?假设有一int类型变量k ntk= 100 内存 内存地址 100 11000000 方框是变量k所占用的内存。100是该内存中存放的值。而11000000则是该内存的地址。 “地址解析”就是地址->值的解释过程。即:通过地址110000(到位于地址的变量 可见“地址解析(*)”和“取址(&)”正好是一对相反的操作
在 C++中,常用一个关键字:new 来为指针开辟一段新空间。比如: int* p = new int; 现在,指针变量 p 存储着一个内存地址,该内存地址确实存在——它是由 new 操作符申请 而得。可以这样认为,new 是一位特权人物,不通过它,指针只能指向已有的“房间”;而使 用了它,则可以要求系统为指针“新开辟一片空地,然后建上新房间”。 有特权的人不仅仅是“new”,还有几个系统定义的函数,及 Windows 提供的函数,都可以 实现“向系统要空间”的功能。我们将在后面专门的 章节详细讲解。 19.5 地址解析 及其操作符 * * 在 C,C++语言里除了起“乘号”的作用以外,前面我们还刚学了它可以在定义变量时,表 明某个变量是属于“指针类型”。现在,则要讲到它还能起“地址解析”的作用。 什么叫“地址解析”?假设有一 int 类型变量 k: int k = 100; 内存 内存地址 100 11000000 方框是变量 k 所占用的内存。100 是该内存中存放的值。而 11000000 则是该内存的地址。 “地址解析”就是 地址->值 的解释过程。即:通过地址 11000000 得到位于地址的变量。 可见“地址解析(*)” 和 “取址(&)” 正好是一对相反的操作