C语言指针入门(二)

来源:互联网 发布:鼻子丑怎么办 知乎 编辑:程序博客网 时间:2024/04/25 13:29

指针

1.    指针是什么?起什么作用?

指针是变量的一种,里面是一个地址,通过这个地址找到要找的数据

实质:单元的地址就是指针内容

2.    指针运算符

&是取地址的运算符*是表示指针运算符

例:

int *p1,a;

p1=&a;

*p1=3;

例题:

#include<stdio.h>

int main()

{

      int *p;

      int a=3;

      p=&a;

      printf("%d",*p);

}

输出结果:3

3.    指针作函数参数

注意:变量的地址赋予指向相同类型的指针变量

4.    指针运算——赋值运算

int*p=&a;等价于int *p,p=&a;

在定义时为取地址,p为地址变量

在赋值时为取出地址中的值

例题:

int main()

{

      inty=0,x=3;

      int*px=&x;

      m=*px+5;

      y=++*px;

      printf("%d\t",m);

      printf("%d",y);

}

运行结果:8  4

 

int main()

{

      inty=0,x=3;

      int*px=&x;

      y=*px++;

      inta=*px;

      printf("%d",a);

}

运行结果:3

要点:运算符优先级

例题:

int main()

{

      inta[5]={1,2};

      printf("%d,%d",sizeof(a),*a);

}

运行结果:20,1

例题:

int main()

{

      chara[5]={'a','b'};

      char*p=a;

      printf("%d,%d,%c\t",sizeof(*a),sizeof(a),*a);    // *a指向首地址,可用sizeof(a)/sizeof(*a)计算数组长度

      printf("%d,%d",sizeof(char *),sizeof(p));

}                          

运行结果:1, 5,a  4,4

 

int main()

{

      char a[100];

      scanf("%s",a);//* gets(a)

     for(i=0;i<sizeof(a)/sizeof(*a);i++)

      sizeof(a)/sizeof(*a)=100,因为achar相等,char已经分配了100个内存单元。

例题

#define  DIM(s)  sizeof(s)/sizeof(*s)

int main()

{   

      char *p;

      char s[6]={'h','e','l','l','o'};

      char *pBegin=s;

      char *pEnd=s+DIM(s);

      for(p=pBegin;p<pEnd;p++)

      {

             printf("%c",*p);

      }

}

运行结果:hello

例题:

int main()

{

       inta[5]={1,2};

       int*p1=&a[0];     /* int*p1,*p2;p1=&a[0],p2=&a[1];*/

       int*p2=&a[1];     /* int*p1,*p2;*p1=a,*p2=a+1;*/

       printf("%d",p1-p2);  /* int  *p1;int  *p2=p1+1; p2=p1+1; */

}

运行结果:-1

NULL(自学,书上)

5.    用指针引用数组元素

若指针变量p已经指向数组中的一个元素,则p+1指向同一数组的下一个元素。

例: p的初值为&a[0]

     p+ia+i都是a[i]的地址

     *p+1)和*a+1)都是p+ia+i所指向的数组元素,即a[i]

     *(p+5)*a+5)就是a[5]

例题:用指针完成插入(for循环)

#include<stdio.h>

int main()

{

       char c[100]={'a','b','c','e','f'};

       int i;

       char *p=&c[99];

       for(i=99;i>2;i--)

       {

              *p--=*(p-1);

       }

       p++;

       *p='d';

       printf("%s",c);

}

运行结果:abcdef

例题(while循环):

int main()

{

       char a[10]={'a','b','c','e','f','g'};

       char *p=a;

       while(*p!='g')

       {

              p++;

       }

       p++;

       while(*p!='c')

       {

              *p--=*(p-1);

       }

       p++;

       *p='d';

       printf("%s",a);

}

运行结果:abcdefg

例题:用指针完成复制

#include<stdio.h>

int main()

{

       char a[400]={'a','b','c','d'};

       char b[4000];

       int i=0;

       char *pa=a,*pb=b;

       while(a[i]!='\0')

       {

              *pb++=*pa++;

              printf("%c",*(--pb));

              i++;

       }

}

运行结果:abcd

指针应用注意事项(规范):

(1)int *p=NULL;

(2)*p/p,*为取值符,后面一定加地址

(3)确认指针循环走到哪里

(4)++*p,*p++;

(5)Scanf(“%d”,&m);

(6)*p=*(p--)

字符串与字符数组的区别

(1)char *p=’abcdefg’;

sizeof(p)=4

2)字符串常量可以被访问,除此之外都不可以,可以遍历,不可以修改。

原创粉丝点击