Chinaunix首页 | 论坛 | 博客
  • 博客访问: 485576
  • 博文数量: 164
  • 博客积分: 4024
  • 博客等级: 上校
  • 技术积分: 1580
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-10 16:27
文章分类

全部博文(164)

文章存档

2011年(1)

2010年(108)

2009年(55)

我的朋友

分类: C/C++

2009-10-16 12:06:16

指针是C语言中的重要概念,也是重要特色,使用指针可以使程序更加简洁紧凑高效
一。相关概念
1.数据在内存中的存储方式:按数据类型给在内存为其分配一定数量的内存单元(字节)
2.内存单元的地址:内存单元的编号,与变量名对应
3.内存单元的内容:即变量的值
4.变量的“直接访问”方式:按变量的地址(即变量名)存取变量值的方式
5.变量的“间接访问”方式:将变量的地址放在另一个内存单元中,先到另一个内存单元中取得变量的地址,再由变量的地址找到变量并进行数据存取
6.指针的概念:一个变量的地址成为该变量的指针
7.指针变量:专门用于存储其他变量地址的变量
8.指针与指针变量的区别,就是变量值与变量的区别
 
二。指针变量
1.指针变量的定义
类型说明符 *指针变量名;
2.指针变量的三要素
指针变量的类型:和其所指变量的类型一致
指针变量的值:另一个变量在内存中的地址
指针变量的名字:起法同普通变量
3.说明:标示符前的*表示该变量为指针变量,但指针变量名是*后面的名字(不包括*)
4.指针变量的赋值:指针变量=某一地址
方式1:指针变量名=&变量名
方式2:指针变量名=另一个已经复制的指针变量
5.指针的运算:算术运算,比较运算
  两个元素符:*:求其后内存地址中的内容
            &:求变量的内存地址
main()
{int a,b;int *p1,*p2;
a=100;b=300;
p1=&a;p2=&b;
printf("%d %d\n",a,b);
printf("%d %d\n",*p1,*p2);}
 
p=&a  &*p=&a  *&a=a   (*p)++=a++
6. 指针的指针:指向指针变量的指针
   类型 **变量名;
 
三。指针与函数
1.指针变量作为函数的参数
交换两数
swap(int *pa,int *pb)
{int p;
p=*pa;
*pa=*pb;
*pb=p;}
 
main()
{int a,b;
  int *p1,*p2;
    scanf("%d%d",&a,&b);
   p1=&a;
   p2=&b;
if(a
swap(p1,p2);  可以修改为swap(&a,&b);试下
printf("%d,%d\n",a,b);}
 
 
 
 
 
swap(int *pa,int *pb)
{int *p;
p=pa;
pa=pb;
pb=p;}
 
main()
{int a,b;
  int *p1,*p2;
    scanf("%d%d",&a,&b);
   p1=&a;
   p2=&b;
if(a
swap(p1,p2);
printf("%d %d\n",a,b);}
 
指针做参数,实参形参都变;普通数据做参数,实参不改变
2.指针函数
一个函数可以返回整型值,实型值、字符型值,也可以返回指针类型的数据,即地址
返回值是指针类型的函数,称为指针函数
定义:类型标示符 *函数名(参数表);
说明:对于Int *a(int x,int y){...}
     a是函数名,调用它后能得到一个整型数据的指针;x,y是形参;*表示此函数是指针类型函数
main()
{int a,b,*p;
 int *max(int int);
  scanf("%d%d",&a,&b);
   p=max(a,b);
   printf("%d\n",*p);}
 
int *max(int x,int y)
{if(x
 else return &y;}
3.指向函数的指针
函数名代表函数的入口地址
定义方式:类型 (*指针变量名)();
main()
{int max();
int (*p)();
int a,b,c;
p=max;
scanf("%d,%d\n",&a,&b);
c=(*p)(a,b);
printf("a=%d,b=%d,max=%d\n",a,b,c);}
 
int max(x,y)
int x,y;
{int z;
if(x>y)z=x;
  else z=y;
return z;}
 
 
五。指针与数组
指向一维数组的指针   指向多维数组的指针   指向字符串的指针
1.指向一维数组的指针
 类型 *指针变量名
2。数组名的含义:数组名代表数组的首地址
3.指向数组元素的指针变量的赋值
 指针变量=数组某一元素的地址;
4。c规定:p=p+1新p指向数组的下一个元素
              意味着新p比原p的地址多d个字节(d为一个数组元素所占的字节数)
5.引用一个数组的方法
  下标法:a[i]
  指针法:*(a+i)或*(p+i)
 通过数组名计算数组元素地址,找出元素的值
main()
{int a[0];int i;
  for(i=0;i<10;i++)
  scanf("%d",&a[i]);
  printf('\n');
for(i=0;i<10;i++)
printf("%d ",*(a+i));}
 
用指针变量指向数组元素
main()
{int a[0];int i;
int *p;
  for(i=0;i<10;i++)
  scanf("%d",&a[i]);
  printf('\n');
for(p=a;p
printf("%d ",*p);}
6.注意事项
int a[10],*p; p=a;
p++合法,但是a++不合法(a是数组名,代表数组首地址,是常数地址)
要注意指针变量当前值
main()
{int a[0];int i;
int *p;
  for(i=0;i<10;i++)
  scanf("%d",p++);
  printf('\n');
p=a;
for(p=a;p
printf("%d ",*p);}
 
x=*p++先计算*p再增1
*(p++):先去*p的值,后使p加1
*(++p):先使p加1,后取*p得值
(*p)++表示p所指向的元素值加1
main()
{int a[3];
 int *p=&a;
printf("%d\n",*p++);
printf("%d\n",*++p);}
 
main()
{int a[]={1,2,3,4,5};
int *p=a+3;
printf("%d%d%d\n",*p,*(p+1),*p+3);}  4 5 7
 
7.多维数组的指针
定义形式与指向一维数组的指针类似
8.指针与字符串
字符串的表示形式:用字符数组实现
               用字符指针实现:char *p;
               赋值:指针=串中某一字符地址
 
 
哈哈哈 快结束喽  明天周六了 快乐大本营。。。
阅读(1060) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~