地址与指针
存储地址
每一个变量地址的位置是该变量所占存储单元的第一个字节
指针变量
存储内存地址的变量p
类型名 *指针变量名
或
类型名 *指针名1,指针名2…
【例子1】
int *pi;
表明只能存放int类型变量的地址
称作int是指针变量的基类型
【例子2】
double *pd;
char *s1,*s2;
pd的基类型为double型,s1,s2的基类型为char型
指向指针的指针
【例子3】
int **p, k,*s = &k;
p = &s;
【例子4】
#include<stdio.h>
main()
{
int **k , *a ,b = 100;
a = &b , k = &a;
printf("%d\n",**k);
}
结果为100
【分析】
*a为指针变量,**k为指向指针的指针
b为100,b的地址为110,内容为100
a指向b的地址假设为111,内容为b的地址110
k指向a的地址假设为112,内容为a的地址111
那么**k为多少?
k为a的地址112,*k为a的内容110,**k为b的内容100。
指针的赋值
【例子5】
int k, *q,*p;
k = 1;
q = &k;
p = q;
那么q 和p 指向同一个地方k
赋值为空
int *p;
p = pull;
p = 0;
p ='\0';
【例子6】用指针指向两个变量,通过指针运算选出最小的那个数
#include<stdio.h>
main()
{
int a ,b ,min,*pb,*pa,*pmin;
pa = &a;
pb = &b;
pmin = &min;
scanf("%d%d",pa,pb);//输入ab值
printf("a = %d,b = %d",a,b);
*pmin = *pa;
if(*pa>*pb)
*pmin = *pb;//比较大小
printf("min = %d\n",min);
}
*变量 = 值
*与&为逆运算
*p++代表 *(p++)
++*p代表++(*p)
(*p)++
移动指针
使指针变量指向相邻的存储单元
指针变量+整型常量
【例子1】函数之间的地址值传递
#include<stdio.h>
int myadd(int *a,int *b)
{
int sum;
sum = *a +*b;
return sum;
}
main()
{
int x,y,z;
printf("输出xy:");
scanf("%d%d",&a,&b);
z = myadd(&x,&y);//存放地址的值
printf("%d+%d"\n,x,y,z);
}
【例子2】
#include<stdio.h>
void snb(int x,int y,int *z)
{
*z = y - x:
}
main()
{
int a,b,c;
sub(10,5,&a);
sub(7,a,&b);
sub(a,b,&c);
printf("%d,%d,%d\n",a,b,c);
}
结果为-5,-12,-7
【例子3】通过传递地址值在被调用函数中直接改变调用函数中的变量的值
#include<stdio.h>
void swap(int*,int *);
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
printf("%d%d",*a,*b);
}
main()
{
int x = 30,y = 20;
printf("x = %d y = %d\n",x,y);
swap(&x,&y);
printf("x = %d, y = %d",x,y);
}
【例子4】函数之间地址值的传递
编写函数order(int*a,int *b),使得函数的第一个实参为小的那个,后面为大的那个。
#include<stdio.h>
void swap(int *x1,int* x2)
{
int t;
t = *x1;
*x1 = *x2;
*x2 = t;
}
void order(int *a,int *b)
{
if(*a>*b)
swap(a,b);//比较两个值大小,小的在前面,大的在后面
}
main()
{
int x,y;
printf("输入xy值:");
scanf("%d%d\n",&x,&y);
printf("x = %d,y = %d",x,y);//输入2个值
order(&x,&y);//调用函数order();
printf("x= %d y = %d\n",x,y);
}
【例子5】
函数返回地址值
用指针的方法使得算出两值中的最大值
#include<stdio.h>
int *fun(int *,int*);
main()
{
int *p,i,j;
printf("输入2个值:");
scanf("%d%d",&i,&j);//输入2个值,比较大小
p = fun(&i,&j);//调用函数fun()
printf("i = %d,j = %d,*p = %d\n",i,j,*p);
}
int *fun(int *a,int*b)
{
if(*a>*b)
return a;
return b;
}//返回最大值p