& 用来取一个变量的地址
* 用来取一个地址的值
例如:
(1)&n 获取n的地址
int *p=&n;
*p就等于p的值
(2)
假设 int n=10;
*(&n) 就等于先取了n的地址 然后又取了这个地址的值 也就是n 结果是是
&(*n)就等于先取了地址为10的值,再去取这个值的地址。(但这种是错误的,一定要避免,你不知道地址为10里面到底是什么东西)
指针初始化
一般写法
int I;
int *p;
p=&I;
指针P用来存放I的地址(指针就是用来存储一个变量的地址的)
简化写法
int i;
int *p=&I
常见错误:
(1)不可以直接给指针赋值
eg:
int *p;
p=10010;//(错误)
(2)scanf的错误
eg:
int n;
scanf("%d",n);//正确应该为&n
向系统输入一个n的地址
数据交换
关于函数中的值传递与址传递一、址传递
#include<stdio.h>
void swap(int *i, int *n)
{
int t;
t = *i;
*i = *n;
*n = t;
printf("%d %d\n", i, n);
}
int main()
{
int i = 15,n=33;
printf("%d %d\n", &i, &n);
swap(&i, &n);
printf("%d %d\n", i, n);
return 0;
}
swap(&i, &n);//主函数中的调用
void swap(int *i, int *n)//
交换函数可以理解为 *I=&I; *n=&n;指针获得了变量I,n的地址
二、值传递
#include<stdio.h>
void swap(int i, int n)
{
int t;
t = i;
i = n;
n = t;
printf("%d %d\n", i, n);
}
int main()
{
int i = 15,n=33;
printf("%d %d\n", &i, &n);
swap(i, n);
printf("%d %d\n", i, n);
return 0;
}
值传递中发现值并没有发生交换,那是因为函数的形式参数不影响主函数中的i,n两个变量。
而址传递直接将地址传入到函数内,并通过指针将数值对换,因此交换成功