欢迎来到论文网! 识人者智,自知者明,通过生日认识自己! 生日公历:
网站地图 | Tags标签 | RSS
论文网 论文网8200余万篇毕业论文、各种论文格式和论文范文以及9千多种期刊杂志的论文征稿及论文投稿信息,是论文写作、论文投稿和论文发表的论文参考网站,也是科研人员论文检测和发表论文的理想平台。lunwenf@yeah.net。
您当前的位置:首页 > 毕业论文 > 计算机毕业论文

C语言指针在数组和函数中的应用与常见错误解析_杂志网

时间:2012-06-20  作者:涂承胜

论文导读::语言中存储空间的地址简称为指针。用scanf、puts函数输入数据时。
论文关键词:C语言,指针及应用,指针与数组,函数,实例解析
 

一、指针的有关概念

1、指针的概念与实质

数据在计算机中存储时都占用一定大小的存储空间,每个存储空间对应一个地址编号,计算机通过该编号找到存储空间以访问其中的内容。C语言中存储空间的地址简称为指针,指针的实质就是某个存储空间的地址(编号)。指针和该指针所指向的存储空间中的内容是有本质区别的。

2、变量的指针、指针变量与指向的概念

在C语言中,变量所占用的内存单元的地址就称之为该变量的指针。变量有三要素:名称、数据类型、当前值。指针变量就是存放指针值的变量。即指针变量所在的空间存储的是另外一个存储空间的地址,而非一般数据。变量名表示了存储空间的名称及其中的值并参与相关运算。

指针变量的定义格式为:数据类型 *变量名称;

指针是C语言的特殊数据类型。定义时,变量名前面的“*”表示该变量属于指针变量,“数据类型”表示指针变量所指向的存储空间中存放的数据本身的类型。指针本身的类型和指针所指向的空间中的数据类型是有区别的。例如杂志网,int *p;指针变量p的类型就是int*, 而p所指向的目标的类型是int;当指针变量存储了另外一个同“数据类型”的一般变量的地址时,称该指针变量“指向”了该变量。为了便于理解,被“指向”的变量通常称之为“目标变量”。指针变量只能指向定义时“数据类型”所标识的数据类型的目标变量。例如:int a=10,*p=&a;。

3、一维数组的指针与指向一维数组的指针变量

一维数组是同类变量的有限集合,各元素占用连续的存储单元。因此,一维数组的指针分为首指针(入口地址)和元素指针。首指针就是该集合中第一个元素所在空间的指针,可用数组名直接表示之。数组的任何一个元素相当于同类的简单变量,元素的指针有两个表示形式:

⑴绝对地址,用求地址运算符&直接求得,格式为:&数组名[n]。(0≤n<元素的个数)

⑵相对地址,是相对于数组首地址的偏移量,表示为:数组名+n。(0≤n<元素的个数)

指针变量可指向同“数据类型”的任意目标变量或同“数据类型”任何数组元素。

4、二维数组的行指针和列指针与指向二维数组的指针变量

二维数组可看着多个一维数组的集合。计算机中二维数组是按行存放的(元素的存储单元地址是连续的),所以也可以把二维数组看成是特殊的一维数组。二维数组的指针分为行指针和列指针。为了便于理解,可以形象的将二维数组理解为具有行列结构的二维表。二维数组的每一行都有一个行指针。每一行相当于一个同类的一维数组,每行的元素也有各自的指针,简称为列指针。二维数组的行指针、列指针、元素的指针可表示如下(便于描述,设有定义:int a[M][N]):

⑴行指针:a+n杂志网,(0≤n<M,M为行数),n=0时表示第一行的行指针,依次类推。

⑵列指针:*a+n或a[0]+n,(0≤n<M*N,N为列数),n=0时表示第一个元素的指针,n=1时表示第二个元素的指针,依次类推,数组所有元素的地址成线性关系。列指针即元素的指针。

⑶第m行第n列元素的指针:a[m]+n或&a[m][n]或*(a+m)+n,(0≤m<M,0≤n<N)。

指向列指针(或元素)的指针变量和指向一般同类变量或一维数组元素的指针变量一样。指向二维数组的行指针的指针变量,称之为行指针变量,有别于列指针变量。行指针变量定义格式为:

数据类型 (*变量名)[N];/*小括号()、*、方括号[]都是不能省略的,N为元素的个数*/

例如:int (*p)[6];表示指针变量p只能指向每行有6个元素的二维整型数组的行指针。

5、指针变量的指针、二重指针变量与指针数组

指针变量所占存储空间的地址就是指针变量的指针,简称为指针的指针;存储指针变量的指针的变量称之为二重指针变量;其元素值为指针的数组称之为指针数组。指针数组的数组名也是二重指针。例如:int k,*p,**q,*a[10];则可以q=a;或者q=&a[k];p=a[k](0≤k<10)。

二、指针的有关运算及其应用与常见错误

1、指针的取地址&、赋值运算符“=”和取内容运算符“*”运算及应用中的常见错误

⑴取地址运算符&,只能用于求变量或数组元素或结构体、共同体变量成员等的地址。用scanf、puts函数输入数据时,输入项须是指针,printf输出字符串时杂志网,输出项也是指针。输入输出时,要注意指针的类型与格式控制符的类型及其对应关系。&不能求常量、表达式或函数的指针。

例如:int a,k=0,*p=&a; char s[10],ch; char v[3][10];

scanf('%d',p);scanf('%d',&a);scanf('%s',s);puts(s);while(k<3)scanf('%s',v[k]);是对的;

scanf('%d',&p); scanf('%d',*p);scanf('%d',a);while(k<3)scanf('%s',v+k);是错误的。不能从键盘动态给指针变量赋值。输入输出函数中,指针项都应该是列指针;指针指向的对象要与函数中格式控制符指代的对象一致。如scanf(' %c',s);scanf(' %s',&ch);连续两个输入语句,输入项都是指针s、&ch,语法上能通过编译,但得不到正确的输出结果。s是数组名表示字符串的首地址,&ch是单个变量ch的指针,格式控制符与指针项指代的对象不匹配。

⑵赋值运算符“=”和取内容运算符“*”。只能将指针变量定义时“数据类型”标识的变量的指针赋值给指针变量,不能是变量值或常量值。取内容运算*求取指针指向的对象的值,但并非都能正确得到指针指向的目标的值。例如:int a=10,*r,*p,*q; float x=20,*y;

r=&a;/*正确的指针赋值,通过r能够正确得到r指向的目标变量a的值*/

p=(int *)(5); /*语法上能通过编译,p不能被正确赋值指针,通过p不能得到5的值*/

q=(int *)&x; /*能通过编译,强制丢转化丢失了x的实际地址,通过q不能正确得到x的值*/

y=&x; /*正确的指针赋值,通过y能够正确得到所指向的目标变量x的值*/

sizeof(r),sizeof(p),sizeof(q),sizeof(y))的值是一样的。指向任何数据类型的指针变量所占空间的大小是相同的,但指针变量只能指向定义时“数据类型”标识的变量或数组元素或成员的地址。

2、指针的++、--、加减运算、比较运算在数组、函数中的应用

指向简单变量或结构体变量的指针实施++、--、算术和比较运算一般是没有实际意义的。不正确的指针运算或操作甚至可能导致严重后果。本实例用冒泡排序法杂志网,对二维数组每行的元素值从大到小排序。所有函数中,循环的控制及数组元素的表示等都是通过指针及有关运算实现的,见图1。本实例演绎和解析了指针在数组、函数中的具体应用及方法与技巧。

指针及应用比较思路:比较若干轮,每轮用“第一个元素”与“其余元素”比较(可能交换)。每轮找到一个最大元素值,放在每一轮的第一个元素中。用一个指针指向每一轮的第一个元素,用一个指针指向每轮的其余元素。充分的应用了指针及指针的有关运算。代码如下:

#include'stdio.h'

#include'stdlib.h'

#include'time.h'

#define M10 /*二维数组的行数*/

#define N10 /*二维数组的列数*/

void swap(int*p,int *q){int x; x=*p,*p=*q,*q=x;}

void sort(int*r) { int *p,*q; /*r接收二维数组a各行的列指针*/

for(p=r;p<r+N-1;p++)/*p指向每轮中的第一个元素,p++使指针p指向下一轮的首元素*/

for(q=p+1;q<r+N;q++) /*q指向每一轮中的其余元素,q++使q指其余元素的下一个元素*/

if(*p<*q) swap(p,q);/*p、q指向的元素的指针作为参数,交换p、q指向的元素值*p、*q*/

}

void init(ints[][N],int *b[]) /*二维数组名s和指针数组名b作为函数的形参指针变量*/

{ int(*t)[N],*r,**u; /*行指针变量t、s,一重指针变量r,二重指针变量u、b*/

srand((unsignedint)time(NULL)); /*使每次生成的随机数不一样*/

for(u=b,t=s;t<s+M;t++,u++)/*开始t、s指向数组a首行的行指针,u指向数组b的首地址*/

for(*u=r=*t;r<*t+N;r++)*r=rand()%100+1,printf('%5d%c',*r,r==(*t+N-1)?' ':32);

}

void out(int *r){/*r指针变量接收了实参指针指向的二维数组的起始行的列指针a[0]*/

int *q=r;printf(' '); for(;q<r+M*N;q++) printf('%5d[%p] %c',*q,q,(q-r+1)%N?32:' ');

printf(' totals:%5d ',q-r); } /*指向同一数组的两个指针相减得到指针之间元素的个数*/

void main()

{ inta[M][N],*b[M],**u; /*定义了二维数组a(共M行,每行N列)、指针数组b(M个元素)*/

init(a,b); /*数组名a、b作为实参指针,函数对数组a、b的元素进行初始化,并返回结果*/

for(u=b;u<b+N;u++)sort(*u); /*u指向数组b,b中各元素存储了二维数组a每行的列指针*/

out(a[0]); /*a[0]为二维数组a的首行首列的指针,行指针a转化为列指针a[0]或*a*/ }

指针的应用及其程序解析:

⑴指针作为函数的实参和形参。函数main中,数组名a(行指针)、数组名b(二重指针)作为函数init(a,b)的实参,传址给init函数对应的形参指针变量s和b。for(u=b;u<b+N;u++) sort(*u)中,二重指针变量u开始指向数组b的首指针(即b中的首元素),*u为u所指元素的值,即该元素所指向的二维数组a对应行的首列指针杂志网,作为函数sort(*u)的实参,传址给sort的形参指针变量r。数组a的入口列指针a[0](或*a)作为函数out(a[0])的实参,传址给out对应的实参指针变量r。函数swap(int *p,int *q)指针作为形参,通过指针p、q交换了对应的实参指针p、q指向的元素的值。

 

查看相关论文专题
加入收藏  打印本文
上一篇论文:六子棋——人工智能系统的设计与研究_Java
下一篇论文:ESB在数字校园数据整合中的应用与实践*_论文的格式
毕业论文分类
行政管理毕业论文 工商管理毕业论文
护理毕业论文 会计毕业论文
会计专业毕业论文 英语专业毕业论文
大学毕业论文 硕士毕业论文
计算机毕业论文 市场营销毕业论文
物流管理毕业论文 法学毕业论文
相关计算机毕业论文
最新计算机毕业论文
读者推荐的计算机毕业论文