如果能够将取得的变量的地址传递给一个函数,能否通过这个地址在那个函数内访问到外面的变量?答案是肯定的。scanf("%d",&i)就是一个C语言的函数,我们已经试过在scanf内将地址交给一个整数,但是整数和地址不见得总是类型一致,那么什么样的类型可以接受取地址得到的地址呢?那就是指针!
一、指针的定义
指针类型的变量就是保存地址的变量,就是保存&运算符取得的其他变量的地址的一个变量。有int i,就可以做出一个int *p,这个星号表示p是一个指针。(通常使用p表示指针,因为p是pointer的第一个字母)int *是说p是一个指针,它指向的是一个int,现在把i的地址交给p。

int i;
int *p = &i;

也就是说我们原本有一个int型变量i,现在又有了一个指针型变量p,现在p里面的值是i的地址。(假如i的地址为0x2000,那么p的值就是2000)我们说p指向了i,就是在说变量p里的值是i的地址。

二、指针变量中*的位置

int* p;
int *p;

上面两种写法意思都是一样的,p是一个int,于是p是一个指针了。而不是说p是int * 类型的,在C语言中没有int这个类型,只是说*p是一个类型。

所以我们有了指针变量,变量里的值是内存的地址,这个地址会指向另外一个变量,普通变量里面放的内容是一个实际的值,在指针里面不会放实际的值,只会放别的变量的地址,int *p,p里只会有别的整数的地址。

三、作为参数的指针
当我们把指针当做函数的参数的时候,应该写作void f(int *p);
当我们调用函数的时候要交给函数一个地址,如f(&i),通过这个指针变量p得到了变量i的地址,这使得f函数里拥有可以访问外面这个变量的能力了。那么如何访问呢?

运算符*
我们用*运算符来访问指针的值所表示的地址上的变量
*p可以拿来做左值,也可以用来做右值

#include<stdio.h> 
void f(int *p);
int main()
{
	int i=1;
	f(&i);
	printf("%d\n",i); 
	return 0;
 } 
void f(int *p)
{
     printf(" p=%p\n",p);//读出i的地址 
     printf("*p=%d\n",*p);//当*和p连在一起时,*p表示的是整数 
     *p=2;// 写入 
 }

目前为止我们看了指针的两个运算符,一个是取地址运算符&,一个是取地址所代表变量的值*,这两个运算符是相互反作用的。