您的位置:首页 > 编程语言 > C语言/C++

C语言程序设计教程笔记_复杂数据类型_指针

2012-08-06 11:04 316 查看
指针是C的重要的数据类型,也是C的精华所在。利用指针能有效地表示复杂的数据结构,实现动态内存分配,更方便,灵活地使用数组,字符串及实现为函数间各类数据的传递提供简单便利的方法。正确而灵活的运用指针可以编写出简练紧凑,功能强而执行效率高的程序。

程序和数据在内存中的存储问题:程序要装如内存中才能运行,数据也要装入内存才能处理。内存是以字节为单位的连续的(线性的)存储空间。为了便于访问,给每个字节单元一个唯一的编号,从0开始,递增。这些编号称之为内存单元的地址,利用地址来访问内存单元。一个经典的比喻是:把内存比作一个大楼,房间比作内存单元,房牌号比作内存单元的地址。

变量分配存储空间的首字节地址作为变量的地址。地址就像访问存储单元的指示标,高级语言中称之为指针。在C中变量名和地址联系,编译系统会完成变量名到地址的转换。通过变量名访问内存值的方式为直接访问。通过定义一种特殊的变量来存储变量的地址,在根据此地址访问相应的内存值,这种访问方式即是简介访问。这种特殊变量就是指针类型的变量。

指针是一种特殊的数据类型。

指针与指针变量

概念

理解直接存储和间接存储的概念。

指针用来表示一个变量指向另一个变量的指向关系。

指针即地址,一个变量的指针即是该变量的地址。

定义与初始化

仍遵循先定义在引用的原则。

定义模式:数据类型标识符 * 指针变量名

如 : int *p;//定义了一个指向int类型变量的指针变量。

&取地址运算符

*指针运算符(或指向运算符,间接访问运算符)

Int a = 5;

Int *p = &a;

Scanf("%d",&a);

Scanf("%d",p);

Scanf("%d",&*p);//这3句话意思一样

运算

引用:两种:对指针变量本身的引用和通过指针对其所指向的变量进行引用。

赋值运算:

将变量地址赋给指针变量:int a,*p; p = &a;

相同类型的指针变量间的赋值:int *p1 = *a,*p2 = &b; p1 = p2;

赋空值:int *p = NULL;NULL是stdio.h中定义的常量。说明该指针不指向任何变量。

除了0之外不能赋常量给指针变量。

算数运算:

P+=n:向高地址方向移动n个存储单元

P-=n:...

P++/++p:...

P--/--p:...

关系运算:

同类型的指针变量可以进行关系运算。对于指向数组的指针变量,使用非常广泛。

多级指针

指针不仅可以指向基本数据类型,也可以指向指针变量。

定义模式:数据类型 **指针变量名

指针与函数

指针作参数

指针类型可以作为函数的参数。

实参可以是指针变量,也可以是地址值。

指针函数

返回值为指针类型的函数。

数据类型 *函数名(形参列表)

返回指针的函数是很有用的,函数库中很多都是返回指针,比如:strcat(),strcpy()。

指向函数的指针

变量与特定的存储单元联系,通过变量名可以得到变量的存储地址。一个函数包括一组指令序列,存储在某一段内存中,这段内存空间的地址称为函数的入口地址,通过函数名可以得到这一地址。故使用指针也可以间接访问函数。

定义指向函数的指针变量的模式:

类型标识符 (*指针变量名)();

C中函数名代表函数的地址(数组名也是代表数组的地址,数组名和函数名都是常量指针)所以,函数指针的赋值为:比如int max(int,int)为一函数,那么

Int (*p)(int,int);

P = max;

调用函数两种:

使用函数名(直接调用):a = max(m,b);

使用函数指针调用(间接调用)a = (*p)(m,b);

其调用模式为:(*函数指针变量)(实参类表)

理解:

函数指针的性质和数据指针的性质基本相同。不同的是数据指针指向内存中的数据区,而函数指针指向内存的程序代码区。因此对函数指针进行运算是没有意义的。

在C中,函数指针的意义在于实现函数的调用控制(选择性调用,就像面向对象语言中多态的概念)。当一个函数的形参是函数指针时,可以给指针赋予不同的函数地址入口,来实现运行不同的函数。

指针与数组

利用数组指针或者数组元素指针使用数组可以更加简便灵活。

指向一维数组的指针

C中a[i]用指针表示为:*(a+i)

访问数组的方法各有特点:

直接访问:直观

间接访问(指针访问):效率高,能直接根据指针变量的地址访问指向的数组元素,而直接访问是先转换为地址在根据地址访问数据。

注意:数组名是常量指针不能当作变量使用,比如a++,a=a+1;这种是不允许的。

使用指针访问数组不元素时注意指针当前值,特别是在循环控制结构中。

二维数组与多维数组的指针表示法

此处待续

指针与字符串

字符串的指针表示发法

字符串保存在字符数组中:char str [] = "hello world";且*(str+i)的值等于str[i];

指向字符串的指针是字符指针(注意:是字符指针而不是字符串指针),定义格式为char *变量名;

字符指针使字符串的操作变得简单方便灵活。C语言库函数中与字符串处理的函数大量使用了字符指针。

例:
Char *str = "computer";//和char str[] = "computer"很像但是意义却差的很远。

Printf("%s",str);

例中:字符指针str中存放的是字符常"computer"的首地址,指向的是字符常量"computer"的首字符。而不是把整个的字符串赋给
了str,虽然可以使用格式输入输出它。

字符串数组

此处待续

指针数组与命令行参数

此处待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: