论文部分内容阅读
【摘 要】指针是c语言中广泛使用的一种数据类型,运用指针编程是C语言的主要风格之一。利用指针变量可以直接对内存中各种不同数据进行快速处理,理解和运用好指针可以编出简洁明快、性能强的C程序。
【关键词】C语言 指针 地址
指针是C语言中一个特殊的数据类型,也是最重要的基本概念之一,理解和运用好指针可以灵活方便地处理程序中各种复杂问题,可以轻松完成其他高级程序设计语言不便完成的任务。
1.指针的概念
在C语言中允许用一个变量来存放指针,这种变量称为指针变量。一个指针变量的值就是某个内存单元的地址或称为内存单元的指针,一个指针变量可以被赋予不同的指针值。定义指针的目的是为了通过指针去访问内存单元。
指针变量的定义形式:类型说明符*变量名;其中*表示一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量的数据类型。
指针变量同普通变量一样,使用不仅要定义说明,而且必须赋值,未经赋值的指针变量不能使用,否则会造成系统混乱,甚至死机。(1)把一个指针变量的值赋予指向相同数据类型的指针变量(int a,*pa=&a,*pa;pb=pa;)。(2)把数组的首地址赋予指向数组的指针变量(int a[5],*pa;pa=a;或者pa=&;a[0];)。(3)把字符串的首地址赋予指向字符类型的指针变量(char *pc;pc="c language";/ char *pc="c language")。这里存放的是该字符串的首地址装入指针变量。(4)把函数的入口地址赋予指向函数的指针变量。int(*pf)();pf=f;/*f为函数名*/。但是如果把一个数赋予指针变量,如int *p; p=1000是错误的;此外被赋予的指针的变量前不能加*说明符,如*P=&a也是错误的。
2.指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。如:int*ptr;//指针所指向的类型是int型;int**ptr;//指针所指向的类型是int*型。说明:指针的类型和指针所指向的类型是两个概念,把与指针搅和在一起的“类型”这个概念分成“指针的类型”和“指针所指向的类型”两个概念,是精通指针的关键点之一。
3.指针的值
指针的值是指针本身存储的数值,这个值将被编译器当做一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。如果说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域,如果说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念,如果指针未初始化,它所指向的内存区是不存在的,或者说是无意义的。
4.指针的自加减运算
指针加减整型表达式n,仍得同类型指针;运算规则是地址值增减n倍对象类型长度。如:long a[]={1,2,3,4},*p=a;p=a+2; /*p指到a[2] 即p=&a[2]; */p++; /* 相当于p=p+1; */。特殊表达式*p++; 和 *p--; 运算是先取用对象,然后p自加减1;++*p;与 *++p; 完全相同。--*p;与*--p;完全相同。
5.指针作为函数参数
在C语言的函数调用中,所有的参数传递都是使用“值传递”,如果在被调用函数中改变了形参的值,对调用函数中的实参没有影响。一般变量作函数参数时,主要通过函数中的return语句,将一个函数值带回到调用函数,如果想要得到几个返回值,必须通过全局变量。使用指针作为函数参数,就可以通过函数调用改变调用函数中指针所指向的地址的值。
如:void getptr(int *p,int num)
{ p=(int *)maccol(num*sizeof(int));
return; }
void main()
{ int *ptr;
int k;
getptr(ptr,10);
for(k=0;k<10;k++)
{ scanf("%d",&ptr[k]); } }
这个程序要求的是给ptr动态分配内存,所以当分配了一块的内存,并且这个内存的首地址赋给p,这时候p指向的东西改变了,但没有影响到ptr指针,ptr指针指向的还是它原来的数据,只是p指针的数据改变了。引入一个指针的指针,让p指针指向ptr这个指针,这时候动态的分配的数据块传给*p,这个*p就是ptr,所以给ptr分配内存成功。
6.指针数组
数组元素也可以是指针类型,数组元素为指针的数组称之为指针数组。指针数组是一种很有用的数据结构,它使得数组元素可以指向不同的内存块,实现对不同大小的内存块的数据统一管理,编译时,根据数组的大小为指针数组分配相应的内存空间。
如:#include
void main( )
{int a[2][3]={1,3,5,7,9,11};
int*pa[2], i, j;
pa[0]=a[0];
pa[1]=a[1];
for(i=0;i<2; i++)
for(j=0;j<3;j++,pa[i]++)
printf("a[%d][%d]=%d\n",i,j,*pa[i]);
return;}
程序中,pa[0]=&a[0]表示将数组a第1行元素的首地址赋给指针数组pa[0],所以也可以写成:"pa[0]=&a[0][0];",使用了表达式:pa[i]++来修改指针数组pa所指向的数据。例如:当i=0时,通过pa[i]++便得到数组元素a[0][0]、a[0][1]和a[0][2]的地址。
总之,指针是C语言教学的重点也是难点,正确理解和灵活应用指针,能动态分配内存,有效地表示复杂的数据结构,有效而方便地使用数组,编写出简洁的C程序。■
【关键词】C语言 指针 地址
指针是C语言中一个特殊的数据类型,也是最重要的基本概念之一,理解和运用好指针可以灵活方便地处理程序中各种复杂问题,可以轻松完成其他高级程序设计语言不便完成的任务。
1.指针的概念
在C语言中允许用一个变量来存放指针,这种变量称为指针变量。一个指针变量的值就是某个内存单元的地址或称为内存单元的指针,一个指针变量可以被赋予不同的指针值。定义指针的目的是为了通过指针去访问内存单元。
指针变量的定义形式:类型说明符*变量名;其中*表示一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量的数据类型。
指针变量同普通变量一样,使用不仅要定义说明,而且必须赋值,未经赋值的指针变量不能使用,否则会造成系统混乱,甚至死机。(1)把一个指针变量的值赋予指向相同数据类型的指针变量(int a,*pa=&a,*pa;pb=pa;)。(2)把数组的首地址赋予指向数组的指针变量(int a[5],*pa;pa=a;或者pa=&;a[0];)。(3)把字符串的首地址赋予指向字符类型的指针变量(char *pc;pc="c language";/ char *pc="c language")。这里存放的是该字符串的首地址装入指针变量。(4)把函数的入口地址赋予指向函数的指针变量。int(*pf)();pf=f;/*f为函数名*/。但是如果把一个数赋予指针变量,如int *p; p=1000是错误的;此外被赋予的指针的变量前不能加*说明符,如*P=&a也是错误的。
2.指针所指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。如:int*ptr;//指针所指向的类型是int型;int**ptr;//指针所指向的类型是int*型。说明:指针的类型和指针所指向的类型是两个概念,把与指针搅和在一起的“类型”这个概念分成“指针的类型”和“指针所指向的类型”两个概念,是精通指针的关键点之一。
3.指针的值
指针的值是指针本身存储的数值,这个值将被编译器当做一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。如果说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域,如果说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念,如果指针未初始化,它所指向的内存区是不存在的,或者说是无意义的。
4.指针的自加减运算
指针加减整型表达式n,仍得同类型指针;运算规则是地址值增减n倍对象类型长度。如:long a[]={1,2,3,4},*p=a;p=a+2; /*p指到a[2] 即p=&a[2]; */p++; /* 相当于p=p+1; */。特殊表达式*p++; 和 *p--; 运算是先取用对象,然后p自加减1;++*p;与 *++p; 完全相同。--*p;与*--p;完全相同。
5.指针作为函数参数
在C语言的函数调用中,所有的参数传递都是使用“值传递”,如果在被调用函数中改变了形参的值,对调用函数中的实参没有影响。一般变量作函数参数时,主要通过函数中的return语句,将一个函数值带回到调用函数,如果想要得到几个返回值,必须通过全局变量。使用指针作为函数参数,就可以通过函数调用改变调用函数中指针所指向的地址的值。
如:void getptr(int *p,int num)
{ p=(int *)maccol(num*sizeof(int));
return; }
void main()
{ int *ptr;
int k;
getptr(ptr,10);
for(k=0;k<10;k++)
{ scanf("%d",&ptr[k]); } }
这个程序要求的是给ptr动态分配内存,所以当分配了一块的内存,并且这个内存的首地址赋给p,这时候p指向的东西改变了,但没有影响到ptr指针,ptr指针指向的还是它原来的数据,只是p指针的数据改变了。引入一个指针的指针,让p指针指向ptr这个指针,这时候动态的分配的数据块传给*p,这个*p就是ptr,所以给ptr分配内存成功。
6.指针数组
数组元素也可以是指针类型,数组元素为指针的数组称之为指针数组。指针数组是一种很有用的数据结构,它使得数组元素可以指向不同的内存块,实现对不同大小的内存块的数据统一管理,编译时,根据数组的大小为指针数组分配相应的内存空间。
如:#include
void main( )
{int a[2][3]={1,3,5,7,9,11};
int*pa[2], i, j;
pa[0]=a[0];
pa[1]=a[1];
for(i=0;i<2; i++)
for(j=0;j<3;j++,pa[i]++)
printf("a[%d][%d]=%d\n",i,j,*pa[i]);
return;}
程序中,pa[0]=&a[0]表示将数组a第1行元素的首地址赋给指针数组pa[0],所以也可以写成:"pa[0]=&a[0][0];",使用了表达式:pa[i]++来修改指针数组pa所指向的数据。例如:当i=0时,通过pa[i]++便得到数组元素a[0][0]、a[0][1]和a[0][2]的地址。
总之,指针是C语言教学的重点也是难点,正确理解和灵活应用指针,能动态分配内存,有效地表示复杂的数据结构,有效而方便地使用数组,编写出简洁的C程序。■