指针
定义
知道了一个变量的地址,就可以通过这个 地址来访问这个变量,因此,又把变量的地址称为该变量的“指针”。(地址)
注意区分指针变量,指针变量指某些专门用来存放变量地址的变量。(变量)
操作符
*取值操作符
&取址操作符
eg:
定义一个指针变量
int *i_pointer//这里不是取值操作符,只是声明i_pointer为指针;
存取变量的值
i_pointer=&i;
一般形式
类型说明符 *变量名
其中,表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面的赋值是错误的:
eg:
char c;
int *pointer;
pointer = c;
eg:对输入的两个整数按大小顺序输 出!这次用函数实现交换功能!
#include "stdio.h"
int main()
{
int swap(int *p_1,int *p_2);
int a,b;
int *pointer_1,*pointer_2;
scanf("%d%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a<b)
{
swap(pointer_1,pointer_2);
}
else
{
printf("%d%d",*pointer_1,*pointer_2);
}
}
int swap(int *p_1,int *p_2)
{
int *temp;
temp = p_1;
p_1 = p_2;
p_2 = temp;
printf("%d%d",*p_1,*p_2);
}
Eg2:
输入三个整型,利用指针和函数从大到小依次输出;
#include "stdio.h"
int main()
{
int *pointer_1,*pointer_2,*pointer_3;
int a,b,c;
void exchange(int *pointer_1,int *pointer_2,int *pointer_3);
scanf("%d%d%d",&a,&b,&c);
pointer_1=&a;
pointer_2=&b;
pointer_3=&c;
exchange(pointer_1,pointer_2,pointer_3);
printf("%d>%d>%d",*pointer_1,*pointer_2,*pointer_3);
}
void exchange(int *pointer_1,int *pointer_2,int *pointer_3)
{
void swap(int *p1,int *p2);
if(*pointer_1<*pointer_3)
{
swap(pointer_1,pointer_3);
}
if(*pointer_1<*pointer_2)
{
swap(pointer_1,pointer_2);
}
if(*pointer_2<*pointer_3)
{
swap(pointer_2,pointer_3);
}
}
void swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
指针与数组
数组名本质上也为一个地址;
假设有一个a数组,整型,有10个元素。要 输出各元素的值有三种方法: (1)下标法(a[i]) (2)通过数组名计算数组元素地址,找出元素的值。((a+i)) (3)用指针变量指向数组元素。((p+i))
eg:
#include "stdio.h"
int main()
{
int a[10],b[5];
int i;
void swap(int a[],int b[]);
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
swap(a,b);
for(i=0;i<10;i++)
{
printf("%d",a[i]);
}
}
void swap(int a[],int b[])
{
int i,temp,j;
for(i=0;i<5;i++)
{
j = 10-1-i;
b[i] = a[i];
a[i]=a[j];
a[j]=b[i];
}
}