从零开始学C语言系列之第七章《指针简介》

往期回顾

1.【第一章】《认识C语言》
2.【第二章】C语言概述及基本知识1
3.【第二章】C语言概述及基本知识2
4.【第三章】字符串和格式化输入/ 输出
5.【第三章】 printf
6.【第三章】 scanf
7.【第三章】 putchar
8.【第三章】 getchar
9.【第三章】 sizeof
10.【第三章】 strlen
11.【第三章】 define
12.【第四章】运算符第一节
13.【第四章】运算符第二节
14.【第四章】运算符第三节
15.【第四章】运算符第四节
16.【第四章】类型转换
17.【第四章】函数与转化
18.【第五章】while
19.【第五章】for开篇
20.【第五章】for的灵活性
21.【第五章】逗号运算符
22.【第五章】do while
23.【第五章】循环选择
24.【第六章】if
25.【第六章】else if
26.【第六章】break
27.【第六章】continue
28.【第六章】break和continue的区别与作用
28.【第六章】switch
29.【第七章】函数复习
30.【第七章】函数参数
31.【第七章】函数中返回值
32.【第七章】递归
33.【第七章】指针引入


文章目录


指针?什么是指针?从根本上看,指针是一个值为内存地址的变量(或数据对象)

​   正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值是地址。在语言中,指针有许多用法。

运算符

查找地址:&运算符

​   指针 是语言最重要的(有时也是最复杂的)概念之一,用于储存变量的地址

​   前面使用的 scanf()函数中就使用地址作为参数。概括地说,如果主调函数不使用return 返回的值,则必须通过地址才能修改主调函数中的值。接下来,我们将介绍带地址参数的函数。首先介绍一元&运算符的用法。

​   取值运算符& 是用来取得其操作对象的地址。如果操作对象x的类型为T,则表达式&x的类型是T类型指针(指向T类型对象 x的指针)。

​   取值运算符的操作对象必须是在内存中可寻址到的地址。换句话说,该运算符只能用于函数或对象(左值),而不可用于位字段,以及哪些还未被存储类修饰符register声明的内容。

​   当需要初始化指针,以指向某些对象或函数时,需要获得这些对象或函数的地址:

c 复制代码
float x, *ptr;
ptr = &x;  // 合法,使得指针ptr指向x
ptr = &(x+1);  // 错误,(x+1)不是一个左值

​   一元&运算符给出变量的存储地址。如果pooh是变量名,那么&pooh 是变量的地址。可以把地址看作是变量在内存中的位置。假设有下面的代码:

​   将输出如下内容(%p是输出地址的转换说明):

c 复制代码
#include <stdio.h>
void mikado(int);                 
int main(void)
{
    int pooh = 2, bah = 5;         
    
    printf("In main(), pooh = %d and &pooh = %p\n",
           pooh, &pooh);
    printf("In main(), bah = %d and &bah = %p\n",
           bah, &bah);
    mikado(pooh);
    
    return 0;
}

void mikado(int bah)                 
{
    int pooh = 10;                    
    
    printf("In mikado(), pooh = %d and &pooh = %p\n",
           pooh, &pooh);
    printf("In mikado(), bah = %d and &bah = %p\n",
           bah, &bah);
}

在C语言中,该例的输出说明了什么?首先,两个 pooh 的地址不同,两个 bah 的地址也不同。因此,和前面介绍的一样,计算机把它们看成4个独立的变量。其次,函数调用 mikado(pooh)把实际参数(main()中的pooh)的值(2)传递给形式参数(mikado()中的bah)。

​   注意,这种传递只传递了值。涉及的两个变量(main()中的pooh和mikado()中的bah)并未改变。

间接运算符 *

​   与取址运算符& 相反,间接运算符* 用于当已经具有一个指针,并希望获取它所引用的对象时,因此也被称为解引用运算符。

它的操作对象必须是指针类型。如果ptr是指针,那么 *ptr就是ptr所指向的对象或函数。如果ptr是一个对象指针,那么 *ptr就是一个左值,可以把它即( *ptr)当做赋值运算符左边的操作数:

c 复制代码
float x, *ptr = &x;
*ptr = 1.7;  // 将1.7赋值给变量x
++(*ptr);  // 并将变量x的值加1
相关推荐
Jack_David2 分钟前
Java如何生成Jwt之使用Hutool实现Jwt
java·开发语言·jwt
瑞雪兆丰年兮4 分钟前
[从0开始学Java|第六天]Java方法
java·开发语言
BackCatK Chen11 分钟前
第 1 篇:软件视角扫盲|TMC2240 软件核心特性 + 学习路径(附工具清单)
c语言·stm32·单片机·学习·电机驱动·保姆级教程·tmc2240
修己xj12 分钟前
FossFLOW:开源等距图表工具,为技术文档注入立体活力!
开源
兆龙电子单片机设计12 分钟前
【STM32项目开源】STM32单片机多功能电子秤
stm32·单片机·开源·毕业设计·智能家居
u01092727119 分钟前
模板编译期排序算法
开发语言·c++·算法
datalover25 分钟前
CompletableFuture 使用示例
java·开发语言
向哆哆26 分钟前
高校四六级报名管理系统的考试信息模块实现:Flutter × OpenHarmony 跨端开发实践
flutter·开源·鸿蒙·openharmony·开源鸿蒙
测试者家园27 分钟前
测试用例智能生成:是效率革命,还是“垃圾进,垃圾出”的新挑战?
人工智能·职场和发展·测试用例·测试策略·质量效能·智能化测试·用例设计
m0_6860416134 分钟前
C++中的适配器模式变体
开发语言·c++·算法