c语言指针变量求和,全面解析C语言中的指针变量

摘要:指针是C语言中的一个重要概念,正确熟练地掌握指针的概念和指针的使用就能设计出复杂的数据结构和高效的程序。在此重点论述了指针的概念及其在程序中的应用。

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

中图分类号: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.

[3] 李俊杰.C语言复习指南与题解[M].北京:清华大学出版社,2003.

[4] 谭浩强.C程序设计[M].北京:清华大学出版社,2005.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值