第十九章指针一基本概念 19.1指针是什么? 19.2指针的大小 19.3定义一个指针变量 19.4初始化指针变量 19.4.1指向不明的指针 19.4.2给指针变量赋值 19.5地址解析及其操作符* 19.6上机实验一指向普通变量的指针和指针之间的互相赋值 上机实验二:改变指针所指变量的值,改变指针的指向 19.8指针的加减操作 19.8.1指向数组的指针 19.8.2上机实验三:指向数组的指针 19.8.3偏移指针 19.8.4上机实验四:指针的最小移动单位 19.8.5指针的+=、 操作 19.8.6上机实验五:指针的前置++与后置++的区别 19.8.7*(地址解析符)与++的优先级 19.8.8上机实验六:指针的++与--操作 19.9小结 19.1指针是什么? 当我们说“人”这个词时,有时指的是“人类”如:“人是一种会笑的动物”,有时则指个 体:比如“张三这人
第十九章 指针一 基本概念 19.1 指针是什么? 19.2 指针的大小 19.3 定义一个指针变量 19.4 初始化指针变量 19.4.1 指向不明的指针 19.4.2 给指针变量赋值 19.5 地址解析 及其操作符 * 19.6 上机实验一 指向普通变量的指针和指针之间的互相赋值 19.7 上机实验二:改变指针所指变量的值,改变指针的指向 19.8 指针的加减操作 19.8.1 指向数组的指针 19.8.2 上机实验三:指向数组的指针 19.8.3 偏移指针 19.8.4 上机实验四:指针的最小移动单位 19.8.5 指针的 += 、 -= 、++、 -- 操作 19.8.6 上机实验五:指针的前置++与后置++的区别 19.8.7 * (地址解析符)与 ++ 的优先级 19.8.8 上机实验六:指针的 ++与--操作 19.9 小结 19.1 指针是什么? 当我们说“人”这个词时,有时指的是“人类”如:“人是一种会笑的动物”,有时则指个 体:比如“张三这人
“指针”这个要念也一样,它可以意指“指针类型”,也可以代表某个具体的“指针变量” 下面我们重点要讲的是:“什么叫指针变量” 所以这一小节的题目其实应是:“指针变量是什么?” “指针变量”是什么?诚如其名,它首先是一个变量 变量最重要的特性是什么?那就是它可以存储一个值。比如 下面是三行代码,行号是我为了表达方便而特意加上的,并不在实际代码中出现。 int a (2) (3) 第(1)行定义了一个变量:a。现在它存储的那个值的大小是不定的,因为我们还没有赋给 它具体的值呢。 到了(2)行执行以后,a就存了一个值,这个值多大?答:100 这里举的是一个整型变量,但其实无论是什么类型的变量,都是用来存值的 并且,变量的值可以在以后改变大小,比如第(3)行,a中存放的值成了200。 忆完普通变量的特性,现在说“指针变量” 指针也是变量,所以也是用于存储一个值。重点是,它存储的这个值,意义有点特别 指针存储的不是普通的一个值,而是另外一个变量的地址。 句话:指针是一种用于储存“另外一个变量的地址”的变量。或者拆成两句:指针是一个 变量,它的值是另外一个变量的地址
“指针”这个要念也一样,它可以意指“指针类型”,也可以代表某个具体的“指针变量”。 下面我们重点要讲的是:“什么叫指针变量”。 所以这一小节的题目其实应是:“指针变量是什么?” “指针变量”是什么?诚如其名,它首先是一个变量。 变量最重要的特性是什么?那就是它可以存储一个值。比如: 下面是三行代码,行号是我为了表达方便而特意加上的,并不在实际代码中出现。 (1) int a; (2) a = 100; (3) a = 200; 第(1)行定义了一个变量:a。现在它存储的那个值的大小是不定的,因为我们还没有赋给 它具体的值呢。 到了(2)行执行以后,a 就存了一个值,这个值多大?答:100。 这里举的是一个整型变量,但其实无论是什么类型的变量,都是用来存值的。 并且,变量的值可以在以后改变大小,比如第(3)行,a 中存放的值成了 200。 回忆完普通变量的特性,现在说“指针变量”。 指针也是变量,所以也是用于存储一个值。重点是,它存储的这个值,意义有点特别。 指针存储的不是普通的一个值,而是另外一个变量的地址。 一句话:指针是一种用于储存“另外一个变量的地址”的变量。或者拆成两句:指针是一个 变量,它的值是另外一个变量的地址
这就是指针变量与其它的变量的同与不同:的都是一个变量,都用来存储一个值:但,指针 存放的是另外一个变量的地址。 可以这样打个比方: 有一间房子,它的地址是:人民路108号。这个房子相当于一个变量。那么 如果它是普通变量,则房子里可能今天住的是张三,明天住的是李四。张三,李四就是 这个变量的值。通过访问这间房子,我们可以直接找到张三或李四 如果它是一个指针变量,则房子里不住具体的人,而是放一张纸条,上面写:“南京东 路77号”。 “南京东路77号”是一个什么东西?是一个地址。 通过该地址,我们继续找,结果在“南京东路77号”里找到张三 变量的存储的值可以改变,指针变量的值同样可以变更 过一天,我们再去访问这个房子,纸条变了“珠海路309号”,通过它,我们找到的是另 个人 图解 个指针变虽,存放着 另一个变的地址 20000007 10000008 △地址 500 20000007 能够说出图中两个“2000007”的关系吗? 本质就这点不同,同样是变量,同样要占用一定大小的内存空间,不同的是普通变量在那个 内存里,存储了一个具体的值:而指针变量存放的是另一个变量的地址
这就是指针变量与其它的变量的同与不同:的都是一个变量,都用来存储一个值;但,指针 存放的是另外一个变量的地址。 可以这样打个比方: 有一间房子,它的地址是:人民路 108 号。这个房子相当于一个变量。那么: 一、如果它是普通变量,则房子里可能今天住的是张三,明天住的是李四。张三,李四就是 这个变量的值。通过访问这间房子,我们可以直接找到张三或李四。 二、如果它是一个指针变量,则房子里不住具体的人,而是放一张纸条,上面写:“南京东 路 77 号”。 “南京东路 77 号”是一个什么东西?是一个地址。 通过该地址,我们继续找,结果在“南京东路 77 号”里找到张三。 变量的存储的值可以改变,指针变量的值同样可以变更: 过一天,我们再去访问这个房子,纸条变了“珠海路 309 号”,通过它,我们找到的是另一 个人。 图解: 能够说出图中两个“20000007”的关系吗? 本质就这点不同,同样是变量,同样要占用一定大小的内存空间,不同的是普通变量在那个 内存里,存储了一个具体的值;而指针变量存放的是另一个变量的地址
不过,什么叫“变量的地址”?只要你是一直跟着我们的课程学习到这里,相信你能明白什 么叫变量的“地址”。否则,您可以需要从第一章从头看起了 说到这里,我们其实一直在说的是“指针变量”,而不是“指针类型”。指针也需要类型 它所存储的那个变量类型,就称为指针的类型。继续前面的比方,有一天我们去人民路108号 今天纸条写着的地址是:“美眉街8号”,于是我们兴冲冲地去了……结果“美眉街8号”里 住着一头猪!是不是很失落一一我们以为是“人类”,并且是“美眉”,未料却关着一头“猪 计算机虽然不懂得什么叫“失落”,但为了它的准确性,我们需要事先定义好一个指针到底 是放的是什么类型的变量。这个类型通常也当作是该指针的类型。 “指针变量中存储某变量的地址”这种说法是不是有些绕?所以有一个简短的说法:“指针 指向某一变量” 这种说法的缺陷是不能像第一种说法好样道出指针的本质。但它确实方便。下面我们将不 断的使用这两种说法,大家需要知道它们具有相同意义 19.2指针的大小 指针的大小是问:一个指针变量占用多少内存空间 分析:既然指针只是要存储另一个变量的地址,。注意,是存放一变量的地址,而不是存放 个变量本身,所以,不管指针指向什么类型的变量,它的大小总是固定的:只要能放得下 个地址就行!(这是一间只有烟盒大小的“房间”,因为它只需要入一张与着地址的纸条 存放一个地址需要几个字节?答案是和一个int类型的大小相同:4字节
不过,什么叫“变量的地址”?只要你是一直跟着我们的课程学习到这里,相信你能明白什 么叫变量的“地址”。否则,您可以需要从第一章从头看起了。 说到这里,我们其实一直在说的是“指针变量”,而不是“指针类型”。指针也需要类型, 它所存储的那个变量类型,就称为指针的类型。继续前面的比方,有一天我们去人民路 108 号, 今天纸条写着的地址是:“美眉街 8 号”,于是我们兴冲冲地去了……结果“美眉街 8 号”里 住着一头猪!是不是很失落——我们以为是“人类”,并且是“美眉”,未料却关着一头“猪 类”?! 计算机虽然不懂得什么叫“失落”,但为了它的准确性,我们需要事先定义好一个指针到底 是放的是什么类型的变量。这个类型通常也当作是该指针的类型。 “指针变量中存储某变量的地址”这种说法是不是有些绕?所以有一个简短的说法:“指针 指向某一变量”。 这种说法的缺陷是不能像第一种说法好样道出指针的本质。但它确实方便。下面我们将不 断的使用这两种说法,大家需要知道它们具有相同意义。 19.2 指针的大小 指针的大小是问:一个指针变量占用多少内存空间? 分析:既然指针只是要存储另一个变量的地址,。注意,是存放一变量的地址,而不是存放 一个变量本身,所以,不管指针指向什么类型的变量,它的大小总是固定的:只要能放得下一 个地址就行!(这是一间只有烟盒大小的“房间”,因为它只需要入一张与着地址的纸条)。 存放一个地址需要几个字节?答案是和一个 int 类型的大小相同:4 字节
所以,若有 nt* pInt char* pChar float* fLoat double* double 则: sizeof(pInt)、 sizeof( pChar)、 sizeof( pOol)、 sizeof( fLoat)、 sizeof( dOuble) 的值全部为:4。 (你敢拆电脑吗?拆开电脑,认得硬盘数据线吗?仔细数数那扁宽的数据线由几条细线组 成?答案:32条,正是4*8) 我们这一章有很多上机实验。这就算是第一个,只是我提供了代码:请写一个程序,验证上 面关于 sizeof(T*)的结论。在写程序之前,务必要先参考一下“数据结构”这一章中 sizeof 的例 19.3定义一个指针变量 数据类型*变量名 或 数据类型*变量名; 和申请一个普通变量相比,只是在数据类型后面多了一个星号。比如:
所以,若有: int* pInt; char* pChar; bool* pBool; float* pFloat; double* pDouble; 则: sizeof(pInt)、sizeof(pChar)、sizeof(pBool)、sizeof(pFloat)、sizeof(pDouble) 的值全部为:4。 (你敢拆电脑吗?拆开电脑,认得硬盘数据线吗?仔细数数那扁宽的数据线由几条细线组 成?答案:32 条,正是 4 * 8)。 我们这一章有很多上机实验。这就算是第一个,只是我提供了代码:请写一个程序,验证上 面关于 sizeof(T *)的结论。在写程序之前,务必要先参考一下“数据结构”这一章中 sizeof 的例子。 19.3 定义一个指针变量 数据类型* 变量名; 或: 数据类型 *变量名; 和申请一个普通变量相比,只是在数据类型后面多了一个星号。比如: int* p;