c语言指针十篇

时间:2023-04-03 09:59:48

c语言指针

c语言指针篇1

指针是C语言的一个最重要的特征,它提供了一种统一的方法,使其能访问远程的数据结构。但对C语言初学者而言,在编程过程中熟练的使用指针并不能像使用int型变量一样地轻松愉快,容易上手,往往是不得其精髓。我们知道,不论什么时候,运行一个程序A,首先都是操作系统自身的加载器把A装入内存,然后CPU才能执行。所以A程序的所有要素都会驻留在内存的某个位置。

下面我们看一段示例程序。

#include

intcmp(int first, int second)

{

return ( first > second ? first : second );

}

int main(intargc, char **argv)

{

inti = 5;

int j = 9;

returncmp(i, j);

}

首先,编译器会为变量i和j开辟内存空间,用来存储i和j的值。同时也会为函数cmp开辟空间来存放其代码。这样使得最终的可执行程序就变为了跟内存一一对应的序列。操作系统的加载器把这个可执行程序载入内存后,cpu就可以按一条条的语句顺序执行了。

既然内存空间同程序的所有要素是一一对应的,那么怎么区分各要素的存放位置呢?内存使用不同的地址存放不同的要素,如下所示。

由于变量都存放于内存地址空间,并且与地址之间是一一对应的,那么利用地址能做些什么呢?我们可以把地址存放到别的变量中,以便我们可以在以后程序的某个地方使用它。C语言有一个专门用来存储内存地址的变量,这就是指针变量,通常我们称之为指针(pointer)。它是一种变量类型,这种变量方便我们把需要操控的内存地址记忆起来。

定义指针

定义指针的运算符同乘法运算符是一样的,都用“*”表示。定义一个指针变量在语法上是简单的,同我们定义其他变量的区别是:首先规定它指向的变量类型,然后并不是立即就给出其变量的标识符,而是在变量类型同变量标识符之间插入指针运算符(星号),这样就告诉编译器这是一个指针变量。

C语言中指针可以指向任何的数据类型,包括函数。函数指针的定义是:函数返回值+(* + 函数指针变量标识符)+(函数的参数列表)。函数指针能构建出更加清晰的程序结构。编程中经常使用的指针定义就是这两种,当然有些定义可能只是语法上面有意义,但是语义上面不一定有具体的意义。例如,int *(*(*(*f)())[])()声明f是一个函数指针,该函数返回一个指针,该指针指向数组,该数组元素是指针,那些指针指向返回值类型为整型指针的函数。这样的声明可能永远也不能应用到实际的代码中。

指针和数组

数组是内存中一段连续相同类型的内存数据,这组数据的首地址以数组名字来标识。所有数组对其数据的操控都可以使用指针来实现,同理,指针指向一段内存数据时,也可以使用数组下标的方式来实现操作。

数组与指针在使用上的某些地方是非常相似的,但是数组与指针又有一些细小的区别。数组名表现为一个静态指针,也可以直接把它赋值给指针变量,但它的大小与指针通常是不同的。数组名的内涵在于其指代的实体是一种数据结构,这种数据结构就是数组。数组名可以作为参数传入一个接受参数为指针的函数内部,但是此时数组完全丢失了数组的本义,变成了完全的指针类型,其常量特性(可以作自增、自减等操作)可以被修改。并且,数组名不能再重新赋值为其他的数组名字,而指针变量是可以被重新赋值并指向一段新的内存地址的。

指针的运算

指针的运算指的是指针的--、++、-和+运算,一个指针可以加上或者减去一个整数。两个指针相减得到的是指针之间相隔的元素个数。不同的指针变量之间进行相加运算尽管在语法上是合理的,但是从语义上来讲是没有意义的。除了void型指针和函数指针以外,所有其他类型的指针都可以进行指针运算。通过指针变量的增加或减少,指针变量会指向新的内存地址。

一般来说,指针变量自身的大小在理论上是指机器的字长,但是指针变量的运算并不是按照指针变量自身的大小进行内存偏移的,而是按照指针变量指向的变量类型大小进行内存偏移的。比如,声明一个整形的指针p,假定p的地址是0x4323672,那么++p后p的值变为0x43236726。偏移的内存大小等于整形变量的内存大小4(sizeof(int))。同理,double型指针进行++运算后偏移值就是8(sizeof(double))。

指针强转

如同整形变量可以强转为浮点型变量一样,指针类型也可以通过强转变成新的指针类型,比如我们可以把整形指针强转为字符型指针。指针强转最诱人的地方就在于对内存数据进行操控就够了。指针强转使得指针对数据的操控更具有针对性,而且通过指针的默认强转可以使得函数的参数更简单,且传递的信息量是不变的。比如,void*作为参数时可以把任意的指针变量传递到函数内部进行相关的操作。

下面我们来看一个具体的例子。数据的内存布局如下图所示,首先是一个字符型数据,紧接着的是两个整形数据,最后面是三个结构体A型数据。我们需要做的就是把这些数据读出来。

我们先声明一个字符型的指针p,使其指向第一个数据的内存地址。取完第一个字符型数据后,通过p++,然后强转指针为整形指针,就可以很方便地取出整形数据,同理可取出三个结构体数据。

指针作为参数

先看一个例子,我们有两个整形变量,x的值为777,y的值为888,现在想构建一个函数用来交换两个整形变量的值,使得x的值为888,y的值为777。首先我们以传值的方式构建

voidswap_value(int Param1,int Param2)

{

int Temp = Param1;

Param1 = Param2;

Param2 = Temp;

}

我们调用函数swap_value(x,y)后,发现x、y的值并没有被交换。造成这种结果的原因是由于函数调用时,首先对传入的实参进行变量的拷贝,交换的值是形参的值,并不是实参的值。而原来的实参与拷贝后的形参变量所处的内存也不同,所以并没有交换成功。

要想实现函数内部对这两个值的交换,必须使得实参与拷贝后的形参变量所处的内存是相同的。我们知道了原理后,修正函数参数列表,以指针的方式重新构建函数如下:

voidswap_value(int*Param1,int*Param2)

{

int Temp=*Param1;

*Param1=*Param2;

*Param2=Temp;

}

这时候我们发现x、y的值被交换了。通过上面的例子可以看出,使用指针作为参数可以修改原来的变量值,使得函数实现的机能更加模块化,方便了程序的设计。

野指针

前面我们已经讨论过指针变量同内存的关系,了解了指针变量里面存放的是某个变量的内存地址,该地址可以在程序的某个位置使用,以方便我们更改或取得该变量的值。指针使得我们拥有了操控内存的利器,但同时指针也是一把双刃剑。我们必须时刻确保指针变量的值是我们意图操控的内存地址。如果指针变量的值被不受控的更改或者初始化不正确,那么我们就使用了错误的地址,从而导致程序错误,通常我们称这个导致程序错误的指针变量为野指针。由于使用了野指针而产生的程序错误大多时候是隐蔽的,难于跟踪的。野指针的产生主要是由于以下几种情况。

(1)声明了指针变量,但是没有正确的初始化就使用了该指针变量。

(2)使用指针变量之前没有对其进行安全检查。

(3)指针指向的内存变为了无效值,但没有及时对指针清零,导致程序某处引用了该指针。

(4)多个指针同时指向同一内存区域,程序某处通过某个指针释放了该内存,但是没有及时对其他的指针清零,导致程序某处进行了错误的引用。

(5)多线程时,对全局的指针变量没有进行锁处理。

多级指针

定义一级指针我们使用一个‘*’,在定义多级指针时,是几级指针我们就使用几个‘*’。例如,声明一个整型的二级指针(int ** ppVar;)。下面以这个二级指针为例说明一下二级指针的意义。

二级指针变量同样是保存了一个地址,这个地址就是某个一级指针变量的地址,而一级指针变量里面保存了最终需要操作的变量的地址,如下所示。

0x4323640 0x4323668

二级指针变量的值为0x4323640,就是一级指针变量pVar的地址,变量pVar的值为0x4323668,就是变量Var的地址。如果需要修改变量Var的值,我们可以直接修正**ppVar的值就可以了。

三级指针或者更多级指针的原理与二级指针的原理是相同的,只是需要索引的内存空间的深度增加了。在程序设计中,引入多级指针更多的时候并不仅仅是为了关注最后一级指针所能取得的变量,而更多的是为了使用和操控其中间的级数的内存值。比如利用二级指针作为函数的参数在某个函数内部对其分配内存,我们更想利用的是一级指针变量自身。当然,在进行程序设计时,有时我们要在可读性与语法有效性之间做出选择,在实现代码的过程中能用低级指针实现的尽量不要使用多级指针实现,这样的代码更利于维护。

小结

在C语言中指针的使用非常的广泛,有时指针是实现某个计算的唯一方法。同样的机能使用指针通常也可以获得更加高效、紧凑的代码。指针使得函数构建的机能更加的模块化,使得函数参数栈更加的短小。同时在操纵字符串的运算中,指针更加简单直观。

c语言指针篇2

Abstract: The pointer is the essence, focus and difficult of C language which is also the basis of C language Series. This article describes the arithmetic rules of pointer constants and variables in C language, as well as the access to the address.

关键词: 指针;地址;数组;运算

Key words: pointer;address;array;operation

中图分类号:TP312 文献标识码:A 文章编号:1006-4311(2014)11-0214-02

1 绪论

C语言的精华是指针,程序设计的关键也是指针,使用指针的难点是指针的运算。用指针访问数组元素,相对比较抽象,故本文用简单的自然语言予以浅析。

2 指针变量的概念

2.1 内存地址:内存中存储单元的编号 内存中,有众多的存储单元(单位:字节)。为了区分不同单元,必须为每一个单元编号,这个编号就是存储单元的“地址”,就像电话很多,为了区分每一部电话,必须为其编号,该编号就是电话号码。每个单元有且仅有一个惟一的地址。单元中存放数据,注意区分单元的地址与单元中的内容(数据)。

2.2 变量地址:该变量在内存中的起始地址 变量名是单元的外部名字(用户命名),单元号是单元的内部名字(系统命名)如 int x 假设整型变量是2个字节,系统分配的存储单元为 100 和101,则首地址100就是变量x在内存中的地址。

直接访问──直接利用变量的地址进行存取。

如:把“书”送给“张伟”就是直接访问。

间接访问──通过另一变量访问该变量的值。

如:把“书”送给“张伟他哥”就是间接访问,先间访“张伟”,知道他哥的地址,再按此地址送“书”。

2.3 指针变量

指针:即地址,存放地址的变量称为指针变量。

指针变量定义格式:数据类型 *指针变量[, *指针变量2……];

取地址运算的格式: &变量

例如

main()

{int x,*p; /*整形的指针的p单元

P=&x;

X=10;

*p+=20;

Printf(“%d,%d\n”,x,*p);

} 程序运行结果是30,30

3 数组的指针和指向数组的指针变量

3.1 数组的指针 数组元素在内存中连续存放,数组名代表数组首地址,是一个地址常量。

3.2 指向数组的指针变量的定义

例如,int a[10], *p=a(或&a[0]);

或者:int a[10], *p;p=a;

3.3 数组元素的引用

3.3.1 按名存取 有 int a[10],*p=a;定义,则p=a,一个数组,两个名字p和a,访问元素时用a[i]或p[i]。

3.3.2 按地址存取 有 int a[10],*p=a;定义,则:p+i和a+i都是数组元素a[i]的地址,访问元素时用*(p+i)和*(a+i)。按地址存取:*(p+i),*(a+i),按名存取:a[i],p[i]四个是等价关系。

注意:①p+n指向数组的下n个元素,而不是简单地使指针变量p的值+n。编译时为p+n*m。m为一个元素占用的字节数。②指针变量:既然是变量,其值随时在变,必须注意其当前值,否则容易出错。③指向数组的指针变量,可以指向数组以后的任何内存单元,C语言不做越界检查,这些单元不是系统分配的单元,强占资源,易导致死机。④int a[10],*p=a;p++对,a++错,a常量,p变量。

3.3.3 指向数组的指针变量所支持的运算 地址加减数值等于新地址,除此以外运算没有意义,由此得出推论,指针支持的运算有:

算术运算:指针变量±整形数据、指针变量-指针变量=整型数值,该数值表示两指针之间的数据个数,并非地址之差。

关系运算:指针变量 关系运算符 指针变量,表示两个变量值的大小关系,谁在前谁在后。

4 二维数组的指针及其指针变量

4.1 二维数组的指针 有定义语句: int a[3][4];

①从二维数组角度看,数组名a代表数组的起始地址, 是一个以行为单位进行控制的行指针,由一维数组构成的一维数组就是二维数组,a+i是行指针值,指向二维数组的第i行。*(a+i)是列指针值,指向第i行第0列。*(*(a+i)):数组元素a[i][0]的值。用a作指针访问数组元素a[i][j]的格式:*(*(a+i)+j)。②int a[3][4],b[4];由定义可看出,a[i]相当于数组名b,故a[0]、a[1]、a[2]分别表示第0、1、2一维数组的名字。③赋值:行指针变量=二维数组名或行指针变量。

4.2 行指针变量定义格式 数据类型 (*指针变量)[n];

4.3 二维数组元素的访问 int a[5][4],(*P)[4]=a;和int b[4],可以看出,b相当于a[5],第i行的一维数组名是a[i],元素地址±数值=元素地址,行地址±数值=行地址,a+i,a[i],*(a+i)其值相等,但a+i是行地址,a[i],*(a+i) 是元素地址。

①按名存取:a[i][j]或p[i][j]

②按地址存取:(*a[i]+j), *(*(a+i)+j), (*p[i]+j), *(*(p+i)+j)

5 动态数组的实现

静态数组:编译阶段确定数组的大小,运行阶段不能改变数组大小。缺点是事先无法准确确定数组的大小,太小不满足处理需要,太大浪费内存空间。

动态数组:运行阶段,根据实际需要动态确定数组的大小。

在C语言中,可利用内存的申请和释放库函数,以及指向数组的指针变量可当数组名使用的特点,来实现动态数组。如下程序

#include “alloc.h”

#include “stdlib.h”

main()

{ int *p=NULL, count, i,*q;

scanf(“%d”, &count);

p=(int *)malloc( sizeof(int) * count ); /*申请动态数组使用的内存块*/

if ( p==NULL ) exit(0);

for (i=0; i

for (q=p+ count-1; q>=p; q++) printf(“%d,”, *q); /*倒序显示*/

free(p); /*释放由malloc()函数申请的内存块*/

} 程序功能是键入任意个数据,倒序显示。

5.1 库函数malloc()

①用法:void *malloc(unsigned size)。②功能:在内存的动态存储区分配size个字节的连续空间。③返回值:申请成功,则返回新分配内存块的起始地址;否则,返回NULL。

malloc()函数的返回值是一个无类型指针,但在实际使用malloc()函数时,必须将其返回值强制转换成被赋值指针变量的数据类型,否则出错。

5.2 运算符sizeof

①格式:sizeof(变量名/类型名)。②功能:求变量/类型占用的内存字节数。如sizeof(long)=4。

5.3 库函数free()

①用法:void free(void *ptr)。②功能:释放由ptr指向的内存块(ptr是调用malloc() 函数的返回值)。③返回值:无。

一般情况下,使用malloc()函数申请的内存块,操作结束后,应及时使用free()函数予以释放。特别是在循环使用malloc()函数申请时,如果不及时释放不再使用的内存块,很可能很快就耗尽系统的内存资源,从而导致程序无法继续运行甚至死机。

6 结束语

学习C语言必须掌握指针的概念,以便为以后C系列语言学习打下基础。

参考文献:

[1]谭浩强.C语言程序设计[M].清华大学出版社,2004.

c语言指针篇3

实验五 指针

一、 实验目的

1、掌握指针的概念、会定义和使用指针变量

2、掌握指向数组的指针变量

3、掌握字符串指针的使用

二、 实验内容

1、 输入3个字符串,按由小到大的顺序输出。(习题10.2)

2、 写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。(习题10.6)

3、 完善程序,要求使用函数功能:将一个数字字符串转换成一个整数(不得调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串“-1234”,则函数把它转换为整数值-1234。

#include

#include

long fun(char *p)

{

填写程序

}

void main()

{

char s[6];

long n;

printf("Enter a string:n");

gets(s);

n=fun(s);

printf("%ldn",n);

}

一、 三、 实验步骤与过程

c语言指针篇4

关键词:C语言;指针;指针变量;地址

中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)02-0389-03

Discuss Application Of The Pointer in C Language Program

HU Xiao-yan,PANG Run-fang

(Engineering & Training Center Inner Mongolia University of Seicence and Technology, Baotou 014010, China)

Abstract: In this paper,the concept of pointer,pointer arithmetic,pointer of use, flexible application should pay attention to in terms of C language pointer analysis and discussion. Guide the students how to use the pointer.

Key words: C Langwage; Pointer; Pointer Variables; Address

《C语言程序设计》课程是我校理工科非计算机专业学生进入大学所接触的第一门计算机语言课程。实践证明,该门课程对于初学者来说难度比较大,这也是由于C语言的特点决定的。因为C语言功能强大,它既有高级语言的特点,也有低级语言的特点。而在这门课程中指针又是C语言的精华,因此灵活地应用指针,可有效地表示复杂的数据结构、动态分配内存、方便地引用字符串和数组;在进行函数调用时还可获得多个返回值,并可直接处理内存地址,实现其它高级语言难以实现的功能;运用指针编程是C语言最重要的风格之一。但指针比较难以掌握,使用时常犯一些错误,即使是熟练的程序员也很难发现和排除这些错误。为了设计出高效、简洁、紧凑的用户程序,正确理解和使用指针非常重要。因此如何引导学生学会C语言的指针在编程中应用是很重要的事情。

1指针的概念

计算机对信息的处理都由操作系统调入存储器存放并执行,存储器中有众多的存储单元,存储单元是用来存放数据的。存放在存储单元中的数据称为存储单元的内容(或值)。计算机为了对存储单元进行有效的管理,便为存储单元进行编号(以字节为单位),这个编号就是“地址”,这个“地址”又称为指针[1]。每个变量都有一个地址。不同数据类型的变量,占用的字节数不同,系统把变量占据存储单元的第一个字节的地址作为该变量的地址。有了地址我们就可以引入指针变量。指针变量是一种特殊的变量,变量中存放的不是某种数据类型的数据,而是存放另一个变量的地址。如果一个指针变量存放了另一个变量的地址,则形象地称指针变量指向那个变量。下面提供一个指针的例题,通过分析例题来理解指针的概念。

例:利用指针,求两个整数的和。main()

{ int i,j,sum;

int *p,*q;/*定义指针变量*/

p=&i;q=&j;/*建立关联*/

scanf(“%d,%d”,p,q);

sum=*p+*q;/*使用指针变量*/

printf (“%d,%d\n”,*p,*q);

printf(“和= %d\n”,sum);

}

在程序当中,首先定义两个普通变量i,j,再定义两个指针变量p,q,为了进行区分普通变量和指针变量,所以在指针变量名前加’*’号。不能引用没有赋值的指针变量,否则可能会造成系统瘫痪,所以将&i赋值给p,&j赋值给q,说明指针变量指向了普通变量。如图所示:

有了指向关系,在输出语句中就可以利用指针来访问普通变量i,j。

2指针的运算

指针变量和其他变量一样,也可以进行运算,由于指针的运算实际上是地址的运算,所以和其它变量的运算又有区别[1]。

1)间接访问运算

用变量名对其所对应的存储单元的内容进行读写称为直接访问,而通过存储单元的地址对其内容进行读写的则称为间接访问。尽管指针变量中保存的是存储单元的地址,而引入指针的目的主要是为了更方便快捷地访问存储单元的内容。

间接访问是在引用的指针变量前面加一个“*”号,用来表示指针所指向的存储单元的值或内容。例如:

int a=5, *p;

p=&a;

printf("%d",*p);

当指针p指向a后,若用指针p访问所指存储单元的内容时,可以写成*p,也就是说在这里*p与a是等价的。由于“&”与“*”两个运算符优先级别相同,且结合方向均为自右至左,又是一对互逆运算,所以有*&a=*p,&*p=&a。

2)指针变量加或减一个整型量,从而得到另一个地址,当然自增自减运算也是合法的。如先使p指向数组a的首地址(即p=a),则p+n表示的是下标为n的元素地址。p++表示:使p指向下一个元素a[1]。如果接着执行*p,则取出a[1]的值。*p++等价于*(p++)作用是:先得到p指向的变量的值(即*p),然后再将p+1=>p;*(p++)与*(++p)的作用不同,前者是先取*p的值,然后使p加1,而后者是先使p加1,再取*p;++ (*p)表示p所指向的元素的值加1。指针变量乘除一个整型量无意义,C语言也不允许此类语句出现。

3)由于指针变量中的地址也是一数值,所以指针变量间也可以进行关系运算。

4)两个类型相同的指针变量可以相减,例如指向同一数组的指针变量相减可以得到两个指针间元素的个数。相加或相乘则无意义[1]。

3指针的使用[3]

链表是数据结构的一种存储形式,能够实现动态分配存储空间。我们知道,用数组存放数据时,必须事先对数组定义固定的长度(即元素的个数)。例如,有的班级有100人,而有的班级有50人,如果要用同一数组先后存放不同班级的学生数据,则必须定义长度为100的数组。如果事先难以确定元素的个数,则必须把数组定义得足够大,以便够用;但实际若使用得很少,那样就造成了内存空间的浪费。定义小了又满足不了需求,为了解决这一矛盾,C语言提供了“需之则有,不需则无”的动态数据结构--链表,它根据需要开辟存储单元。

指针和结构体配合可以实现动态存储分配,用来实现对链表的建立、插入和删除等操作。

建立一个简单链表,结点类型定义的一般形式:

struct类型名

{数据域定义;

struct类型名*指针域名}

其中,数据域和指针域都可以不止一个,当指针域不止一个时,将构成比较复杂的链表。以4个结构体变量为结点建立一个简单链表并且输出。

#include

struct node

{int data;

struct node *next; };

main()

{struct node a,b,c,d,*head,*p;

head=&a;/*头指针指向a结点*/

a.data=10;a.next=&b;/*a结点指向b结点*/

b.data=20;b.next=&c;/*b结点指向c结点*/

c.data=30;c.next=&d;/*c结点指向d结点*/

d.data=40;d.next=NULL;/*d结点是尾结点*/

p=head;

while(p!=NULL)/*输出链表,p作为工作指针*/

{printf(“%d-->”,p-->data);

p=p-->next;/*工作指针后移*/}

printf(“NULL\n”);}

运行结果为:

10-->20-->30-->40-->NULL

建立一个简单链表很容易,只需将引用自身的结构体变量的地址赋给前驱的next即可。在后面需增加结点(即一个此类型的结构体变量)时,只要将原链尾结构体变量中的引用自身的指针指向新增加的结点即可。

4灵活应用指针还必须注意如下问题[2]

1)要注意指针变量的当前值。我们在做指针变量指向数组的练习时,经常会有这样的情况发生:

main()

{ int a[6],i,*p;

p=a;

for(i=0;i

scanf(“%d”,p++);

for(i=0;i

printf(“%d”,*p);}

当我们运行程序时,输出的6个数据和我们输入的不一致,就是由于指针变量进行了移动,已经移出了我们的数据区域,当再利用指针进行访问元素时必须把指针变量的当前值重新指向数组中的第一个元素a[0]才可以。所以上面的程序在第二个for循环的前面加一条p=a或p=&a[0];程序的结果才是正确的。

2)在一维数组a[10]中,有语句p=a,则p+i和a+i都表示地址相当于&a[i],p和a都是指针,但是它们有区别,p是变量,可以实现p++,a是常量,a的值不能改变。

3)当指针指向字符串时,字符指针变量和字符数组之间是有区别的。

A、字符数组由若干个元素组成,每个元素中存放一个字符,而字符指针变量中存放的是地址。

B、定义了字符数组之后,只能对各个数组元素赋值,不能用下面方法对字符数组赋值:char str[]; str=“I have a book!”;

而对指针变量,可以采用下面方法赋值:

char *a; a=“I have a book”;

赋给a的不是字符,是字符串的首地址。

C、对字符指针变量赋初值

char *a=“I have a book”等价于

char *a;

a=“I have a book”;

对数组初始化

char str[]=“I have a book”不等价

char str[20];

str[]=“I have a book”

5结束语

指针是C语言的难点,但也是精髓,只要我们掌握了其本质含义,也就不难了。上面所介绍的是C指针使用过程中的一些常用、重要的方法和规则。要达到熟练灵活应用,还需要在实践中不断积累、总结、提高。

参考文献:

[1]郝长胜.C语言程序设计[M].内蒙古:内蒙古大学出版社,2007.

c语言指针篇5

关键词:C语言;指针;数组

中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)19-5228-01

Studying the Pointer and Array Problem of C Language

LIU Wen-feng

(Computer and Information Engineering Department, Heze University, Heze 274015, China)

Abstract: Using examples and pointing the two highlights,this paper sdudys the pointer and array in solving some issues ,there is some degree equivalence; This paper has some guidance to the different levels and types of the C language developer.

Key words: C language; pointer; array

C语言课程,是计算机科学与技术以及相关学科专业的一门专业基础课。该课程学习掌握的好坏对后继课程有着非常重要的影响,而C语言课程中有两天非常重要的部分,一个是数组,另一个是指针。数组有一维数组、二维数组等,学生理解相对容易,写程序也很容易上手。而指针则是C语言课程中最难学习和掌握的内容,虽然花费了大量的时间,但是也很难熟练运用。

1 结合实例剖析指针和数组的特点

下面我们给出实例来剖析指针和数组的特点,在主函数中间填写一部分语句或使用单独的函数以实现以下功能,求出1到1000之内能被7或11整除但不能同时被7和11整除的所有整数并存放在数组aa中,并把满足条件的值存入OUT.DAT中(我们事先已经在相应的目录建好了一个空的记事本文件,文件名为OUT,扩展名改为.DAT格式),同时输出到执行屏幕上,我们使用两种方式分别加以实现。

1.1 基于指针的实现方法

首先使用指针来实现该函数的功能。

#include

#include //使用到的头文件

void writeDAT();//声明写函数

void countValue(int *a,int *n);//声明编写函数,变量均使用指针

void main()

{ int aa[1000],n,k;//定义所需变量

system("CLS");//清楚屏幕内容

countValue(aa,&n);//转入countValue执行

for(k=0;k

if((k+1) %10 ==0)

{printf("%5d",aa[k]);

printf("\n"); }

else printf("%5d",aa[k]);/*以上for语句是实现结果的屏幕输出*/

writeDAT();/*执行输出语句的函数*/}

void writeDAT()//写函数的具体实现

{ int aa[1000],n,k;

FILE *fp;//使用文件指针

fp=fopen("out.dat","w");//以写方式打开文件out.dat

countValue(aa,&n);//再执行一次countValue函数

for(k=0;k

if((k+1)%10==0)

{ fprintf(fp,"%5d",aa[k]);

fprintf(fp,"\n"); }

else fprintf(fp,"%5d",aa[k]);/*以上for语句是实现aa中的数据写入文件out.dat中,每行显示10个 */

fclose(fp);//关闭所打开的文件

}

以下是使用指针对函数countValue的具体实现。

void countValue(int *a,int *n) /*定义传递指针变量a为数组指针和n统计满足条件的个数指针*/

{ int i;

*n=0; //对指针变量所指内容赋初值

for(i=1;i

{if((i%7==0 && i%11!=0)||(i%7!=0 && i%11==0))/*如果i的值满足能被7整除同时又不能被11整除;或者i的值满足不能被7整除同时必须能被11整除。满足这两个条件之一即符合条件*/

{*a++=i;*n=*n+1;}}}

语句*a++=i,可以分为两句来实现。即*a=i,a=a+1;语句*a=i是把变量i的值存入指针a所指地址的变量空间中;语句a=a+1指的是指针变量a指向下一个数据单元。

1.2 基于数组的实现方法

以下是数组的实现方法。

#include

#include //使用到的头文件

void main()

{ FILE *fp;//定义文件类型指针

int i,aa[1000],n=0,k; //定义所需变量

system("CLS");//清楚屏幕内容

for(i=1;i

{if((i%7==0 && i%11!=0)||(i%7!=0 && i%11==0))/*如果i的值满足能被7整除同时又不能被11整除;或者i的值满足不能被7整除同时必须能被11整除。满足这两个条件之一即符合条件*/

{aa[n]=i;n++;}}//把满足条件的数据存入数组aa中,个数n值增1

for(k=0;k

if((k+1) %10 ==0)

{printf("%5d",aa[k]);

printf("\n"); }

else printf("%5d",aa[k]); //以上for语句是实现把结果输出到屏幕上

fp=fopen("out.dat","w");//以写方式打开文件out.dat

for(k=0;k

if((k+1)%10==0)

{ fprintf(fp,"%5d",aa[k]);

fprintf(fp,"\n");

}else fprintf(fp,"%5d",aa[k]); /*以上for语句是实现aa中的数据写入文件out.dat中,每行显示10个 */

fclose(fp); //关闭所打开的文件

}

数组实现相对较简单,也很容易理解和掌握。这种方法没有使用单独的函数,由于该函数简单,直接放到主程序当中来实现,当然也没有用到参数传递。避免了在参数使用和参数传递中的不必要的错误。

这两种方法,前一种方法使用参数传递,在参数传递和地址传递中,指针有其非常优越的特性,利用指针我们实现了相应功能。但在具体使用中,虽然语句较少,指针在理解和学习过程中相对复杂。如在函数中的参数传递过程中,对整型变量n的传递使用的是变量n的地址&n,而不是n本身;对数组aa[1000]在函数传递中使用整型指针a,而不是*a或&a。

2 结束语

目前很多已经成型的编程专家,在很多情况下都不使用指针,特别是在大型软件程序的开发中。因为指针非常灵活和方便,在具体使用中很容易出现引用错误和指向错误的问题,与此同时这些错误在调试和测试中又是很难被发现的。数组虽然没有指针灵活,但我们可以实现与指针相同的效果,例如很多国外的编程专家都不使用指针,而使用数组来替代它。这样就避免了很多不必要的麻烦。也不是说大家都不要学习指针了,都来学数组。如果你是软件开发的新手,建议少使用指针,当然如果你是多年的编程专家并且对C语言掌握的非常透彻,指针当然是较好的选择。

参考文献:

[1] 李明辉,丁海艳,万克星,等.全国计算机等级考试上机考试题库――三级网络技术[M].成都:电子科技大学出版社,2008.

[2] 谭浩强.C语言程序设计教程[M].3版.北京:高等教育出版社,2006.

c语言指针篇6

关键词:C语言;数组;教学;指针

中图分类号:G718.5 文献标志码:A 文章编号:1674-9324(2015)45-0228-02

在C语言的教学中,“指针”这一部分内容一直是C语言的教学重点和难点,直接影响学生对后续课程的学习和把握[1-3]。作为软件开发入门课程,绝大多数时间是在讲条件、循环、数组、函数,而指针内容却是省、国家计算机二级、程序员等考试的必考内容。为了在最短的时间内达到较好的教学效果。笔者从多年的教学经验认为C语言的指针教学应该注意以下几点:

一、输入函数scanf()和数组中地址的应用

所有的书本上都有介绍scanf(格式控制字符串,输入项列表),此函数的输入项列表要用“&”加变量名,要将所输入的内容放入变量的地址中,其中格式控制串中如果有普通字符也要输入普通字符,且有很多输入后不能正确读取的情况,初学者往往感到非常困惑难以理解。其实,连续定义的多个变量在内存中也是占用连续的内存单元,只是不同的数据类型所占的字节不同,程序在运行过程中遇到第一个scanf()函数时,将要求用户从键盘上按要求输入内容,所有输入的内容都将先放入缓冲区且你可以输入很多内容,输入完成后再按scanf的格式控制字符串的格式来存入到变量的地址中,一旦输入不合法,则认为输入结束,后面的变量将取不到值。如:scanf(“%d:%d”,&a,&b);若输入时你输入3,4L其中a的值为3,输入格式串中本来要求你输入的是“:”而你输入的是“,”,明显不合法,则scanf函数输入结束,后面的变量b将取不到值。同时这也很好解释了若程序中有多个scanf函数时,为了保证每次输入都有效,则应该在输入函数前加一个清空缓存函数fflush(stdin)。

数组名代表的是数组的首地址,所以在scanf()函数中以”%s”为格式串所对应输入项列表不需要加“&”。如:char str[20];

scanf(“%s”,str);/*将输入的内容存储到从数组首地址开始的地址中*/

printf(“%s”,str);/*从数组的首地址开始输出字符数组的内容*/。

这些内容都与计算机的实际存储有关(即和地址有关)。

二、指针

指针就是地址。其实前面我们在讲解输入输出函数和数组时,我们就介绍了一些有关地址的应用。一听自己已经用过且有所接触了,学生也就不会感到太畏惧了。再加上时间有限,我们要言简意赅地说明指针的用法。

1.指针的概念。指针就是内存地址。这里首先要区分三个比较接近的概念:名称、地址和内容(值)。名称是给内存空间取的一个容易记忆的名字;内存中每个字节都有一个编号,就是“地址”;在地址所对应的内存单元中存放的数值即为内容或值。

为了帮助读者理解三者之间的联系与区别,我们不妨打个比方,有一座教师办公楼,各房间都有一个编号,如101,102,…,201,202,…。一旦各房间被分配给相应的职能部门后,各房间就挂起了部门名称:如电子系、计算机系、环境工程系等,假如电子系被分配在101房间,我们要找到电子系的教师(内容),可以去找电子系(按名称找),也可以去找101房间(按地址找)。类似地,对一个存储空间的访问既可以指出它的名称,也可以指出它的地址。

在C语言中,如果变量p中的内容是另一个变量i的地址,则称变量p指向变量i,或称p是指向变量i的指针变量,形象地用图1所示的箭头表示。

由此可以得出结论:变量的指针即为变量的地址,而存放其他变量地址的变量是指针变量。

指针变量是一种变量,因而也具有变量的三个要素,但它是一种特殊的变量,其特殊性表现在它的类型取值上。具体而言:①变量名:与一般的变量命名规则相同。②变量的值:是某个变量的内存地址。③变量的类型:主要是其指向的变量的类型。

2.指针指向简单变量。

如:int a=100,*p;/*指针变量的定义*/

p=&a;/*指针变量的赋值*/

*p=200;/*指针变量的应用*/

printf(“%d”,a);则输出值为200。

在此我们要理解指针一旦定义且指向了一简单变量,除定义和初始化时的*p,其他的*p等价于它所指向的简单变量(即这里的*p<=>a),p(指针)等价于简单变量的地址(即这里的p<=>&a)。上面的输出语句可以变为:printf(“%d”,*p)。

3.指针指向数组。

(1)指针指向一维数组。

如:int a[5]={10,20,30,40,50},*p=a;

p++;

printf(“%d,%d,%d”,*p,*(p+2),*p++);则输出结果为:30,50,20

以上是指针指向一维数组的基本应用,首先我们要理解有关指针的运算。

&:取地址运算符[5]。

*:指针运算符(间址访问运算符),取指针所指向的值,若所指向二维数组则表示离取值进了一步。

++:算术运算符,表示指针往下或右移一个单位(其中这个单位和具体的数据类型有关,如果是整型数一个单位就指2个字节,实型指4个字节)。

--:算术运算符,表示指针往上或左移一个单位。

若定义了一个指针指向了一个一维数组,则p<=>a的使用(原来的a[i],也可以用p[i]表示,*p<=>*a),即*(p+i)<=>a[i] <=>p[i] <=>*(a+i)。但要注意p和a同为地址它们是有区别的,p为变量地址,而a是常量地址。有p++而不能用a++。

(2)指针指向二维数组。对于指针指向二维数组,要理解行地址和列地址的含义(*运算符能实现行地址向列地址的转换)再加上一维数组中的等价关系,能理解下面的二维数组的指针表示形式表即可。

(3)数组指针与指针数组的含义。前者是指针,后者是数组。定义格式:仅差一对圆括号。①指向一维数组的指针。假设有定义语句:int (*p)[4];②指针数组。假设有定义语句:int *p[4];

(4)应用场合:前者是一个指针,后者是多个指针。①指向一维数组的指针。一般将一个二维数组名赋值给一个指向一维数组的指针,来访问二维数组中的某一行。②指针数组。适合存放若干个字符串,使字符串的处理更加方便灵活。例如:

char *menu1[]={"Copy","Cut","Paste","Delete"};

char menu2[4][7]={"Copy","Cut","Paste","Delete"};

用字符指针数组处理字符串不仅可以节省内存,还可以提高运行效率。

4.指针指向函数。

(1)指针作为函数的参数。

其中左边交换完后,能传递给实参,因为它是指针所指向的值发生交换,而右边只是指针的指向发生改变原本值未发生交换。

(2)指针函数与函数指针。这是两个完全不同的概念,前者是函数,后者是指针。

a定义格式:仅差一对圆括号。

①指针函数。假设有定义语句:

int *fp(int x,int y);

②指向函数的指针(函数指针)。假设有定义语句:

int (*fp)(int x,int y);

b应用场合:前者是一个函数,只是函数的返回值是指针;后者是一个指向函数的指针,通过这个指针可以间接地调用所指向的函数。

三、总结

本文探讨了指针教学中,通过截取最基本且最重要的知识来解析其应用问题,目的在于使学生在较短的时间内掌握其基本知识,预计可作为指针教学的有效方案之一。

参考文献:

[1]管银枝.C语言程序设计实例教程[M].北京:人民邮电出版社,2011.

c语言指针篇7

关键词:指针;内存;程序

一、指针的概念

首先要让学生明确指针也是一种数据类型。为了让学生很好的理解指针到底是一种什么样的数据类型,就必须让学生理解数据在内存中是如何存储的。内存是以字节为单位的一片连续的存储空间,每一个字节单元都对应着一个唯一的存储单元的编号,这个存储单元的编号就称为内存单元的地址,简称地址。可以举例学生宿舍,内存单元的地址就相当于我们学生所在宿舍的房间号,在内存地址所标识的内存单元中所存放的数据,就相当于学生宿舍里入住的学生一样,可以有单人间,双人间,四人间等等。即根据数据类型的不一样,分配不同的存储空间。如下定义:char n; float d;int m ; 变量的类型不一样,内存为各自分配存储空间也不一样。由于变量n是字符型数据,所以内存分配其1个字节的存储单元;变量d是浮点型数据,所以内存分配其4个字节的存储单元;变量m是整型数据,所以内存分配其2个字节的存储单元。所谓变量的地址就是内存为各变量所分配的存储空间的第一个字节单元的地址。即地址就是用来标识数据的存储单元的一种数据类型,方便用户对存储在各自单元中的数据进行正确的访问,在C语言中就将地址称为指针。指针可以用来指向变量、结构体\\数组及其元素以及指针等。

二、区分变量、变量名、变量的地址和变量值

为了更好的理解指针这种类型的数据,我们先来理解一下变量、变量名、变量的地址和变量值的区别。所谓的变量即命名的内存空间。变量在内存中占有一定空间,用于存放各种相应类型的数据;所谓的变量名即给内存空间所取的一个容易记忆的名字;所谓的变量的地址即变量所使用的内存空间的地址(内存单元的编号);所谓的变量值即所对应的内存单元中存放的数值。

三、指针变量的定义、赋值和引用

(一)指针变量的定义格式:基类型 *变量名;

例如: int *n; /*定义一个指向整数据的指针变量n*/

char *m; /*定义一个指向字符型数据的指针变量m*/

float *p; /*定义一个指向浮点型数据的指针变量p*/

注意:C语言所有的变量必须是先定义然后再使用。指针变量也必须如此,为了表示指针变量是存放地址的一种特殊变量,所以在定义变量时会在变量名前加“*”号;指针变量的基类型表示指针变量所指向数据的类型,因各数据类型占用的存储空间不一样,指针变量的某些操作具有特殊的含义。如指针变量加1,不是纯粹的加1个字节, 而是加一个所指向变量的字节个数,例如:int *p, b=100; p=&b;其中执行p++;指的是p值加2个字节。

(二)指针变量的赋值方法

(1)变量的地址赋值给指针变量,例如:int a, *p;p=&a;

(2)相同类型的指针变量之间赋值,例如:int a, *p1,*p2;p1=&a;p2=p1;

(3)赋空值NULL,例如:int *p1 =NULL;

(三)指针变量的具体使用

首先区分“&”运算符和“*”运算符。“&”运算符表示取变量的地址, “*”运算符表示访问指针变量所指向的变量的值。在定义指针变量时”*”是指针变量的标志,没有特殊含义,但在具体使用中要注意,在指针变量前加了”*”, 表示取其所指向变量的值。从变量名获得变量地址用“&”运算符,从地址获得地址指向的数据用“*”运算符。

例如:int a=3,*p=&a;

具体访问数据时,可以按变量名直接访问,如:a=3;而利用指向变量的的指针去访问属于间接访问,即变量a的地址(指针)存放在指针变量p中,p=&a(p指向a),然后利用指针变量p进行变量a的访问*p=3,这就是间接访问。

四、指针变量可以作为函数的参数

指针变量和其它数据类型的变量一样也作为函数参数,区别只是传递的内容是一个地址值。而且可以通过这个地址值间接改变实参、形参所共同指向的变量的值。

例如:输入a,b,交换a,b数据后输出。

void fun(int *p1, int *p2)

{int temp;

temp=*p1;

*p1=*p2 ;

*p2=temp;}

main()

{int a=3,b=5,*pa, *pb;

pa=&a;

pb=&b;

fun(pa,pb);

printf(“swaped:\n”);

printf(“a=%d,b=%d\n”,a,b);}

c语言指针篇8

1、指针就是地址,它和数组联系起来,可以方便的取数组中的值。

2、可以作为函数的引用。

指针的本质:一种复合的数据类型。

c语言指针篇9

学习Java之后,对Java有了比较多的了解。也比较喜欢Java语言其中的乐趣。Java语言是现在比较流行的语言。它具有编程简单、面向对象、解释执行、安全、与平台无关、可植性、高性能等许多的特点。下面针对自己对语言之间的了解所写。关于Java与其他语言之间的区别。

一、 Java和C:

1、两者编程思想不同,C语言是一种过程式语言,较为简单直观,它是Java,C++等高级语言的基础。而Java语言是一种面向对象语言。

2、Java语言的安全性更好,Java语言很看重程序的安全性。java不允许程序员直接进行指针操作。指针可以说是C语言中最灵活的一个数据类型,也是最容易出错的。java就避免了这些问题的产生。

3、Java可以通过多线程来同时执行多个任务。线程是程序内一个单一的顺序控制流程。C语言在某个时刻只能执行一个任务,而Java可以通过多线程来同时执行多项任务。

二、 Java和C++:

1、Java语言不需要程序对内存进行分配和回收。Java丢弃了c++中很少使用的、很难理解的、令人迷惑的哪些特点,如操作重载、多继承、自动强制类型转换。特别的,Java语言不使用指针也没有指针。在Java语言中,内存的分配和回收都是自动执行的,程序员无需考虑内存碎片的问题。

2、Java语言中没有指针的概念,引入真正的数组。不同于C++中利用指针实现的“伪数组”,Examda,Java引入了真正的数组,同时将容易造成麻烦的指针从语言中去掉,这将有利于防止在c++程序中常见的因为数组操作越界等指针操作而对系统数据进行非法读写带来的不安全问题。

3、Java用接口(Interface)技术取代C++程序中的多继承性。接口与多继承有同样的功能,但是省却了多继承在实现和维护上的复杂性。

三、 Java和c#:

1、在面向对象世界里,一切都是对象Java和C#都是面向对象的语言,它们都遵守面向对象的概念,这也使得这两种语言很像,至少看起来是这样.但在具体实现上,这两种语言还是有很大差别的.作为面向对象的语言,Java先于C#面世.一切皆是对象,Java遵守得很好――所有的类都继承自Object,一点儿问题没有!然而同时,Java认识到很多时候我们需要做一些简单计算:2+3=5、(2==3)=false...这些频繁使用的简单的不能再简单的小东西,我们有必要封装起来做成一个个对象再去操作它们吗?回答是,没有必要!于是,Java引入了简单类型,或者叫基本类型,同时引入了值类型的概念.换言之,Java的值类型就是这几个简单类型,而且它们是脱离Object之外的概念,它们不是面向对象的元素.Java便成了面向对象+boolean、byte、short、int、long、char、float、double这八个简单类型。

c语言指针篇10

关键词:C语言;计算机领域;语言编程;应用

随着现代计算机信息技术的不断发展,计算机从最基本的高级语言到各种软件、硬件都有了突飞猛进的提升,而高级语言是计算机信息时代的基础,高级语言的正确编写才能发挥计算机应有的程序执行,C语言是计算机编程中最常见的一种语言程序,也是许多大学的一门必修课。C语言在计算机中的运用非常广泛,它是计算机语言编程的基础,只有很好的掌握C语言,才能深刻掌握更复杂的计算机编程语言。本文将介绍C语言及其特点,并就其在计算机中的应用以及应用要点进行概述。

1 C语言简介

C语言是计算机编程语言的重要组成部分,与其它计算机编程语言相比,C语言兼具高级语言和汇编语言的优点,因此c语言不仅可以设计系统语言,而且还能编写计算机硬件之外的应用程序。另外C语言编写程不仅效率高,而且对计算机操作系统具有普适性,得到广泛运用。

2 C语言的特点

C语言作为计算机高级语言的重要组成部分,不仅有计算机高级语言的共同特点,而且还有其本身独特的优势,这主要表现在运算范围的广泛性、编程的简洁性和结构的完善性,具体表现为:

2.1广泛性

运算范围是衡量一种编程语言好坏的重要标准,c语言具有34中运算符,运算范围相当广泛,运算结果的表达方式也多种多样。另外,C语言还拥有丰富的数据结构,在数据结构中常用的整型、字符型、数组型、指针型和结构体类型等等均包含其中,使得C语言复杂的数据结构运算中具有很好的操作性。

2.2简洁性

C语言在简洁性方面也有很大的优势,C语言仅有9类控制语句和32个关键字,使得程序编写起来非常简便,编写过程中也可以用小写字母编写,并省略不重要的词语,C语言可谓是高级语言中的低级语言,编写模式虽然简单,但其应用效率非常高,也侧面反应了C语言的简洁性。

2.3结构完善

结构化的语言可以组建模块单位,进而实现模块化的应用程序,而C语言在结构化语言方面具有很大的优势,因此能够适应各种编程要求,这种完善的结构更好的描述系统,并且在执行效率方面大大提高,充分显示了C语言的优越性。

3 C语言在计算机中的运用

C语言的这些特点决定了其在计算机领域中的运用非常广泛,不仅能够有效的表达数据和文字,需要完善的内存储器,而且还能对变量进行灵活设置,有效处理计算机的关键环节,具体表现为:

3.1有效表达数据和文字

C语言运用的基础和前提就是数据和文字的有效表达,在数据和文字的表达当中,C语言能够将简单类型的文字和数据相互联系起来,更加精确的表达了文字和数据。另外,相对与二进制在计算机数据和文字表达上的缺陷,C语言更加能够克服这种问题,二进制虽然能够表述的范围非常广泛,但其表述的形式非常抽象,如果不能将其转换为相应的语言将会非常难以理解,而C语言恰恰能够将这种代码表述清楚,C语言的表述能力在计算机的运用当中表现的淋漓尽致,并在表述类型方面也可圈可点。

3.2完善的内存储器

C语言的完美运用必须要有完善的内存储器,C语言运行中的数据往往通过内存储器来保存,之后的处理是通过CPU来完成的,内存储器作为先决条件其构造形式也显得尤为重要,只有构造完善的内存储器才能真正发挥C语言的优势。而且,完善的内存储器和C语言的应用戚戚相关,C语言的优越性也是通过完善的内存储器来体现的,为了保障C语言中的每个字节都有唯一的编号,要有很多为的二进制来支持,这也间接要求了内存储器的大容量。

3.3灵活设定变量

变量的灵活设定也是C语言在计算机运用中非常重要的一方面。变量的地址往往是此变量多个字节中的第一个字节地址,这也决定了指针变量中变量的灵活性,这些变量可以通过灵活设定来达到想要的要求,在实际中程序员仅仅根据内存特点和语言数据类型就可以有效设定变量的初始值,从而得到想要的变量结果,大大增加了计算机语言编程的效率。

3.4有效处理关键环节

C语言的另一个运用核心就是能够对关键环节进行有效处理,计算机领域有很多重要的方面,而计算机的程序设计是计算机应用的一个关键环节,C语言的运用就是解决计算机的程序设计问题,也是计算机关键环节的有效处理手段。C语言的运用不仅能够改进计算机语言的编程方法,而且能够大大提高计算机的运行效率,从而使计算机软件时刻保持着领先水平,不至于被淘汰,这正式C语言在计算机关键环节重要性所在。

4 C语言在计算机中的运用要点

以上为C语言在计算机领域中的运用方面,实际运用中要掌握C语言的以下几个要点。

4.1 C语言中的指针

C语言中有很多变量,倘若这个变量声明前出现“*”这个符号,那么这个变量就是指针变量,指针变量就是该变量对应了一个存储地址,“*”就表示了这个存储内容,在C语言中一个指针作为一个常量,代表了一个地址,有些情况下一个指针变量还可以有多个指针值。C语言中的指针既可以代表某个变量、数组或函数地址,也可以代表相应的存储内容。除此之外,当指针作为形式参数时,其调用函数的同时还可以得到不同于return(z)的返回值,C语言的这些指针功能使得C语言相对于其它高级语言有更容易分辨的差别,也使得c语言拥有了一些其它高级语言望尘莫及的功能。

4.2 C语言中的字符串

C语言中字符串是一种字符数组,它是以text文本为基础的字符序列,字符串是一种chair数组,其数组退出形式是以ASCII的UNL为基础,因此引用库就不需要在C语言中使用。但c语言中标准库也有一些函数,这些函数是以字符串为基础的,因此体现不出数组的特性,这些函数的运用同时是以为开头的引用。c语言中这些字符串的运用使得c语言拥有了很多自己独特的特点,也使得c语言的使用相对于其它高级语言具有很多优势,使用起来更加直观简洁。

4.3 C语言的结构

C语言中最常用到的结构是选择结构、顺序结构和循环结构。其中选择结构是根据相关条件进行选择性执行的一种结构形式,选择结构的核心是相应的分支条件和相关的分析程序流程,最长见到的选择结构的语句是包含“if”和“if-else”的语句形式,另外还有一种多分枝选择结构,该选择结构的语句是以“switch case”为开头的语句形式。顺序结构是以先后顺序进行操作的一种结构形式,比如X=4,Y=6,我们想要使X、Y的值互换,那么我们可以将它们看作是杯子,另外引用第三个杯子z,其具体的编程可以表示如下:Z=X,X=Y,Y=Z,那么相应的运算结果就是X=4,Y=Z=6,但如果我们不这么编程,而是改成:X=Y,Z=X,Y=Z,那么运算的结果将会是X=Y=Z=6,这就是顺序结构的具体体现,在实际运用中计算机的输入、运算和输出过程就是顺序结构所达到的效果。循环结构是一种可以重复执行某个程序的结构形式,在实际C语言编程中,我们往往会遇到需要重复运行某个程序的例子,此时我们就需要重复执行与之相应的语句,该重复执行的语句也称为循环体,循环结构的出现大大渐少了重复语句编写的工作量,也使得重复程序运行出现问题时可以通过循环体的检查改错来纠正整个重复运行程序,间接缩短了编写程序的过程,使程序编写起来更加方便。常见的循环结构形式是以“while”“for”“goto”和“do-while”为标志的语句形式,这四种循环结构形式可以对重复的程序进行简单编写,也可以相互替换,在编写过程中,由非0和0作为判断真假的条件,非0代表了假设的成立,使得假设条件可以不断运行,而0代表了假设的不成立,可以终止假设条件的运行。