\n",a,b,*p1,*p2,p1,p2,&p1,&p2);
p1++;p2++; /*地址改变以后,数据值与地址的变化*/
printf("%d %d %d %d %x %x %x
%x\n",a,b,*p1,*p2,p1,p2,&p1,&p2);
printf("%d %d\n",p1-p2,p2-p1); /*指针变量的相减*/
}
3指针变量作为函数的参数
在函数部分我们知道可以使用return语句返回函数值,这种方式只能返回一个数据,但使用指针可以实现对数据的间接访问,用指针作为函数的参数,返回后就可以修改多个值了。
例子:调用函数,计算两个数相加和相减的值,并在main函数中打印。
#include "stdio.h"
void fun ( int x , int y,int *pa,int *ps ) { /*两个数交换,形参为指针*/
int add=0 , sub=0 ;
*pa=x+y ;
*ps=x–y ;} /*指针内容改变*/
main ( ){
int a , b , add=0 , sub=0 ;
scanf ( " %d %d " , &a , &b ) ;
printf ( " a=%d , b=%d \n " , a , b ) ;
fun ( a , b,&add,&sub) ;
printf ( " %d + %d =%d \n " , a , b , add ) ;
printf ( " %d – %d =%d \n " , a , b , sub ) ;}
在利用指针作为函数的参数是,要了解在调用函数中如何正确的使用指针变量才可以改变参数的值,例如要交换两个数据的值,可以由3种方式:
3.1以普通变量作为参数完成交换:
void swap1(int x,int y){
int temp;
temp=x,x=y,y=temp;
}
这种调用仅仅是在函数中将数据交换了,当函数调用结束,返回到主函数中时,形参内存被释放,实际并没有交换。
3.2以指针变量作为参数实现数据交换:
void swap1(int *p1,int *p2){
int *p;
p=p1,p1=p2;p2=p;
}
这种交换同样实现不了功能,调用结束后仅仅是实现了两个指针指向的交换,而并没有实现真正的数据交换。
3.3交换指针变量所指向的内容:
void swap4(int *p1,int *p2){
int temp;
temp=*p1,*p1=*p2,*p2=temp;
}
这样才算实现了真正的数据交换。
4指针与一维数组
数组是一组相同类型数据的集合,数组中各个元素在内存占据连续的存储单元,每个内存单元都有相应的地址。数组所在内存单元的首地址称为数组的指针,数组元素所在内存单元的首地址称为数组元素的指针,数组指针和数组元素指针是两个不同的概念。
4.1指向一维数组元素的指针
不带方括号的数组名就是该数组的指针,可以把数组名或者第一个元素的地址赋值给指针。例如以下几个语句是合法的:
int a[5],*p,*q;
p=a; //保存数组的首地址
q=&a[3]; //保存数组中第四个元素的地址
由于数组名代表一维数组的首地址,也就是第0个元素的地址,因此以下两条语句是等价的:
p=a;
p=&a[0];
4.2用指针访问一维数组元素
指针指向数组之后,就在指针和数据之间建立了联系。可以通过指针访问数组的各个元素,当然也可以使用下标访问数组元素,但是使用指针访问能使程序占用内存更少,运行速度更快。以下代码借助指针实现了数组元素的输入和输出:
#include "stdio.h"
main(){
int arr [10], *pa=arr, i;
printf("Input 10 numbers: ");
for(i=0; i<10; i++)
scanf("%d", pa+i); /*使用指针变量来输入数组元素的值*/
printf("array[10]: ");
for(i=0; i<10; i++)
printf("%d ", *(pa+i)); /*使用指向数组的指针变量输出数组*/
printf("\n");
}
由于指针是变量,在元素的处理过程中,可以通过对地址的运算,直接得到元素的地址,然后访问数据元素,上面的代码也可以写成:
#include "stdio.h"
main(){
int arr [10], *pa=arr;
printf("Input 10 numbers: ");
for(;pa
scanf("%d", pa); /*使用指针变量来输入数组元素的值*/
printf("array[10]: ");
pa=arr;
for(;pa
printf("%d ", *pa); /*使用指向数组的指针变量输出数组*/
printf("\n");
}
这种访问方式也成为指针法访问数组中的元素,能够提高程序质量。在使用指针时应特别注意指针的越界问题,注意指针变量的变化。
例子:使用指针变量统计输入数据中的正数个数。
#include "stdio.h"
main() {
int a[10];
int i,*p,count=0;
for(i=0;i<10;i++)
scanf("%d",a+i);
printf("\n");
for(p=a;p
if (*p>0) {
count ++;
printf("%d",*p);
if (count % 4==0) printf("\n");
}
}
}
摘自 letthinking的专栏