返回介绍

6.9 本章小结

发布于 2025-04-11 22:33:02 字数 2780 浏览 0 评论 0 收藏 0

C 语言中,指针的实质就是内存地址。

将计算机中的内存,以字节为单位逐一地编上号码,这些号码就是内存的地址,可以使用取地址运算符“&”来获取一个对象的内存地址。

可以使用解引用运算符“*”,通过指针访问到它所指向的对象。所以,解引用是与取地址相逆的操作。

可以将内存地址看成是一个指针常量;而指针变量是存储内存地址的变量。指针只是逻辑思维中的概念,物理上并不存在。只要得到对象的内存地址,或把对象的内存地址存储到指针变量中,就得到了一个指向对象的指针。使用者需要根据语境和上下文的不同,对描述中的指针一词进行区分,理解其表示的真正含义。

在定义指针变量时,星号只是起标记的作用,并非解引用运算符。指针变量的数据类型是在使用指针时,用来确定所访问对象的内存大小和数据格式的。

可以通过取地址运算符来获取一个对象的内存地址,并将其初始化或赋值给一个指针变量进行存储。其中对象的数据类型应该与指针变量的数据类型相匹配。

对指针进行解引用后,即可访问到所指向的对象,可以像使用变量名一样来访问或修改对象的数据。

指针变量的大小就是指针变量本身所占用的内存空间字节数,和定义指针变量时所指定的数据类型无关。即无论何种类型的指针变量,它的内存大小总是固定的。

在定义指针变量时,如果在星号前面加上“const”关键字,就会将指针修饰为常量指针。const 修饰的是指针,而非指针变量,因此,对指针所指向的对象只可访问,不可修改,即不能通过指针去修改对象的数据;而指针变量本身是可访问、可修改的。

在指针变量定义时,在星号之后,变量名之前使用了 const 关键字,则会定义出指针常量。const 修饰的是指针变量,而非指针,因此,对指针变量本身来说,它从变量变成了常量,因此,只可访问,不可修改;而通过指针对其所指向的对象数据是可访问、可修改的。

在定义指针变量时,如果在星号的前后都使用了 const 关键字,则会定义出指向常量的指针常量。即指针和指针变量都被 const 修饰,不仅不能通过指针来修改它所指向的对象,连指针变量自身的值也不允许被修改。

通过 const 修饰变量时,仅仅是修饰变量名,即限制了变量名的修改权限,而并非将变量的值修饰为只读。C 语言中,只有常量才是值具有只读权限,所以只读变量并非常量。

C 语言中,数组名即表示第一个数组元素的内存地址,我们可以把数组名看作指向数组首元素的指针。但数组名不同于指针变量,原因是指针变量可以改变其值,即存储不同的内存地址;而数组名永远只能表示为数组首元素的内存地址,不能被改变。

通过指针的移动,可以遍历数组所有元素。所谓指针的移动,实质是对指针变量所存储的地址值进行修改的行为,可以通过对指针变量进行自增或自减的运算,来达到指针的移动效果。

可以将一个指针与整数值进行算术运算,运算的结果会产生一个新的指针,新指针所对应的内存地址为:原内存地址+整数值*指针的数据类型大小。

可以通过指向同一数组内元素的两个指针之间的算术运算,来获得彼此之间的位置间隔信息。

可以使用关系运算符来对指向同一数组内元素的指针进行关系运算,通过内存地址的比较,来获取彼此所指向的数组元素的先后位置信息。

所谓指针数组,即元素都为同一指针类型的数组。所谓数组指针,就是能够指向一个数组的指针,即将整个数组作为指针所指向的对象。

可以使用指针变量来存储一个字符串常量的首地址,即字符串第一个字符的内存地址。由于字符串常量不允许被修改,因此,在定义指针变量时,应该通过 const 将其修饰为常量指针。程序中若有多个字符串常量,可以使用指针数组来进行存储。

要时刻注意,单凭一个字符类型的指针是无法断定它所指向的到底是一个字符还是一个字符串的。也许字符指针只是指向一个字符的,也许字符指针指向的是一个字符串。而对于指向字符串的字符指针,既可以用字符的方式来访问,也可以用字符串的方式来访问。但对于仅是指向单字符的字符指针,不要用字符串的方式来访问,否则就会出现乱码字符。

由于字符串常量不可被修改,因此,经常会将字符串存储在字符数组中,以方便对字符串进行更好的处理。而如果有多个字符串,通常会使用二维的字符数组来进行存储,即用二维数组的一行存储一个字符串。

C 语言中,允许将指针作为函数的参数,从而达到通过指针类型的形参来间接地影响实参的目的。还可以让函数返回一个指针,即函数的返回值为指针类型。

C 语言中,可以将函数的名字看成是指向其所在内存位置的指针。因此,可以定义一个能保存函数内存地址的指针变量,并将其值初始化或赋值为某个函数的内存地址,而后就可以通过这个指针来进行函数的调用,即函数指针就是能够指向一个函数的指针。使用函数指针的好处是,可以增加函数的灵活性,在函数体代码不改变的情况下,能够根据函数指针所指向函数的不同,展现出截然不同的效果。

二级指针就是指针的指针,即指针所指向的对象又是另外一个指针。对二级指针解引用一次,只能访问到其指向的指针,解引用两次才能访问到最终的对象。

由于指针数组都是指针类型的元素,而数组名又代表其首元素的内存地址,因此,指针数组的数组名其实就是一个二级指针。

main 函数可以有参数,而且是两个。第一个参数类型为 int,通常名字写为 argc,第二个参数类型为 char**,即字符类型的二级指针,通常名字写为 argv。也可以将第二个参数类型写为字符指针数组的,即“char* 变量名[]”,但函数的形参即使定义为数组类型,其实质仍是一个指针类型的参数。

main 函数可以接收用户在执行程序时所输入的参数,这些参数都是以字符串的形式进行传递,如果想得到整数类型的参数,需要手工去进行转换。

C 语言中,可以将一个指针初始化或赋值为一个空指针。

所谓空指针,就是不指向任何对象的指针。将“NULL”或者“0”作为值初始化或者赋值给指针变量,即可将指针设置为空指针。

C 语言允许定义出 void 类型的指针,任何类型的指针都可以被隐式地转换为 void 类型的指针。因此,它通常作为函数的参数出现。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。