C语言学习(六)指针1 概念

来源:互联网 发布:美工抠图总结 编辑:程序博客网 时间:2024/05/01 17:14

第十章 指针


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是同一回事,下面两个语句作用相同:

1i =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


原创粉丝点击