第十章 指针
10.1地址和指针的概念
数据在内存中如何存储和读取:
a)在程序中定义的变量,系统会根据数据类型(int,char等)在编译时给这个变量分配对应长度的内存空间。
b)内存区每一个字节都有一个编号,这就是地址。
c)在程序中一般是通过变量名来对内存单元进行操作的。其实程序经过编译以后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。
d)按变量地址存取变量值的方式称为直接访问方式。
直接访问方式:
printf(“%d”,i);
根据变量名和地址的对应关系(对应关系在编译时确定),找到变量i的内存地址。再从内存中取出数据,把它输出。
scanf(“%d”,j);
把从键盘输入的值送到j变量所对应的存储单元中。
间接访问方式:
将变量的地址存放到另一个变量中。
假定:
定义了一个整形变量i,它的地址为2000。
定义了一个指针变量i_pointer,用来存放整形变量的地址,他分配的内存地址为3010,3011两个字节。
可以通过下面语句将i的地址(2000)存放到i_pointer中。
i_pointer= &i;
这时,i_pointer的值就是2000,即变量i所占用单元的起始地址。
一个变量的地址称为该变量的“指针”(地址能找到(指向)变量的内存单元)。例如,地址2000是变量i的指针。
用来存放指针的变量称为指针变量。例如,i_pointer就是一个指针变量。
指针变量的值是地址。
10.2变量的指针和指向变量的指针变量
1.为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号表示“指向”,如果已定义i_pointer为指针变量,则(*i_pointer)是i_pointer所指向的变量。
*i_pointer也代表一个变量,它和i是同一回事,下面两个语句作用相同:
1)i =3;
2)*i_pointer = 3;(将3赋值给指针变量i_pointer所指向的变量)
2.定义一个指针变量:基类型*指针变量名;
例如:
int* pointer_1;
a) pointer_1是指向整形(int)变量的指针变量名。
b)“基类型”用来指定该指针变量可以指向的变量的类型。
3.可以用赋值语句使一个指针变量指向另外一个变量。
例如:
pointer_1= &i;
a)将变量i的地址存放到指针变量pointer_1中,因此pointer_1就指向了变量i。
4.在定义指针变量时需要注意:
a)“*”表示该变量的类型为指针类型,指针变量名是pointer_1,而不是*pointer_1。
b)在定义指针变量时必须指定基类型。一个指针变量只能指向同一个类型的变量。例如, pointer_1就只能指向整形数据。
5.指针变量中只能存放指针。
6.两个相关运算符:
a)& :取地址符
b)* :指针运算符
例:通过指针变量访问整形变量:
voidmain() {
inti,j;
int* pointer_1, * pointer_2;
i= 3;
pointer_1= &i;
pointer_2= &j;
j= *pointer_1;
printf("%d\n",j);
printf("%d\n",*pointer_2);
}
输出:33
7.& * pointer_1含义: “&”和 “*”两个运算符的优先级别相同,但按自右而左方向结合,因此先进行*pointer_1的运算,就是变量i,再执行&i。因此&* pointer_1与 &a相同。
8.* & a含义: 先进行&a运算,得到a的地址,再进行*运算,即&a所指向的变量,也就是变量a。* &a和 *pointer_1的作用是一样的,他们都等价于变量a,即*&a与变量a相等。
9.(*pointer_1)++相当于a++。
10.指针变量可以作为函数参数。作用是将一个变量的地址传送到另外一个函数中。
例:对输入的两个数字按大小顺序输出:
vovoid main() {
voidswap(int * p1,int * p2);
inti,j;
int* pointer_1, * pointer_2;
scanf("%d,%d",&i,&j);
pointer_1= &i;
pointer_2= &j;
printf("i= %d , j = %d \n",i,j);
swap(pointer_1,pointer_2);
printf("i= %d , j = %d \n",i,j);
}
voidswap(int * p1,int * p2) {
if(*p1 < * p2) {
inttem;
tem= * p1;
*p1 = * p2;
*p2= tem;
}
}
输出: i =3 , j = 6
i= 6 , j = 3
文章链接: http://blog.csdn.net/murongshusheng/article/details/8646242