c语言指针范例6篇

前言:中文期刊网精心挑选了c语言指针范文供你参考和学习,希望我们的参考范文能激发你的文章创作灵感,欢迎阅读。

c语言指针

c语言指针范文1

实验五 指针

一、 实验目的

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语言指针范文2

关键词:C语言;指针;程序设计;变量;标识符

C语言在处理变量、数组、函数时,需要由操作系统把这些数据调入内存的不同存储单元中,每个内存单元都对应着一个地址,计算机就是通过访问这个地址来存取对应单元的内容。C语言中的每种数据类型在内存中存放所占用的存储单元数是固定的。从而根据数据的第一个存储单元地址(首地址)及数据类型,计算机就可以访问这个数据。C语言声明一个变量即表示在计算机中为该变量开辟一块内存空间,变量的值即该内存中所保存的值,可以使用变量名对该内存的内容进行访问或修改,或者通过先求出该变量所占内存的地址,然后直接对该内存进行访问或修改。变量对应的首地址称作变量的指针,指针变量是用于存放某一类型变量地址的变量,其值为所指向变量的内存地址。

指针变量的声明规则为:类型标识符*标识符,其中“类型标识符”表示该指针变量所指向的变量的类型,标识符是该指针变量的名字。例如:

int i=1;

int *p=&i;

那么此时p为一个指向int类型的指针,其值为变量i所占内存的地址,而*p即为该内存所保留的的数值1,其中运算符&是在执行取地址操作,就是说&i表示的是i的地址,而不是i的数值,同时也可以通过对指针变量p的操作来对i的值进行访问和修改。需要注意的是,与一般变量一样,对于外部或者静态指针变量,若在定义中未进行初始化,指针变量将自动被初始化为NULL,即为空指针。那么下面简单介绍一些关于指针的应用:

正确使用指针变量可以提升程序的执行效率

正确使用指针变量可以编写高质量、高效率的C程序。以下从数组元素的引用、函数调用的代价和因为错误使用指针而造成的问题三方面进行分析, 以更清晰地介绍使用指针变量对C程序运行效率的影响。

数组元素的引用

#include ""stdio.h""

main()

{

int a[5]={1,2,3,4,5},i,*p;

for (i=0;i

printf(""%d "", a[i]);

for (p=a;p

printf(""%d "",*p);

}

在该程序中,对数组元素的引用采用了两种方法:下标法和指针法。采用下标法时,C编译系统是将数组元素a[i]处理成*(a+i),即按数组首地址加上相对位移量得到要找的元素的地址,然后找出该单元中的内容。而采用指针法是用指针变量直接指向元素,不必每次都重新计算地址。所以指针法的执行效率要比下标法的高很多。

函数调用的代价

#include ""stdio.h""

struct s

{

int num; char name[10]; float score;

}

f(struct s *p)

{

int i;

float sum=0,ave;

for(i=0;i

sum=sum+p->score;

ave=sum/5;

printf(""%.0f,%.2f"",sum,ave);

}

main()

{

{struct s *p;

struct s xs[5]={{1,""mali"",89},

{2,""lili"",78},{3,""nimi"",90},{4,""lini"",65},

{5,""yisu"",82}};

p=xs;

f(p);

}

在该程序中,实参传给形参的是结构体变量的地址,这样在函数调用时就无需复制大量数据,从而减少时间和空间的开销。编写程序时,如果需要传入一个占比较大内存的数据类型, 如数组或结构体变量,为了提高程序运行效率,都是传递该变量的地址。

指针指向的地址偏移的错误

这种情况常出现的原因是, 错误地将指向动态分配内存的指针当着指向一般变量的指针使用。示例程序如下:

void Test (void)

{

char *pChar=(char*)malloc(sizeof(char ));

char chs;

pChar=&chs;

free(pChar);

}

该程序的目的是想将chs内容传递给pChar指针指向的内存,但该程序代码将会使指针pChar指向chs所占有的内存地址,其先前指向的内存空间将成为垃圾地址,因为程序没有办法再访问该内存空间了。这里pChar是一个野指针,程序将会导致内存泄漏。同时,在调用free 函数释放指针pChar的内存时,将会发生异常错误。因为此时pChar指向的内存已经不是由malloc函数动态分配的,不能使用free函数进行释放。要避免这样的情况发生就应该避免将指向动态分配内存的指针在释放前指向其他变量的内存地址。所以,我们发现,如果不能正确的使用指针不仅不能提高程序的执行效率,反而给我们带来了不必要的麻烦。

指针应用千变万化, 关于指针的应用,还有很多内容值得探讨, 以上只是指针的一些基本应用, 只有在编程过程中不断总结指针的使用技巧, 通过实践中的不断摸索才能准确无误的应用指针。

参考文献:

c语言指针范文3

关键词 C语言;指针;程序设计

中图分类号TP39 文献标识码A 文章编号 1674-6708(2011)56-0173-02

1 C语言中的指针简介

指针就是表示地址的一种变量,所以指针的范围严格来说只能是自然数的,并且不能在两个指针间进行加、乘、除这样的运算。由于在C语言中每个数据类型都必有存储空间,所以指针可以应用于几乎所有的数据类型中。所以,从这个角度出发可以将指针分为:指向变量的指针、数组指针、字符指针、指向指针的指针、函数指针、结构变量的指针以及文件指针等等。

其中,指向变量的指针就是存储变量的地址的。如 int * s这就是一个指向整型的指针,可以用于指向一个整型变量。如int a; 当p=&a时,就是将p存储整型变量a的地址。这是指针最简单的一种类型。所谓数组指针,就是指数组的名称实际上是指向整个数组空间的首指针。如 int a[10];其中a本质上是一个指针,指向该数组的第一个位置,a[2]表示距离a指向空间向后2个位置所在空间中的存放的值。所以,a[2]=*(a+2)。字符指针本质上是数组指针的一种特殊情况,就是存放字符串的数组所对应的数组名。指向指针的指针这是一类很特殊的指针,用于存放指针的一类指针,在本质上与指向变量的指针十分相似。例如 char *ss[N]={“java”,”sss”,’’rrr”}。指向函数的指针就是指向函数入口地址的指针。结构变量的指针这类指针和指向变量的指针很类似,主要的区别在于结构变量可能有多个类型不同的变量,所以一般空间较大。文件指针就是对文件进行操作的指针。从上述的分类可以看出无论什么类型的指针其功能都是一样的就是用于指向对象的地址空间罢了。

上面简要的介绍了指针的定义和分类,现在简要的论述一下指针涉及到的运算操作。首先由于指针是存放的变量地址的,所以第一个操作就是对指针进行地址赋值。如int a,*p;

P=&a,这就是对指针p进行进行赋变量a的地址,p指向变量a。当然也可以通过指针获取指针指向地址空间所存储的值。如int b=2,*p;p=&a,这是*p就表示p指向空间所存储的值,在本例中就是a的值2。为了能在数组指针中通过指针能访问到整个数组的值,所以。可以对指针进行加减整数值,表示地址的前移或后移。如int a[10],*p,*s; p=a;s=p+2;其中s 的值表示数组中首地址向前移动2的位置,表示 a[2]对应的地址。 为了表示两个地址间存在的距离,可以通过指针间的减法实现。当然指针涉及到的还有其他运算,现不详述了。

2 C语言中的指针算术运算

指针可以加上或减去一个整数,这和c语言中的算术表达式意义是不同的。例二:

(1)int a[20]; (2)int *ptr=a; (3)……… (4)ptr++;

在上例中,指针ptr的类型是int*,它指向的类型是int,他被初始化为指向数组a的起始地址,接下来的第4句中,指针ptr被加了1,编译器编译程序时把指针ptr的值加上了sizeof(int)。

由于int型在32位机中的长度是4个字节,故原来ptr指向数组第0号单元开始的四个字节,此时指向数组从第4号单元开始的4个字节。

3 运算符&和*

&是取地址运算符,*是指针运算符或称为间接访问运算符。&a的运算结果是一个地址,即变量a的地址。*p为指针变量p所指向的存储单元的内容,即p所指向的变量和值。下面举例说明。例三:

int a=12;

int b;

int * p;

int * * ptr;

p=&a; /*把变量a的地址赋给指针变量p。 */

*p=24; /*把24赋给指针变量p所指向的存储单元的内容 */

ptr=&p; /*把指针变量p的地址赋给指针变量ptr。*/

*ptr=&b; /*把变量p的地址赋给指针变量ptr。 */

* *ptr=34; /* *ptr的结果是ptr所指向的存储单元的内容,即变量b的地址,再做一次*运算,结果就是一个int类型的变量。*/

4 C语言中的指针应用

在C语言中指针的十分应用广泛,除具有一般的功能外,具体特殊功能的应用总结起来有三个方面:一是用于在函数中可以返回多个值;还有就是可以实现动态调用函数;最后就是实现数组的动态定义。其中,由于由函数的特点,一个函数只能有一个返回值,但在有些场合需要返回多个值,就可以定义指针参量来实现,其定义的基本框架如下:

Sss( int a,int *p )

{int s;

…….

………

Return s;

}

在这中情况下,函数不仅可以得到返回值(通过Return s来实现的),还可以通过指针p来返回相应的值。所谓指针能实现动态调用函数,这里用到的指针就是上文中提到的函数指针。函数指针就是指向函数入口地址的指针,我们还知道其实函数名就是一个函数指针。我们就是通过函数名实现动态调用函数的。在主调函数的参数中采用函数名充当实参就能实现函数的动态调用。该方法以简短的代码实现了复杂的功能。最后讲到指针能实现数组的动态定义。从C语言的学习中,我们知道在定义数组时一定要指定数组的大小,否则,不能完整数组的定义。那么如何实现数组的动态定义。数组从本质上来讲就是连续的空间集合罢了。那么,我们可以通过申请一个空间并赋值给一个指针变量,以此指针变量为首空间,就能获取连续的空间,这与数组相同。当然数组还有许多应用,只有认真分析就能得到更多更好的应用实例。

5 结论

指针是C语言中的一个重要概念,也是C语言的一个重要特色。掌握指针的应用,可以使程序简洁、紧凑、高效。每个学习和使用C语言的人,都应当多思考、多上机,在实践中深入的学习和掌握指针。

参考文献

[1]谭浩强.C语言设计[M].北京.清华大学出版社,2005,7.

c语言指针范文4

关键词:指针;地址;数组;字符串;函数

中图分类号:TP312.1

指针是C语言学习中的难点和重点,正是指针让C语言威力无穷,要想成为一名优秀的C程序员,对指针有一个深入而完整的理解是先决条件。在教学中这一部分内容经常让学生觉得疑惑。我在教学中总结了自己的经验,现在把自己对C语言中指针的理解跟大家分享一下。

对于一个内存单元来说,内存单元的地址即为指针,其中存放的数据是该单元的内容,我们可以把内存想象成一个一个的房间,每个房间都有一个房间编号,每个房间可以住不同的房客。其中房间编号就是该存储单元的地址即指针,房间中住的房客即该存储单元的内容。我们用一个变量来保存房号,这个变量就是指针变量。指针变量也是一个变量,只不过里面存放的是地址即指针。指针变量的定义格式如下:

基类型 *指针变量名

其中基类型是指针变量指向的数据的类型,大家可以理解为房间里所住房客的类型。“*”只是一个符号,表示后面的变量是一个指针变量,不是指针运算符。大家可以用sizeof()函数对指针变量进行测试,得到结果是在相同的系统中不论何种数据类型的指针,即不管房间里住什么类型的房客,指针变量的长度是相同的,它都表示的是地址。在C语言中,有两种指针运算符:“&”和“*”。“&”是取地址运算符,结合性为自右向左,功能是取变量的地址。“*”是取内容运算符,结合性为自右向左,用来表示指针变量所指向的变量。即一个为取地址,一个为取内容。大家注意在指针定义中的“*”不是运算符,不代表任何运算,只是表示后面的变量是一个指针变量,与运算符“*”是不同的。下面从8个方面讲述一下指针的应用。

1 指针指向普通变量

这个是指针最基本的用法。举例如下:int *px;定义了一个指向整型数据的指针变量,可以对它进行赋值,如px=&a;把变量a的地址赋给指针变量px,即指针变量px指向变量a。

2 指针指向数组

在C语言中,指针与数组之间的关系十分密切,都可以处理内存中连续存放的一系列数据。举例如下:int a[10];int *px;px=a;px++;指针变量的基类型是数组的类型,即数组元素的类型。C语言中规定数组名是指针类型的符号常量,该符号常量是指向数组首元素的地址,即数组名就是数组首地址。所以可以直接把数组名赋值给指针变量。指针与数组在访问内存时,采用统一的地址计算方法。在进行数据处理时,指针和数组的表示形式具有相同的意义。指针变量也可以带下标。a[i]、*(a+i)、px[i]和*(px+i)这4种表示法全部等价,都是取数组元素的含义。但有一点区别,就是数组名是符号常量,是不能给数组名赋值的。即a=px;是错误的。指针变量px是可以对它赋值的。引用数组元素可以用下标法:a[i]、px[i],和指针法*(px+i)、*(a+i)。在指针指向数组的应用中经常用“++”、“——”和“*”一起使用,这时大家在分析时,注意自增和自减运算符与指针运算符是在同一个优先级,结合性为自右向左,如果有括号,优先计算括号内容,而且要注意自增和自减运算符在变量的前面和后面的区别,一个是先加减后使用,一个是先使用后加减。指针变量的算术运算,加减某一个整数n,不是地址值加减这个整数,而是地址值加减n个单元,每个单元的长度是由数据类型决定的,即px±n表示的实际位置的地址值是px±n*sizeof(type)。如上举例,px++的含义不是地址加1,而是由int数据类型决定的,假设本系统int数据类型为2个字节,则px++的结果为地址px+2。

3 指针指向多维数组

以二维数组为例,int a[3][4];int *p;p=a[0];把二维数组a看作由3个一维数组组成,每个一维数组有4个元素。这时可以把指针看为在行指针列指针中变换。行指针中保存的是列指针。a代表整个二维数组的首地址,是行指针,可以看作指向一维数组的指针的指针,a指向的是列指针。a[0]代表第0行的首地址,是a指向的列指针,即a中的内容是列指针。a+1指向第1行的首地址,指向的也是指针。*a=a[0],*(a+1)=a[1]。用“*”把行指针转换为列指针。如果二维数组的首地址为3000,则a+1为3008(假设一个int数据为2个字节),a+1的含义是a[1]的首地址。用a[0]+1表示第0行第1列元素的地址,其值为3002。a[i]和*(a+i)等价,可以理解为二维数组中的行指针取出的内容为一维数组的地址,即为指向一维数组的列指针。在其后再加上某个数,就转为了一维数组中的某一列的列指针。a[i]+j和*(a+i)+j等价,是第i行第j列的地址,即为指向第i行第j列的指针。所以要取第i行第j列的内容,即为*(a[i]+j)和*(*(a+i)+j)都可以,这两种方式是等价的。二维数组的指针运算可看为行指针列指针的转换,如果数组维数大于2,则可以一层一层的进行指针分析。大家有兴趣可以试着分析一下。

4 指针指向字符串

用字符指针指向字符串,然后通过字符指针来访问字符串存储区域。例如:char *str=“Good morning!”C语言对字符串常量是按字符数组处理的,实际上在内存开辟了一个字符数组用来存放字符串常量。定义了一个字符指针变量str,并把字符串首地址赋给它。注意只是把字符串首地址赋给指针变量,不是把字符串赋给str。可以把字符串看为一个整体来处理,可以对一个字符串进行整体的输入输出。对字符串中字符的存取,可以用下标方法,也可以用指针方法,与数组类似,这是因为对字符串常量是按字符数组处理的。getchar是输入字符,gets和scanf可以输入字符串,但gets可以输入带空格的字符串,scanf则不带空格。putchar是输出字符,puts和printf可以输出字符串。字符数组与字符串指针变量都可以实现对字符串的存储和操作,但两者是有区别的。首先字符串指针变量本身是一个变量,用于存放字符串的首地址,可以指向字符串的任何字符。字符串本身存放在以该首地址为首的一块连续的内存空间中,并以“\0”作为字符串的结束。字符数组由若干个数组元素组成,可以用来存放整个字符串,字符数组名是字符串的首地址,是常量,不能修改其值。其次在使用上,两者也有区别。对于字符串指针方式:char *px=“Good morning”;可以写为 char *px;px=“Good morning”;而对于数组方式:char str[]={“Good morning”};不能写为char str[20];str=“Good morning”;可以看出使用指针变量更加方便。

5 指针数组

指针变量本身也是变量,当指针变量集合成数组时,就形成了指针变量数组,简称指针数组。定义举例如下:int *px[5];该数组的每一个元素都是整型指针。[ ]比*优先级高,因此px先与[5]结合,形成px[5]形式,这是一个数组形式,它有5个元素。再与px前面的“*”结合,表明每个数组元素是指针,指向一个整型变量。不要写成int (*px)[5],这是指向一维数组的指针变量。这种用法常用来指向若干个字符串,是字符串处理更加方便。例如:char *name[]={“数据结构”,“操作系统”,“计算机网络”};图例如下图2:

6 指向指针数据的指针变量,即指向指针的指针

当一个指针变量指向普通变量时,这样的指针变量称为一级指针变量。指向一级指针变量的指针变量称为二级指针变量。指向二级指针变量的指针变量称为三级指针变量,以此类推。在引入多级指针变量的概念后,当访问一个指针变量的内容时,只有一级指针变量的内容才是要处理的数据,而多级指针变量的内容仍是一个指针变量。如上面例子,要一个指针指向数组name,就是一个二级指针变量。char **px=name;因为name是一个指针数组,所以用指针指向它,就必须定义一个二级指针变量。在分析多级指针变量时,注意区分哪个是地址,哪个是要处理的数据。

7 指针型函数

一个函数可以带回一个整型值,字符值,实型值等,也可以带回指针型的数据。函数返回值的数据类型决定了该函数的数据类型。有数值型函数,字符型函数等等。当函数的返回值是地址时,称为指针型函数。定义例子如下:int *fun(int a,int b);fun先与运算符“()”结合,表明fun( )是一个函数,前面一个“*”,表明该函数返回一个指针,最前面一个int,表明该指针指向一个整型变量。在指针型函数中,用return语句返回一个地址。

8 函数指针

可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。可以用一个指针变量指向函数,然后通过该指针变量调用此函数,这种指针变量为指向函数的指针变量,简称函数指针。函数的存储首地址又称为函数的执行入口地址。函数名代表函数的入口地址。使用时,直接把函数名赋值给函数指针,再通过函数指针调用函数即可。定义举例如下:int (*p)(形参表);int fun(形参表);p=fun;p即定义为一个函数指针,该函数的返回值为整型数据。函数指针与普通指针变量本质相同,都是保存地址。区别在于普通指针变量指向内存的数据存储区,而函数指针指向内存的程序代码区。普通指针变量的“*”运算是访问内存的数据,而对函数指针执行“*”运算时,其结果是使程序转移至该函数指针指向的函数入口地址,从而开始执行该函数,即调用其所指向的函数。在一个程序中,一个指针变量可以先后指向不同的函数。

以上是我在C语言教学中总结归纳的指针的8大用法,C语言是计算机程序设计的一门基础课,其中指针是C语言的特色和精华。C语言中的指针经常让学生不知所云,但其实只要掌握指针的本质就是地址,理解指针的基本概念和用法,指针其实是不难学的。希望我的文章能对大家学习C语言有所帮助。

参考文献:

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

[2]Kenneth A.Reek.C和指针[M].人民邮电出版社.

c语言指针范文5

关键词:指针;内存单元;内存单元地址;直接访问;间接访问

中图分类号:TP312文献标识码:A文章编号:1009-3044(2009)31-0000-00

Full Parsing C Language Pointer Variable

LI Bei

(Finance and Economics College, University of Qinghai, Xining 810016, China)

Abstract: C language pointer is an important concept, the correct proficiency in the concept of pointers and pointer use will be able to design complex data structures and efficient procedures. This indicator focuses on the concept and its application in the program.

Key words: pointer; memory unit; memory cell address; direct access; indirect access

指针是C语言中的一个重要特色。c语言的强大及自由性,很大部分体现在其灵活的指针运用上。正确灵活地运用指针,能有效地表示出复杂的数据结构;能动态分配内存;方便地使用字符串;有效而方便地使用数组;在调用函数时能获得一个以上的结果;能直接处理内存单元地址等,这对设计系统软件是非常必要的。因此说指针是C语言的灵魂。

1 内存分配

计算机中的内存都是编址的,就象家的地址一样。在程序编译或者运行的时候,每遇到一次声明语句(包括函数的传入参数的声明),编译系统就为已定义的变量分配相应的内存单元,也就是说,每个变量在内存会有固定的位置,变量的数据类型不同,它所占的内存单元数也不相同。若我们在程序有如下定义:

int a=1,b=2;

float x=3.4, y = 4. 5 ;

double m=3.124;

char ch1='a', ch2='b';

如果将变量的地址保存在内存的特定区域,用变量来存放这些地址,这样的变量就是指针变量,通过指针对所指向变量的访问,也就是一种对变量的“间接访问”。

设有:

int*pa,*pb; float*px,*py ;

double*pm; char*pch1, *pch2;

pa=&a;pb=&b;px=&x;py=&y;pm=&m;pch1=&ch1;pch2=&ch2;

现在我们访问变量a、b、x、y、m、ch1、ch2对应的内存单元时,不仅可以通过变量名(直接访问),也可以通过指向这些变量的指针(间接访问)。

二者的关系如图2所示。

此时访问a变量对应的内存空间有: a、*pa二种方式。

2 指针就是一个整数

指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。32位系统下寻址能力(地址空间)是4G-byte(0~2^32-1)二进制表示长度为32bit(也就是4B)int类型也正好如此取值。

例如:程序1

#include

main()

{char *pt;

char t='h';

pt=&t;

putchar(*pt);}

程序2

#include

main()

{char *pt;

char t='h';

pt=(char *)1245048;/*1245048是pt的值*/

putchar(*pt);}

程序1得到的答案和程序2的答案一致。(不同机器可能需要调整一下pt的取值。)

3 C的按值传递

C中函数调用是按值传递的,传入参数在子函数中只是一个初值相等的副本,无法对传入参数作任何改动。但实际编程中,经常要改动传入参数的值。这一点我们可以用传入参数的地址而不是原参数本身,当对传入参数(地址)取(*)运算时,就可以直接在内存中修改,从而改动原想作为传入参数的参数值。

#include

void inc(int *val)

{(*val)++;}

main()

{int a=3;

inc(&a);

printf("%d" , a);}

在调用函数语句inc(&a)执行时, a的地址传给了函数inc的形参(*val)并在函数体内执行了(*val)++;就等于改变了变量a的值。执行完inc函数后返回到main函数输出a的值为4,操作*val,即是在操作a 了。

4 双重指针(指向指针的指针)

设有如下程序:

#include

void main()

{ int a=3;int *p; int **p1;//p1是一个指向指针的指针(双重指针)

p=&a;

printf("%d,%d\n",p,*p);

p1=&p; //指向了一级指针p

printf("%d,%d\n" *p1,**p1);

}

运行结果:1245052,3

1245052,3

若有:int a,*p1=&a,**p2=&p1; 则下面引用都是正确的。

*p1 //代表变量a

*p2 //代表表指针变量p1

**p2//代表变量a

5 指针数组、数组指针和指向函数的指针

指针数组是一组有序的指针集合,它所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。

设有:int a,b,c;int *p[3]={&a,&b,&c};

上述语句定义了一个名称为p的指针数组,其中有三个元素p[0]、p[1]、p[2]分别指向三个整型变量a、b、c。此时可以通过*p[0]、*p[1]、*p[2]这三种方式来访问a、b、c。

数组指针是指向数组的指针。数组在计算机内存中占据一片连续的存储空间。数组名存放着这一连续空间的首地址(注意这是一个常数)。数组指针指向这一片连续空间的起始地址。

设有:

int a[10]{1,2,3,4,5,6,7,8,9,10},*p=a; /*p指向了起始地址*/

此时访问数组a中第三个元素有三种方法:a[2]、*(a+2)、*(p+2)

设有:

int b[3][3]={{1,2,3},{4,5,6},{7,8,9}},*p=&[0][0]; /*此时p这是一个列指针*/

此时访问数组b中第一行的第2个元素有:a[0][1] 、*(p+1)、*(*a+1)(注:a是一个行指针)三种方法。

指向函数的指针,从二进制角度考虑,数组名是该数组数据段首地址,函数名就是该代码段的首地址。

设有如下程序:

#include

void inc(int *val)

{(*val)++;}

main()

{void (*fun)(int *);//定义了一个指向函数的指针(下转第8716页)

(上接第8713页)

int a=3;

fun=inc; //这个函数指针指向了函数的入口地址

(*fun)(&a);//此时该语句与inc(&a); 等价

printf("%d" , a);}

程序运行的结果与上面第4个问题完全相同。丰富了访问函数的方法。

6 结束语

指针可以指向任何类型的变量用,有效地表示出复杂的数据结构;指针可以指向函数;用于函数参数传递,达到更加灵活使用函数的目的,有了指针在编程时丰富了访问内存单元的手段和方法,使C语言程序的设计更加灵活、实用、高效。

参考文献:

[1] 陈强.C语言核心开发技术从入门到精通[M].北京:电子工业出版社,2009.

[2] 匡松.C语言程序设计[M].北京:中国铁道出版社,2008.

c语言指针范文6

关键词:C语言;指针;内容编排体系;教学方法

现今,几乎所有的理科非计算机专业都开设了“C语言程序设计”课程,旨在培养学生的编程能力,提高计算机素养,为以后的学习、工作及科研打下坚实的基础。

C语言有着丰富的内容,指针部分是C语言的基本组成部分,由于其在程序编写及软件开发中发挥着重要的作用,它成为C语言的重点内容;同时,由于其理解和掌握上存在的难度,它也是C语言的难点内容。

随着教学改革的深入开展,许多学校都对该课程进行了调整,其中一项就是课时的调整,目前,存在着64+32、48+32、32+32等多种课时设置方案。在课时有限甚至是偏少的情况下,如何让学生能更好地理解和掌握指针内容,成为教师面临的研究课题。

关于整个课程的教学改革与创新,很多文章进行了介绍。尤其是关于指针内容的教学探讨与改革,一直没有停止,很多好的研究成果见诸报端,成为教师的有益参考和借鉴。这些探讨主要集中在如何对内容进行讲授、如何帮助学生理解难点解答疑问、讲授手段探索、例题精选等方面,这对教师和学生来说都是不无裨益的。尽管如此,教学实践中,还是经常会出现学生们对指针理解不够透彻,从而影响指针的使用和应用。

通观现在的C语言教材,在内容编排上,大多数是将指针内容独立成章,对指针集中讲解,并且其在整个内容编排体系中所处位置偏后。这样编排的好处是指针内容比较集中,讲起来易进行综合分析、比较,但问题也有,即学生理解和消化指针内容的时间不够,从而影响学习效果。

本文就是针对这一问题展开讨论的,试图在这方面能作些改革尝试,改进教学效果。

1 指针内容体系的新设置

近年来,针对指针内容教学中出现的问题,北京师范大学信息技术与应用课程组进行了认真思考和分析,试图找到解决问题的办法。这些尝试主要集中在上课的讲授方法、手段、技巧,以及上机试验的设计与考核等方面。我们的教学团队也进行过探讨,并且借鉴已有改革成果,教学效果有所改善,但不明显。这促使我们进行更深刻的思考与反思,探究新的解决方法。2004年,我们的教学团队开始了内容编排体系的改革尝试。

改革课程内容编排体系,既要注意体系的科学与合理,更要兼顾能解决教学中存在的问题。于是,我们针对c语言中几大主要模块重新设计与布局,本文介绍的是指针内容体系的调整与改革。

新的指针内容编排体系的指导思想是打破指针内容编排上的“独立成章”,代之以将指针内容贯穿于整个课程体系的始终。

在这种思想的指导下,我们在课程开始就设置指针的基本概念,让学生更早认识指针这一对象。当然,这个时期的讲解和介绍主要聚焦于基本概念,把它同基本数据类型一起进行讲解。然后,在后面的章节中有机穿插讲解相应的指针内容及应用。比方说,在讲函数的时候,将指针和函数结合,讲解指针性形参、指针值函数、函数指针等内容;在讲数组时,将数组和指针结合,讲解用指针操纵数组、指针数组、数组指针等内容;在讲文件时,讲解文件指针等;在讲动态数据结构时,讲解指针更广泛和深刻的应用,等等。

这样一种内容的编排方法,虽然不会出现指针内容的“独立成章”,但是几乎在后面的每章中都会出现与指针内容相关的小节,体现出“将指针内容贯穿于整个课程体系”的指导思想。这样做,可能有人会担心削弱了指针在C语言中的地位,其实,这种担心是多余的。因为关于指针的内容没有减少,只是将集中讲解改为逐步、循序、适时讲解。这样做的好处是明显的:

1)增加了学生的消化理解时间,更好地体现了指针内容的重要性。

将指针内容进行拆分,合理地分配到相应的章节中去,这显然拉长了学生对指针内容的消化和理解时间,从而有助于对内容的更好掌握。这也很好地克服了以往内容偏后导致的理解消化时间不够的不足。这种编排方法不仅讲解了指针的全部内容,而且还跟其他内容进行了有机结合。因此,这种编排体系不仅没有降低指针在C语言中的地位,反而更能体现指针内容的重要性。

2)降低了指针的难度和学生对指针的畏惧。

众所周知,指针是C语言的重要内容,同时也是难点。许多学生从心理上有种恐惧感,一定程度影响了学习效果。我们设计的“化整为零”的内容编排方法,让学生在慢慢消化的过程中,逐步掌握指针的内容。在看似不知不觉的过程中,达到了“各个击破”的良好效果。因此,可以说在一定程度上降低了指针内容的难度。

3)增强了学生应用指针的直观感受。

在相应的章节中穿插讲解指针内容,并有机结合,给出恰当的实例和应用背景,这样学生能感受到指针内容使用的必要性和自然感,了解应用的背景,从而增强对指针应用的直观感受。

4)指针内容体系新设置示例。

在这里以函数和数组两章为例来展示我们的新做法。

函数:

1 函数的定义

2 函数的调用

2.1 调用方式

2.2 调用机理

2.3 声明被调函数与函数原型

2.4 嵌套调用

2.5 递归函数与递归调用

3 变量的作用域

3.1 局部变量

3.2 全局变量

4 变量的存储类别

4.1 auto类别

4.2 extern类别

4.3 register类别

4.4 static类别

5 函数与指针

5.1 指针变量作函数的参数

5.2 指向函数的指针

5.2.1 用函数指针调用函数

5.2.2 用函数指针作函数参数

5.3 指针值函数

数组:

1 一维数组

1.1 定义与初始化

1.2 数组元素的引用

1.2.1 下标引用

1.2.2 指针引用

1.3 数组指针作函数参数

1.4 数组的排序

1.5 结构体数组

1.6 批量数据的存取与文件操作

2 二维数组与多维数组

2.1 定义与初始化

2.2 数组元素的引用

2.2.1 下标引用

2.2.2 指针引用

2.3 数组指针作函数参数

2.4 多维数组

3 字符数组与字符串

3.1 字符数组与字符串

3.2 字符串处理函数

3.3 指针与字符串

3.4 字符串指针作函数参数

4 指针数组与指向指针的指针

4.1 指针数组

4.2 指向指针的指针

4.3 指针数组与命令行参数

2 配套的改革措施和实践效果

为了让上面给出的指针内容编排方法真正发挥作用,我们还做了其他一些配套工作。

首先,进行整个课程内容体系的重新调整。因为指针内容涉及许多章节,所以,指针内容体系设置的改革必须同时考虑其他相关章节的安排与衔接,这样才能真正发挥改革措施的作用。在这方面,我们主要考虑了数组、函数、文件以及动态数据结构等内容的重新编排。

其次,对上机实践环节作了相应设计。上机实践应当与课堂教学同步、配套。为此,我们针对新的内容设置体系,设计了相应的上机实践任务、规范与要求。

最后,编写了体现新思想的讲义。为了配合教学改革,我们编写了体现改革思想的讲义,学生能在新的体系框架下开展学习,确保良好的学习效果。将来,我们将编写正式的教材,使改革更深入。