指针是C语言最重要的特性之一,
也是最容易被误解的特性之一。
现代计算机把内存分割为字节(Byte),
每个字节都有唯一的地址(Address),
如果内存中有n个字节,可以把地址看做0~n-1的数。
程序中的每个变量都占据字节(至少1字节),把第一个字节的地址称为”变量的地址”,
假设变量int i占有内存2000~2003,则变量i的地址是2000。
口诀:
变量有位置,位置有地址
指针是变量,其值为地址
指针就是地址,指针变量就是存储地址的变量。
C语言要求每个指针变量只能指向一种特定的类型的对象。
int *p; double *q; char *r;
指针变量的赋值:
int i=2099; int* p; P = &i; printf("%d", *p);
&取地址运算符
*间接寻址运算符
下例中:
i是普通变量,&i是存储变量的地址
p是指针,是地址,*p是指针指向地址的值
#include <stdio.h> main() { int i=2099; printf("变量的值:%d\n", i ); printf("变量的地址:%x\n", &i ); int *p; p = &i; printf("指针(值):%d\n", *p ); printf("指针(地址):%x\n", p ); }
在变量声明时,如果没有确切的地址可赋值,为指针变量赋一个NULL值是一个良好的编程习惯。
赋为NULL值的指针称为“空指针”。
#include <stdio.h> int main(int argc, char *argv[]) { int *ptr = NULL; printf("ptr的值是:char=%x, int=%d\n",ptr,ptr); return 0; }
运行结果:
ptr的值是:char=0, int=0