c程序设计 指针概念

指针-----地址
通过变量名访问变量,称为直接储存

int i=3;

通过地址(指针)访问变量,称为间接储存

int *i_pointer;
i_pointer=&i;//将i的地址分配给i_pointer
*i_pointer=50;//i的值由3改变为50

1,定义指针变量
基类型 *指针变量名
说明:基类型可以是任意数据类型,指定指针变量可指向的数据类型,用来说明指针变量占用几个字节数
* 说明其后的变量名是指针变量名
指针变量名是任意合法的标识符
定义:一个该变量的地址称为该变量的指针:地址2000是变量i的指针,如果有 一个变量专门用来存放另一变量的地址(即指针),这称它为指针变量
例如

int *pointerA;//*pointerA不能指向除int以外的类型
printf("%o",pointerA);//输出pointerA的地址

2,指针变量赋值
1)先定义,后赋值

int * pointerA;
int a;
pointerA=&a;

2)初始化,定义的同时赋值

int a,*pointerA=&a;

3)两个运算符
&取地址符,后面操作数必须是变量
(* ) 指针运算符,后面的操作数必须是指针

int    a=3;
int *pointA=&a;
&a 正确,表示a的地址
&pa    正确,表示pa的地址
*a   错误
*pa     正确,表示的是pa指向的变量,即a
*&a     正确,表示的就是a
*&pa     正确,表示的是pa,&a
&* 如果正确使用,则两个运算符可以相互抵消

3.通过指针访问变量(间接访问)
*代表指针所指向的内存单元,*后面只能跟地址变量(指针变量)

int a=3;
int *pointerA;
k=*pointerA  //把a的值赋给k
*pointerA=5//间接访问,把5赋给*pointer,即a的值也改变
a=5;//直接访问
printf("a=%d",a);//直接访问
printf("a=%d",*pointerA)//间接访问

利用指针变量交换a,b的值
案例一

#include "stdio.h"
void main()
{
void exchange(int x,int y);
int a=1,b=2;
exchange(a,b);
printf("a=%d,b=%d",a,b);
}
void exchange(int x,int y)
{
int t;
t=x;
x=y;
y=t;
}            //a,b的值并未改变

案例二

#include "stdio.h"
void main()
{
void exchange(int *x,int *y);
int a=1,b=2;
exchange(a,b);
printf("a=%d,b=%d",a,b);
}
void exchange(int *x,int *y)
{
int t;
t=*x;
*x=*y;
*y=t;
}           //a,b的值已交换

案例三

#inaclude "stdio.h"
void main()
{
void exchange(int *x,int *y);
int a=1,b=2;
int *p=&a;    
exchange(p,&b);   //p即a的地址
printf("a=%d",a);
}
void exchange(int *x,int *y)
{            //值不会改变,exchange中只交换了x,y所指向的地址
int *t;      
t=x;
x=y;
y=t;
}       

案例四

#inaclude "stdio.h"
void main()
{
void exchange(int *x,int *y);
int a=1,b=2;
int *p=&a;    
exchange(p,&b);   //p即a的地址
printf("a=%d",a);
}
void exchange(int *x,int *y)
{            //值不会改变,exchange中只交换了x,y所指向的地址
int *t;      
*t=*x;//x没有地址存放
*x=*y;
*y=*t;//错误,*t无确定的指向,没有它指向的地址
}     

在函数中比较两个元素,输出最大值,最小值,
用指针实现两个元素值的交换

#include"stdio.h"
void main()
{
void swap(int *p1,int *p2);
int a,b;
printf("请输入a,b ");
scanf("%d %d",&a,&b);
if(a<b)
swap(&a,&b);
printf("max=%d min=%d",a,b);
}
void swap(int *p1,int*p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}

输入3个数,要求按从大到小顺序输出
用函数实现

#include"stdio.h"
void exchange(int *p1,int *p2,int *p3);
void swap(int *pt1,int *pt2);
int main()
{
int a,b,c;
printf("请输入a,b,c ");
scanf("%d %d %d",&a,&b,&c);
exchange(&a,&b,&c);
printf("%d %d %d",a,b,c);
}
void exchange(int*p1,int *p2,int *p3)
{
if(*p1<*p2) swap(p1,p2);
if(*p2<*p3) swap(p2,p3);
if(*p1<*p2) swao(p1,p2);
}
void swap(int *pt1,int *pt2)
{
int t;
t=*pt1;
pt1=*pt2;
*pt2=t;
}
#include"stdio.h"
void exchange(int *p1,int *p2,int *p3);
void swap(int *pt1,int *pt2);
int main()
{
int *p1,*p2,*p3;
int a=1,b=2,c=8;
p1=&a,p2=&b,p3=&c;
exchange(p1,p2,p3);
printf("%d %d %d",a,b,c);
}
void exchange(int*p1,int *p2,int *p3)
{
if(*p1<*p2) swap(p1,p2);
if(*p2<*p3) swap(p2,p3);
if(*p1<*p2) swao(p1,p2);
}
void swap(int *pt1,int *pt2)
{
int t;
t=*pt1;
pt1=*pt2;
*pt2=t;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值