C 语言指针实战:从入门到高级编程
C 语言指针易学且有趣。某些编程任务用指针更容易,动态内存分配等任务离不开指针。因此学习指针是成为合格 C 程序员的必要步骤。让我们循序渐进学习。
众所周知,每个变量都是内存位置,每个内存位置有其地址,可用取地址运算符 & 访问。下例打印变量地址:
Live Demo
#include <stdio.h> int main () { int var1; char var2[10]; printf("Address of var1 variable: %x\n", &var1 ); printf("Address of var2 variable: %x\n", &var2 ); return 0; }
编译执行输出:
Address of var1 variable: bff5a400 Address of var2 variable: bff5a3f6
什么是指针?
指针是一个变量,其值为另一变量的地址,即内存位置的直接地址。像任何变量或常量,使用前必须声明指针以存储变量地址。指针变量声明通用形式:
type *var-name;
type 为指针基类型,必须是有效 C 数据类型;var-name 为指针变量名。声明指针用的星号 * 与乘法星号相同,但此处用于指定变量为指针。合法指针声明示例:
int *ip; /* pointer to an integer */ double *dp; /* pointer to a double */ float *fp; /* pointer to a float */ char *ch /* pointer to a character */
所有指针值的实际数据类型相同,均为表示内存地址的长十六进制数。不同数据类型指针的唯一区别在于指针指向的变量或常量的数据类型。
如何使用指针?
指针常用操作:(a) 定义指针变量,(b) 将变量地址赋给指针,(c) 通过指针访问地址处的值。使用一元运算符 * 返回操作数指定地址处变量的值。下例演示这些操作:
Live Demo
#include <stdio.h> int main () { int var = 20; /* actual variable declaration */ int *ip; /* pointer variable declaration */ ip = &var; /* store address of var in pointer variable*/ printf("Address of var variable: %x\n", &var ); /* address stored in pointer variable */ printf("Address stored in ip variable: %x\n", ip ); /* access the value using the pointer */ printf("Value of *ip variable: %d\n", *ip ); return 0; }
编译执行输出:
Address of var variable: bffd8b3c Address stored in ip variable: bffd8b3c Value of *ip variable: 20
空指针
良好实践是声明指针变量时若无确切地址则赋 NULL 值。赋 NULL 的指针称为空指针。
NULL 指针是多个标准库中定义的值为零的常量。示例:
Live Demo
#include <stdio.h> int main () { int *ptr = NULL; printf("The value of ptr is : %x\n", ptr ); return 0; }
编译执行输出:
The value of ptr is 0
大多数操作系统不允许程序访问地址 0 的内存,因该内存由 OS 保留。但地址 0 有特殊含义:指针不指向可访问内存位置。约定俗成地,指针包含零值即假定指向空。
检查空指针可用 if 语句:
if(ptr) /* succeeds if p is not null */ if(!ptr) /* succeeds if p is null */
指针进阶
指针概念虽多但易懂,对 C 编程至关重要。以下重要指针概念 C 程序员应掌握:
| 序号 | 概念及说明 |
|---|---|
| 1 | 指针算术 指针可用四种算术运算符:++、--、+、- |
| 2 | 指针数组 可定义数组存放多个指针。 |
| 3 | 指向指针的指针 C 允许指针指向指针,以此类推。 |
| 4 | 向函数传递指针 按引用或地址传递参数,使被调函数能修改调用函数中的实参。 |
| 5 | 从函数返回指针 C 允许函数返回指向局部变量、静态变量或动态分配内存的指针。 |
C语言