崔孝凤
摘要:针对C语言中的各类地址进行了讨论,提出了深入理解C语言的各类地址的存储原理能够更好地理解和学习C语言,对初学者具有很好的启发和引领作用。
关键词:C语言;地址;存储单元;数据类型;数组
中图分类号:G642 文献标识码:A 文章编号:1009-3044(2018)30-0232-02
对于初学C语言的同学来说,C语言的地址可谓一大难点,如何正确地理解C语言中的各种地址关系到对不同数据类型的使用,直接关系到编程质量,本文从C语言地址的含义、应用等方面解析,对C语言学习者起到启发和引领作用。
1 C语言地址的基本概念
C语言地址,是指内存地址的概念。计算机内存中的各个存储单元都是有序的,按字节编码,这个编码就是地址,可以把存储单元的地址形象地理解成我们房屋的门牌号。
2 C语言中的地址种类
C语言的数据类型非常丰富,不同类型的变量所占的存储单元大小是不一样的,下面具体解析一下。
1)整型变量的地址
C语言中的整型变量可以分为短整型short int、基本整型int及长整型long int三种类型,这三种类型所占的内存单元字节数是不一样的,短整型变量一般是占用2个字节,后面两种一般是占用4个字节,可以使用关键字sizeof返回,如可以使用语句printf("%d %d %d\n",sizeof(short int),sizeof(int),sizeof(long int));来返回这三种数据类型的变量所占的内存字节数。
2)实型变量的地址
C语言中的实型变量可以分为单精度实型float、双精度实型double及长双精度实型long double三种类型,在内存中分别占用4、8、16个字节,可以使用语句printf("%d %d %d\n",sizeof(float),sizeof(double),sizeof(long double)); 来返回这三种数据类型的变量所占的内存字节数。
3)字符型变量的地址
C语言中的字符型变量就是char,占用1个字节。可以使用语句printf("%d\n",sizeof(char));来返回一个字符型变量在内存中所占的字节数。
4)数组的地址
C语言中的数组存储的是同一种类型的数据,它们的存储单元是连续的一片存储空间。一个数组所占单元的多少既跟数组的数据类型有关系,也跟数组的大小密切相关,比如如果有这样的定义int a[10];那么数组a所占空间就应该是10*4即40个字节,可以使用语句printf("%d\n",sizeof(a));来输出数组a所占的内存单元所占字节数,确实是40个字节。如果是double a[10];呢,显然数组a所占内存空间就应该是10*8即80个字节,所以数组在使用前一定首先要定义好,这是很明显的道理。这儿需要说明一下的是数组的首地址,C语言中规定数组名表示了数组的首地址,即对于数组a来说,a就相当于&a;[0],所以由此我们在编程中就可以很方便地访问到数组中的所有元素。
5)指针的地址
C语言的指针可以说是C语言的灵魂所在,我们说指针就是地址,那么指针也是C语言的一种数据类型,它的地址占几个字节呢?不管指针指向什么类型的变量,它所占的内存空间都是8个字节(说明:一般编译器会把指针的长度定义为系统的字长),比如int i,*pi=&i;;
char ch,*pch=&ch;; double f,*pf=&f;; printf("%d\n",sizeof(pi)); printf("%d\n",sizeof(pch)); printf("%d\n",sizeof(pf));我们都会得到相同的结果8。
3 C语言中不同地址的应用
1)基本数据类型地址的应用
C语言的基本数据类型是指基本整型int、实型float和字符型char,对于这三种基本类型,当定义变量时系统就会给它们分配相应的内存单元,对它们进行赋值等操作时,系统会直接从相应的内存单元地址中取出相应的值直接进行操作。对于编程者来说,此时感觉不到地址的作用,其实地址随时在起作用,比如下面的程序例子。
#include
int main(void)
{int a;
printf("请输入一个整数:\n");
scanf("%d",&a;);
a=a+1;
printf("a=%d\n",a);
return 0;
}
從一开始定义变量a,系统首先给变量a分配内存地址,然后使用scanf输入数据,输入的数据保存到了变量a的内存地址中,当执行语句a=a+1;进行运算时系统会首先从变量a的相应存储地址单元中取出变量a的值,运算完后再把结果保存到变量a的存储单元中,最后使用printf输出变量的值时也需要从变量的存储单元中取出变量a的值。所以整个程序执行过程中一直在使用变量a的地址,不过用户浑然不觉罢了。
2)数组地址的应用
C语言中的数组是一组名称相同类型相同的数据的集合,数组名称代表了数组的起始地址,一旦定义数组,系统就给该数组分配一片连续的相应的存储空间。对数组的使用其实就是对数组元素的各种操作,既可以使用下标元素的方式使用,也可以使用地址的方式,使用下标方式对初学者来说更好理解,使用地址方式更接近地址本质,编程者可以根据自己的喜好选择喜欢的方式。
请看下面的程序:
程序功能:从键盘上输入10个整数,然后再在屏幕上输出来。
程序源代码如下:
#include
int main(void)
{int a[10],i;
printf("请输入10个整数,用空格分隔:\n");
for(i=0;i<10;i++)
scanf("%d",&a;[i]);//或者使用语句:scanf("%d",a+i);
printf("您刚才输入的10个整数如下:\n");
for(i=0;i<10;i++)
printf("%d ",*(a+i));//或者使用语句:printf("%d ",a[i)]);
return 0;
}
说明:输入数据scanf("%d",&a;[i]);时使用的是对数组元素直接访问的方式,输出数据printf("%d ",*(a+i));时使用的是对数组元素间接访问的方式,其中a+i表示的就是第i个元素的地址,利用间接取值运算符*取出数组元素的值。
如果在程序中加一行代码依次输出10个数组元素的地址的话,如:
for(i=0;i<10;i++)
printf("%d ",a+i);
可能会看到如下的结果:
6487584 6487588 6487592 6487596 6487600 6487604 6487608 6487612 6487616 6487620
从这个结果可以清楚地看出,数组的地址是连续的,每相邻两个元素的地址相差4个字节,正好是int型变量在内存中所占字节数,显然,如果是字符型的话,每两个元素之间相差的地址就应该是1个字节,我们可以方便地验证。就是说,不同类型的数组,每个元素所占的地址空间是跟所属类型相对应的。从这个例子我们进一步明白C语言中的数据的确是存储在相应内存单元中的。
4 结论
C语言中每一个变量和函数都对应着相应的地址,正确理解各类地址有利于对C语言更深入的理解和掌握,相信本文对地址的探讨对初学C语言的读者能够起到一定的启发和引领作用。
参考文献:
[1] 刘林香,许燕青. 谈C语言中指针、地址和数组的相互关系[J].硅谷,2009-01-23.
[2] 郭偉刚. C语言教学中运用printf函数帮助学生理解地址和指针[J]. 计算机教育,2008-12-10.
[3] 陆云飞. 浅谈C语言数据与内存分配空间和地址的联系[J].科技信息,2006-08-05.
[4] 杨延玉. C语言中的地址类型[J]. 平原大学学报,2005-12-20.
[5] 魏力生,朱方洲. 谈如何掌握C语言中数组、指针与地址相互关系[J].电脑知识与技术,2003-04-15.
【通联编辑:王力】