C语言指针详解:从取地址到指针应用

需积分: 22 9 下载量 197 浏览量 更新于2024-07-18 2 收藏 337KB PDF 举报
"C语言指针教学" C语言中的指针是一种强大的工具,它允许程序员直接操作内存地址,实现高效的数据处理和复杂的程序设计。指针是C语言的关键特性之一,理解并熟练掌握指针对于深入学习C语言至关重要。 9.1-1 取地址运算 在C语言中,`&`运算符用于获取变量的内存地址。例如,`&i`会返回变量`i`的地址。`printf("%x", &i)`或`printf("%p", &i)`可以打印出这个地址,其中`%p`是用于打印指针的格式化字符串。需要注意的是,地址的大小取决于编译器和系统平台。`&`不能对不存在或者未定义的对象取地址,比如`&(a+b)`、`&(a++)`和`&(++a)`都是非法的操作,因为它们不是变量。 9.1-2 指针及其运算 指针是一个变量,它的值是另一个变量的内存地址。声明一个指针变量如`int *p = &i;`,`p`现在保存了`i`的地址。指针可以被用作函数参数,这样函数内部可以通过指针访问外部的变量,如`void f(int *p);`,在调用`f(&i);`时,`i`的地址被传递给`f`函数,`f`可以修改`i`的值通过`*p`进行访问。 指针的解引用运算符`*`用于访问指针指向的变量。`*p`表示获取`p`所存储地址上的值。它可以作为左值(可以出现在赋值号的左边)和右值(可以出现在赋值号的右边)。例如,`int k = *p;`和`*p = k + 1;`分别用于赋值和改变指针所指向的变量的值。 指针的运算符`&`和`*`是互逆的。`&*`组合用于获取指针本身的地址,而`*&`则用于解引用并获取指针变量的值。这种操作在处理复杂数据结构如结构体和联合体时尤其有用。 传入地址的原因在于,C语言不支持直接将值传递给函数,而是通过值的副本传递。如果要改变函数外部的变量,就需要传递该变量的地址。例如,`scanf("%d", i);`试图直接对`i`赋值,这在C语言中是不允许的,应该改为`scanf("%d", &i);`。 指针的应用场景: 1. 交换两个变量的值:通过指针,可以不借助临时变量实现两个变量值的交换。 2. 函数返回多个值:如果一个函数需要返回多个结果,可以通过指针参数返回额外的值,或者返回一个包含多个元素的结构体或数组的指针。 3. 函数返回运算状态和结果:函数可能需要返回执行状态(如成功或失败),同时通过指针参数返回计算结果。 了解并掌握这些基本的指针概念和操作,将有助于提升C语言编程的技能,并能够编写更高效、功能更丰富的程序。在实际编程中,还需要注意指针的类型匹配、指针的动态分配和释放以及避免空指针引用等高级主题。