C语言程序设计(第七章 指针)
一、指针是什么
由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化地称为“指针”。意思就是通过它能找到以它为地址的内存单元。
假如有输入语句:
scanf("%d",&x);
k=x+y;
这种直接按变量名进行的访问,称为**“直接访问”**方式
还可以采用**“间接访问”**的方式,即将变量i的地址存放在另一个变量中,然后通过该变量来找到变量i的地址,从而访问i变量。
i_pointer=&i
(1)将3直接送到变量i所标识的单元中,例如“i=3”。
(2)将3送到变量i_pointer所指向的单元(即变量i的存储单元),例如“* i_pointer=3;”,其中* i_pointer表示i_pointer指向的对象。
指向就是通过地址来体现的,由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元(如同说,一个房间号指向一个房间一样),将地址形象化地称为“指针”。
如果有一个变量专门用来存放另一个变量的地址(即指针),则它称为“指针变量”,指针变量就是地址变量,用来存放地址,指针变量的值是指针。
二、指针变量
1、使用指针变量的例子
例题1:通过指针变量访问整型变量
#include<stdio.h>
int main(){
int a=100,b=200;
int * pa,* pb;
pa=&a;
pb=&b;
printf("a=%d,b=%d\n",a,b);
printf("* pa=%d,* pb=%d\n",* pa,* pb);
return 0;
}
执行结果:
a=100,b=200
* pa=100,* pb=200
2、怎样定义指针变量
定义指针变量的一般形式为:
类型名 * 指针变量名
int *pa,*pb;
float * pc;
char * pd;
可以在定义指针变量时,同时对它初始化,如:
int * pa=&a,* pb=&b
一个变量的指针的含义包括两个方面,一是以存储单元编号表示的纯地址,二是它指向的存储单元的数据类型(如 int,char,float等)。
指向整型数据的指针表示为“ int *”,读作“指向int的指针”或简称“int 指针”。
3、怎样引用指针变量
在引用指针变量时,可能有三种情况:
(1)给指针变量赋值,如:
p=&a
指针变量p的值是变量a的地址,p指向a
(2)引用指针变量指向的变量
如果已经执行(1)的操作,即指针变量p指向了整型变量a,则
printf("%d",* p);
其作用是以整数形式输出指针变量p所指向的变量的值,即变量a的值。
如果有以下赋值语句:
* p=1;
表示将整数1赋给p当前所指向的变量,如果p指向变量a,则相当于把1赋给a,即”a=1“。
(3)引用指针变量的值,如
printf("%o",p);
作用是以八进制数形式输出指针变量p的值,如果p指向了a,就是输出了a的地址,即&a
& 取地址运算符
* 指针运算符(或称”间接访问“运算符),* p代表指针变量p指向的对象
例题2:输入a和b两个整数,按先大后小的顺序输出a和b
#include<stdio.h>
int main(){
int * pa,* pb,* pc,a,b;
printf("请输入两个整数:\n");
scanf("%d,%d",&a,&b);
pa=&a;
pb=&b;
if(a<b){
pc=pa;
pa=pb;
pb=pc;
}
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",* pa,* pb);
return 0;
}
执行结果:
请输入两个整数:
4,5
a=4,b=5
max=5,min=4
3、指针变量作为函数参数
例题3:输入a和b两个整数,对输入的两个整数按大小顺序输出,用函数处理,而且用指针类型的数据作函数参数。
#include<stdio.h>
int main(){
void swap(int * pa,int * pb);
int a,b;
int * p1,* p2;
printf("请输入两个整数:\n");
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(a<b){
swap(p1,p2);
}
printf("max=%d,min=%d\n",a,b);
return 0;
}
void swap(int * pa,int * pb){
int temp;
temp=* pa;
* pa=* pb;
* pb=temp;
}
执行结果:
请输入两个整数:
5,6
max=6,min=5
例题4:输入3个整数a,b,c,要求按大到小的顺序将它们输出。用函数实现。
#include<stdio.h>
int main(){
void swaps(int * pa,int * pb,int * pc);
int a,b,c,* p1,* p2,* p3;
printf("请输入三个整数:\n");
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;p2=&b;p3=&c;
swaps(p1,p2,p3);
printf("the order is:%d,%d,%d\n",a,b,c);
return 0;
}
void swaps(int * pa,int * pb,int * pc){
void swap(int * q1,int * q2);
if(* pa<* pb) swap(pa,pb);
if(* pa<* pc) swap(pa,pc);
if(* pb<* pc) swap(pb,pc);
}
void swap(int * q1,int * q2){
int temp;
temp=* q1;
* q1=* q2;
* q2=temp;
}
执行结果:
请输入三个整数:
9,5,10
the order is:10,9,5
4、通过指针引用数组
所谓数组元素的指针就是数组元素的地址,可以用一个指针变量指向一个数组元素。例如:
int a[10]={1,3,5,7,9,11,13,15,17,19};
int * p;
p=&a[0];
引用数组元素可以用下标法(如 a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。
在指针已指向一个数组元素时,可以对指针进行以下运算:
加一个整数(用+或+=),如p+1;
减一个整数(用-或-=),如p-1;
自加运算,如p++,++p;
自减运算,如p–,--p;
两个指针相减,如p1-p2(只有当p1和p2都指向同一个数组中的元素才有意义)
p+1指向同一个数组中的下一个元素,p-1指向同一个数组中的上一个元素
引用一个数组元素,可以用下面两种方法:
(1)下标法,如a[i]形式;
(2)指针法,如* (a+1)或* (p+i)。其中a是数组名,p是指向数组元素的指针变量,其初值p=a
例题5:通过指针变量输出整型数组a的十个元素。
#include<stdio.h>
int main(){
int i,a[10],* p=a;
printf("请输入10个整数:");
for(i=0;i<=9;i++)
scanf("%d",p++);
p=a;
for(i=0;i<=9;i++,p++){
printf("%d\t",* p);
}
printf("\n");
return 0;
}
执行结果:
请输入10个整数:0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
5、用数组名作函数参数
字符串的引用方式:
例题6:将字符串a复制为字符串b,然后输出字符串b。
#include<stdio.h>
int main(){
char a[]="I am a student.",b[20];
int i;
for(i=0;* (a+i)!='\0';i++){
* (b+i)=* (a+i);
}
* (b+i)='\0';
printf("string a is: %s\n",a);
printf("string b is:");
for(i=0;b[i]!='\0';i++){
printf("%c",b[i]);
}
printf("\n");
return 0;
}
执行结果:
string a is: I am a student.
string b is: I am a student.
#include<stdio.h>
int main(){
char a[]="I am a boy.",b[20],* p1,* p2;
p1=a;p2=b;
int i;
for(;* p1!='\0';p1++,p2++){
* p2=* p1;
}
* p2='\0';
printf("string a is: %s\n",a);
printf("string b is: %s\n",b);
return 0;
}
执行结果:
string a is: I am a boy.
string b is: I am a boy.
|