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,虽然可以使用格式输入输出它。
字符串数组
此处待续
指针数组与命令行参数
此处待续
程序和数据在内存中的存储问题:程序要装如内存中才能运行,数据也要装入内存才能处理。内存是以字节为单位的连续的(线性的)存储空间。为了便于访问,给每个字节单元一个唯一的编号,从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,虽然可以使用格式输入输出它。
字符串数组
此处待续
指针数组与命令行参数
此处待续
相关文章推荐
- C语言程序设计教程笔记_复杂数据类型_数组
- Springmvc学习笔记(4)之复杂参数类型绑定、校验、数据回显和异常处理
- C基础语法(三)---复杂数据类型(指针)
- NuSOAP笔记:如何创建复杂数据类型
- CUBRID学习笔记 26 数据类型3cubrid教程
- 廖雪峰python3.6教程笔记3-Python基础之数据类型和变量
- C++基础教程 学习笔记(一) C++的数据类型和修饰符
- 黑马程序员——c语言的复杂数据类型:指针和结构体
- 黑马程序员——c语言的复杂数据类型:数组和指针
- Ferris教程学习笔记:js示例3.1 用typeof查看数据类型
- Delphi 2010学习笔记(13)---数据类型(指针)---2011-01-20
- 第八章 复杂数据类型与指针
- SSH笔记-类型转换器和错误信息显示、复杂属性、批量更新模型数据
- C笔记 数据类型 指针
- 复杂数据类型——指针
- 黑马程序员——C语言基础--复杂数据类型(指针&枚举&变量)
- opencl 初学笔记2- opencl快速入门教程【数据类型规范 , 命名原则】
- Apache CXF学习笔记二-复杂数据类型
- [C/C++]指针详解(1) — 复杂数据类型与指针
- 关于数据类型与指针的小笔记--初始化问题&&数组