C语言——指针(simple)
莆田学院计算机教研室 2003年5月 指 针 绍兴文理学院自动化教研室 2011年4月 本讲主要内容 指针概述 地址· 指针· 指针变量 指针变量作为函数参数 指针与数组 数组、指针与函数调用 行指针 指针与函数 返回指针值的函数 一、指针概述 1.地址(address) P219 如果在程序中定义了一个“实体”(变量、数组、函数 ……),编译时系统就要给这些实体分配内存单元。 分配规则: 什么是内存单元“地址”? 内存单元是以字节为单位,每个字节都有一个编号(即“地址”)。 每个“实体”占用的内存单元是不同的。如: char a;int b;float c;int d[3];int max( ) 内存单元与地址 如何表示实体地址? 实体地址表示法 普通变量a,b,c —— &a,&b,&c 数组d[3] —— d(数组名), &d[0],&d[1],&d[2] 对二维数组,可用单下标法表示每行首地址。 如 对char x[3][4],可用x[0]、x[1]、x[2]分别表示其第一、二、三行的首地址。 函数max( ) —— max(函数名) “入口地址” & 取地址运算符(适用于普通变量或数组元素) 2.指针(pointer) 实体地址的一种表示法(便于编程处理)。 指针是一种特殊的数据类型——存放的是某个实体的地址值。 3.指针变量 P221 存放“指针”(地址值)的特殊变量。 定义方法: 类型标识符 *变量名 如 int *a; char *b; float *c; 为什么要使用指针变量? C程序中访问(读写)变量有两种方式: 直接访问 (按名单预留的座位入座) 利用实体名访问变量。访问变量的过程—— 变量(实体)名→定义时分配的地址→变量值 好比“先坐再买票”看电影:来一个观众,分配一个空位给他去坐,并且还要在纸上记一个某人坐在哪里。这种方式对用户来说很方便(“直接就座”),但对系统来说,“找某人”就极不方便(间接:查名字→座号)。 间接访问 (先买票,后按号入座) 把变量地址先存放在“指针”中,再通过“指针”访问变量。 好比先买票(票—指针,座号—地址),再“按号入座”看电影。这种方式对用户来说属于“间接就座”,便对系统查找来说就很直接,且便于处理。尤其对于数组(团体),可通过指针简单自加或自减,对整个数组进行处理。 指针变量——不要谈”指”色变 指针是C语言学习中的一大难点。 难——难在概念。 首先——搞定*p 请看以下变量声明语句 int a,*p1; char b,*p2; a,b 普通变量(存放某个数值或字符) p1,p2 指针变量(存放某个实体的地址) 注意——不同的*p 以下程序中哪些语句是错误的? main() { int a,*p; a=3; p=3; /*或者 p=a;*/ p=&a; *p=a; /*或者*p=3*/ } 有关*p的小结 变量定义时,*p表示定义了一个用来存放变量地址而非数据(数值、字符等)的指针变量。 程序中引用时,*p表示取指针变量p所指变量的值。 *p——并非就这么简单 *p的含义与p所指的对象有关 如果p被定义成指向普通变量的指针变量,则*p代表该变量的值。 如 int *p,a=5; p=&a; 则*p代表变量a的值(5)。 如果p被定义成指向某个数组的指针变量,则*p代表该数组中某个元素的值。 如 int *p, a[3]={1,2,3}; p=a; 则*p代表数组a中某个元素。 看看两个例子 #include main() { int a,b=10,*p; system("cls"); p=&b; a=*p+3; printf("a=%d,b=%d\n",a,b); } main() { int *p,a[12]={1,2,3,4,5}; clrscr(); p=a; for ( ;*p<5;p++) printf("%d",*p); } p指向字符数组时的*p 如果p被定义成指向某个字符数组或某个字