前言:
%x 输出十六进制
& 取地址符
* 取出地址内容,有时又是定义指针的标志符
sizeof() 计算字节
记住两句话:1.引用变量的就是引用变量的内容 2.记住上一句话
1.指针即地址。
我们定义变量的时候,一个婴儿出生编译器会在内存中分配空间。这就好像一个人,来到这个世界上就会有一个家,这个世界会为他分配一个摇篮。这个摇篮就是他的地址。
比如定义一个int a;那么编译器就会为她分配一个4个字节的空间。
在这个程序中,可以看出,定义的int a=100,编译器为她分配了4个字节的空间,地址叫18ff44,里面存放了100.
引用变量有两种办法:(引用变量就是引用变量的内容,在这个程序中,a的内容是100)
一种是根据变量名引用。比如在上个程序中,输出a的值;
第二种办法是根据地址名来引用.
和人的生活对比,每一个人都占据了一个地方,可以精确到一个点,只要找到这个点,就能找到这个人。这个点都相当于地址。
指针说到底就是地址。
2.定义指针并初始化
定义指针的方式:
类型* 指针名;
int* point=NULL;//定义一个指针指向空地址
ps:NULL是一个空地址。
指针被定义出来一定要初始化,无论如何都要
指针变量时用来存放地址的。
int a=100;
int* point=&a;
在这个定义中,int* 才是一个整体,point是指针名。
&a是取出a的地址储存在指针变量中。
因此point里面存放着a的地址,而不是a的内容100;
3.引用指针的内容
可以看出输出point与&a一致,所以point指的是a的地址
4.取出point里面的内容
这个运算符是*
从这个程序中可以看出,*point与point是不一样 的。
*这个符号可以取出地址里面的内容。
5.取出指针所指向的内容
实际上,所有的指针都是一样的空间,会被分配4个字节的空间
但是,取出指针所指向的内容却不是如此,他们是根据自己的类型取出变量
在一般的编译器里面,定义的指针要与所所存放的数据保持一致。
也就是说int型指针只能指向int型变量,不能指向其他变量。
6.指针所指向的内容
//交换ab两个数据的内容
int a=1;
int b=2;
int *pa=&a,*pb=&b;//pa指向a的地址,pb指向b的地址
pa=&b,pb=&a//pa指向b的地址,pb指向a的地址
这个算法只是改变了*pa和*pb,而ab的值并没有改变;因为只改变了pa,pb的指向。
下面这个算法可以交换ab的值
int a=2,b=3
int* pa=&a,pb=&b;
*pa=*pa+*pb;
*pb=*pa-*pb;
*pa=*pa-*pb;
下一节讲指针与数组,指针的加法减法也会一起解释,这些东西只有在指针才容易说明白;