一个变量的(内存)地址称为该变量的“指针”,通过指针能找到以它为地址的内存单元。而指针变量是用来存放另一个变量的地址的(即指针)。
指针变量是一种特殊的变量,它是存放地址的。
定义指针变量的一般形式:
基类型 *指针变量名;
例如
float *pointer_3; char *pointer_4;
利用取地址运算符 & 让指针指向变量
方式一
int i, *p;
…
p = &i; // 取得变量i的地址,赋值给指针变量p
方式二
int i;
int *p = &i; // 在声明指针变量的同时也可以对其初始化
方式三
int i, *p = &i; // 可并列在一条声明语句中
当p指向i时,*p 就是i的别名:*p 即 i;改变 *p 的值,同时也会改变i的值。例如
#include
int main()
{
int i, * p;
p = &i;
i = 1;
printf("%d\n", i); //prints 1
printf("%d\n", *p); //prints 1
return 0;
}
再如
int i, * p;
p = &i;
*p = 2;
printf("%d\n", i); //prints 2
printf("%d\n", *p); //prints 2
int i;
int* p = &i;
int* q;
q = p;
printf("%d\n", *q); //此时*q指向了i
int i;
int* p = &i;
int* q;
*p = 1;
q = p;
printf("%d\n", *q); //prints 1
int i;
int* p = &i;
int* q;
q = p;
*q = 2;
printf("%d\n", *p); //prints 2
(1)p=q和*p=*q
int i;
int* p = &i;
int* q;
q = p;
使指针q指向了指针p所指向的目标,是指针本身的操作,即地址的操作;
int i = 1, j, * p, * q;
p = &i;
q = &j;
*q = *p;
printf("%d\n", *q); //prints 1
将p指向的变量i的数值赋给了指针q,操作的是指针指向的目标;
(2)若已经执行了p=&i;则
(i)*p就是i;
(ii)&*p就是&i;都是i的地址
(iii)*&i就是i;
(iv)(*p)++就是i++;
int* p1, * p2, * p, a, b;
scanf("%d,%d", &a, &b); //input 2,3
p1 = &a; p2 = &b;
if (a < b)
{
p = p1; p1 = p2; p2 = p;
}
printf("a = %d,b = %d\n", a, b); //a=2,b=3
printf("max = %d, min = %d\n", *p1, *p2); //max=3,min=2
上面的代码还可以简写为:
int* p1, * p2, a, b;
scanf("%d,%d", &a, &b); //input 2,3
p1 = &a;
p2 = &b;
if (a < b)
{
p1 = &b;
p2 = &a;
}
printf("a = %d,b = %d\n", a, b); //a=2,b=3
printf("max = %d, min = %d\n", *p1, *p2); //max=3,min=2
指针变量可以作为函数参数,作用是将一个变量的地址传递到另一个函数中。
#include
int main()
{
void swap(int* p1,int* p2);
int a, b, * p1, * p2;
scanf("%d,%d", &a, &b);
p1 = &a;
p2 = &b;
if (a < b) swap(p1, p2);
printf("max = % d, min = % d\n", a, b);
return 0;
}
void swap(int* p1, int* p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
注意两种错误的交换函数
void swap(int a, int b)
{
int t;
t = a;
a = b;
b = t;
}
void swap(int* p1, int* p2)
{
int *temp;
*temp = *p1;
*p1 = *p2;
*p2 = *temp;
}
总结:实参和形参之间的数据传递是单向的:实参传给形参的是地址值,通过间接寻址符*修改指针所指向的对象的值。
不可以 改变实参指针变量的值;
但可以 改变实参指针变量指向的变量的值
#include
int main()
{
void exchange(int* q1, int* q2, int* q3);
int a, b, c, * p1, * p2, * p3;
scanf("%d,%d,%d", &a, &b, &c);
p1 = &a;
p2 = &b;
p3 = &c;
exchange(p1, p2, p3);
printf("%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;
}