C语言程序设计
----教学过程篇指针
指针是 C 语言中重要的概念,正确灵活的使用指针,可以有效的表示复杂的数据结构,动态的分配内存,直接处理内存地址
地址和指针的概念要理解什么是指针,必须弄清楚数据在内存中是如何存储,有时如何读取的指针先了解两个概念:
1.内存单元的地址:
内存单元的地址是指内存中每个存储单元的编号,通过这些编号,可以找到唯一确定的某个内存单元
2.内存单元的内容:
指某个内存单元中存储的数据指针直接访问方式:
直接按变量地址存取数据的方式间接访问方式:
将变量 K的地址存放到另一个变量
k_point中,然后可以通过 k_point找到变量 K中存储的内容。
如,k_point = &k
指针
直接访问示意图将 3送到变量 K中去
k=3;
指针
间接访问示意图将 3送到变量 k_pointer所指向的内存单元中
k_point = &k;
*k_point = 3;
指针间接访问的“指向”就是通过地址来体现的,k_point的地址是 3000,它当中的值为 2000,这个值正好是变量 k的地址,这样就在变量 k_point和变量 k之间建立了一种联系,即通过 k_point就能知道 k的地址,图中以箭头表示“指向”
关系在 C语言中,将地址形象化的称为
“指针,,即通过指针 k_point可以找到以其中内容为地址的变量 k中的内容
k_point称为指针变量指针变量的地址:变量的指针指针变量:存放地址的变量为了表示指针变量和它所指向的变量之间的关系,在程序中用,*”来表示例如:
k_point=&k;
k=3;
*k_point=3;
最后两个语句的作用是一样的指针
定义一个指针变量格式:
基类型 *指针变量名;
基类型:定义指针变量所指的内存单元的类型例如:
float * point1;(指向实型变量的指针变量 )
char *point2;( 指向字符型变量的指针变量)
指针
将指针变量指向另一个变量的方法在 C语言中,一般是通过赋值的办法使一个指针变量指向另一个变量例如:
int *point;
int k;
point = &k;
这样就将指针变量指向变量 k了指针
定义指针变量的时候要注意两点:
1.指针变量前的 *,表示该变量的类型为指针变量类型,指针变量名为 point而不是 *point
2.在定义指针的时候必须定义基类型,
不同基类型的指针变量只能指向对应类型的其它变量指针
指针变量的引用指针变量中只能存放地址,不能存放任何其它非地址类型的数据引用指针变量时两个有关的运算符:
1,&:取地址运算符
2,*:指针运算符(间接运算符)
&k表示取变量 k的地址
*p表示指针变量 p所指向的存储单元指针如,int k;
int *point;
正确,point = &k;
错误,point = k;
错误,point =100;
指针(程序一)
#include <stdio.h>
#include <stdlib.h>
main()
{
int k;
int * k_point;
k_point=&k;
*k_point=12;
k--;
*k_point=*k_point*10;
指针(程序一)
printf("k=%d\n",k);
printf("*k_point=%d\n",*k_point);
printf("k_point=%d\n",k_point);
system("pause");
}
预测程序的输出结果指针
补充说明,&”和,*”
1,语句一:
int I,*p1,*p2;
p1=&I;
p2=&*p1;
&和 *的优先级别相同,则遵循自右向左方向结合,因此先进行 *p1运算,得到变量 I;再做 &*p1运算,等价与 &I;所以上式就是,p2=&I;
指针
2.语句二:
int *p1,k;
p=&k;
*&k++;
同样遵循自右向左方向结合,因此先进行 &k运算,得到变量 k的地址,然后再做 *&k运算,所以上式等价与:
*p;
指针
3.语句三
int *p1,*p2,k=10;
p1=p2=k;
printf(“%d\n”,(*p1)++);
printf(“%d\n”,*p2++);
第一个语句相当于将变量 k的值加 1;
第二个语句相当于将先将 p2和 ++结合,然后再和 *结合,因为是右加加,所以先输出 *p2
的值,然后再将 p2指针的值改变,即改变 p2
的指向指针(程序二)
#include <stdio.h>
#include <stdlib.h>
main()
{
int *p1,*p2,k=10;
p1=&k;
p2=&*p1;
printf("p2=%d\n",p2);
printf("p1=%d\n",p1);
(*p2)++;
指针(程序二)
*p1++;
printf("*&k=%d\n",*&k);
printf("k=%d\n",k);
printf("p2=%d\n",p2);
printf("*p2=%d\n",*p2);
printf("p1=%d\n",p1);
printf("*p1=%d\n",*p1);
system("pause");
} 预测程序输出结果指针
指针变量作为函数参数指针变量可以作为函数的参数,其作用是将变量的地址传入到函数中。
例如:
void swap(int *p1,int *p2)
但在调用函数时,往括号中填实参的时候就必须填入地址。
例如:
正确,swap(p1,p2);
错误,swap(*p1,*p2);
指针 (程序三 )
#include <stdio.h>
#include <stdlib.h>
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp; //变量交换
/* int *p;
指针 (程序三 )
p=p1;
p1=p2;
p2=p;
*/ //指针交换
}
main()
{
int *p1,*p2,m,n;
printf("please input two numbers:\n");
scanf("%d%d",&m,&n);
指针 (程序三 )
p1=&m;
p2=&n;
swap(p1,p2);
printf("%d,%d\n",m,n);
system("pause");
}
指针上例中:
如果是用普通变量作为交换的中间变量,则 m,n 的值进行了交换如果是用指针作为交换的中间变量,
则只有指针指向发生了交换,但 m,n的值本身没有进行交换