(1).指针的含义:
通过地址能找到所需的单元变量,地址形象化的称为指针。
指针式通过地址来体现的,地址指向所需的单元变量,即通过指针能够找到以它为地址的内存单位
存储单位的地址 存储单位的内容
对变量的访问都是通过地址进行的
访问方式:
1.直接访问:按照变量名进行访问。
2.间接访问:将一个变量的存放在另一个变量中,然后通过该变量来找到之前变量的地址,进而访问之前的变量。
(2).指针变量(地址变量):
一个变量专门存放另一个变量的地址(即指针)。指针变量的值是地址(即指针)
指针变量是基本数据类型派生出来的类型,不能脱离基本类型而独立存在。
例:
#include<stdio.h>
int main()
{
int a=100,b=10; //定义整型变量a,b,并初始化
int *pointer_1,*pointer_2; //定义指向整型数据的指针变量pointer_1,pointer_2,‘*’表示指向
pointer_1=&a; //把变量a的地址赋给指针变量pointer_1
pointer_2=&b; //把变量b的地址赋给指针变量pointer_2
printf("a=%d,b=%d\n",a,b); //输出变量a,b的值
printf("*pointer_1=%d;*pointer_2=%d\n",*pointer_1,*pointer_2);
//通过指针变量输出整形变量的值
return 0;
}
定义指针变量时左侧应有类型名,否则就不再是定义指针变量。
类型名 *指针变量名;
如int *pointer_1; //必须制定指针变量的基本类型
(“&” 取地址符 获得变量所占存储单元的地址 “ * ” 指针运算符 =间接访问运算符,获得指针所指向的内容)
(3).定义指针变量注意点:
1.“ * ” 表示该变量是指针
2.定义指针变量是必须制定基本类型,因为不同类型的数据在内存中所占的字节数和存放方式是不同的。C的地址信息包括存储单元的位置(内存编号)和类型信息,指针变量的属性应与之相匹配。如果赋值时,赋值号的两侧类型应该一致,避免出现意外结果。
3. 指针变量只能存放地址(即指针),不能将整数直接赋值给指针变量。
4.使用指针变量作为参数时可以得到多个变化了的值。
(4).引用指针变量
1.给指针变量赋值: p=&a; //把a的值赋给指针变量p。
2.引用指针变量指向的变量:
3.引用指针变量的值:
比较输入的两个数的大小,并按大小顺序输出
例:(1)
#include<stdio.h>
int main()
{
int *p1,*p2,p,a,b; //p1,p2是*int类型
printf("输入两个整数:");
scanf("%d,%d",&a,&b);
p1=&a; //使p1指向变量a
p2=&b; //使p2指向变量b
//此时,a,b的值只是赋给了p1,p2,因此p1,p2的值的改变并不影响a,b的值
if(a<b)
{
p=p1;
p1=p2;
p2=p;
} //p1和p2的值互换,即可输入成p1=&b,p2=&a
printf("a=%d,b=%d\n",a,b); //a,b的值并没有交换
printf("max=%d,min=%d\n",*p1,*p2); //输出p1,p2所指向的变量的值
return 0;
}
(2)
#include<stdio.h>
int main()
{
void swap(int *p1,int *p2); //p1,p2是形参变量
int a,b;
int *pointer_1,*pointer_2; //定义实参变量,定义int*型的指针变量
printf("输入两个整数:");
scanf("%d,%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a<b)
swap(pointer_1,pointer_2); //调用swap函数时,将实参变量的值传送给形参变量,采用“值传递”
printf("max=%d,min=%d\n",a,b); //p1=pointer_1=a,p2=pointer_2=b
return 0;
}
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp; //使*p1,*p2互换
}
错误示例
#include<stdio.h>
int main()
{
void swap(int *p1,int *p2);
int a,b;
int *pointer_1,*pointer_2;
printf("输入两个整数:");
scanf("%d,%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a<b)
swap(pointer_1,pointer_2);
printf("max=%d,min=%d\n",*pointer_1,*pointer_2);
return 0;
}
void swap(int *p1,int *p2)
{
int *p;
p=p1;
p1=p2;
p2=p;
}
C语言中实参变量和形参变量之间的数据传递是单向的”值传递“方式,因此不能通过执行调用函数来改变实参指针变量的值,但可以改变实参指针变量所指的值。
例:输入三个整并且由大到小排序
#include<stdio.h>
int main()
{
void exchange(int *q1,int *q2,int *q3);
int a,b,c,*p1,*p2,*p3;
printf("输入三个整数:");
scanf("%d,%d,%d",&a,&b,&c);
p1=&a;
p2=&b;
p3=&c;
exchange(p1,p2,p3);
printf("The order is:%d,%d,%d\n",a,b,c);
return 0;
}
void exchange(int *q1,int *q2,int *q3)
{
void swap(int *pt1,int *pt2);
if(*q1<*q2)
swap(q1,q2);
if(*q1<*q3)
swap(q1,q3);
if(*q2<*q3)
swap(q2,q3);
}
void swap(int *pt1,int *pt2)
{
int temp;
temp=*pt1;
*pt1=*pt2;
*pt2=temp;
}
使用嵌套,多次执行swap函数,进行两个变量的比较,进而进行三个值得比较。
“ &* ”和“ *& ”的区别
“ & ”和“ * ”的运算符优先级别相同,按照从右至左的方式结合。
int a;
p=&a;
//" &*p "相当于取变量a的地址
//" *&p "相当于取变量a所在地址的值,即变量a
指针的自增自减运算
#include<stdio.h>
int main()
{
int i;
int *p;
printf("输入一个数:\n");
scanf("%d",&i);
p=&i; //将变量i的地址赋给指针变量
printf("输出p的地址:%d\n",p);
p++; //地址加1,这里的1并不代表一个字节
printf("输出p++后的地址:%d\n",p);
getchar();
getchar();
return 0;
}
基本整型变量i在内存中占四个字节,指针p是指向变量i的地址的,此时的p++不是在地址上加1,而是指向下一个存放基本整型数的地址。意味着一次增加四个字节