C语言基础知识回顾 %超适用于计算机二级%
第四章 指针
4.1 指针变量的定义
-
指针变量必须区分基类型,基类型不同的指针变量不能混合使用.
-
e.g.
int **p, *s, k=20;
s=&k;
p=&s; /*三者关系如下图*/
4.2 给指针变量赋值
-
一个指针变量可以通过不同的方式获得一个确定的地址值,从而指向一个具体的对象.
-
e.g.
int k=1, *q, *p;
q=&k;
//s=&(k+1); /*不合法赋值*/
p=q; /*该关系如下图*/
p=NULL; /*等价于p=’\0’;或p=0; 表示给指针变量赋空值.*/
4.3 对指针变量的操作
(1)通过指针来引用一个存储单元: 通过“*”(间接访问运算符).
e.g.
int *p, i=10, j;
p=&i;
j=*p; /*把p所指的内容i赋值给j,等价于j=i*/
int *p, k=0;
p=&k;
*p=100; /*把100放到p所指的k中,即k=100*/
*p=*p+1; /* p所指的内容加1,即k=k+1=101.*/
/*等价于*p+=1; 或++*p; 或(*p)++ */
(2) 移动指针,使其指向相邻的存储单元. 该操作用于数组或字符串这种连续的存储单元才有意义.
e.g.
int *p,*q, k;
…
q=p+2; q++; q--; p++; /* 均为合法的语句*/
k=p-q; /*k为两个指针间隔的存储单元数*/
4.4 函数间地址值的传递
(1) 指针变量做形参,地址做实参.
#include <stdio.h>
int myadd (int *a, int *b) /*指针变量作形参*/
{
int sum;
sum=*a+*b; return sum;
}
void main ()
{
int x,y,z;
scanf("%d %d", &x, &y);
z=myadd(&x, &y); /*地址作实参*/
printf(“%d+%d=%d\n”,x, y, z);
}
#include <stdio.h>
void swap (int *a, int *b) /*指针变量作形参*/
{
int t; t=*a; *a=*b; *b=t;
}
void main ()
{
int x=20,
y=30;
swap(&x, &y); /*地址作实参,通过传送地址值在被调用函数中直接改变函数中变量的值*/
}
(2) 函数值为指针类型,返回地址值.
#include <stdio.h>
int *fun (int *a, int *b) /*函数值类型为指针类型*/
{
if(*a>*b) return a; return b;
}
void main ()
{
int *p, x, y;
scanf(“%d%d”,&x,&y);
p=fun(&x,&y); /*返回一个地址给指针p*/
}