您的位置 首页 主动

C言语的那些小秘密之指针(一)

懂得C语言的人都知道,C语言之所以强大,以及其自由性,绝大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。所以从我的标题加了个(一)也可以看出指针的重要性,我尽可能的向大家

  懂得C言语的人都知道,C言语之所以强壮,以及其自由性,绝大部分表现在其灵敏的指针运用上。因此,说指针是c言语的魂灵,一点都不为过。所以从我的标题加了个(一)也可以看出指针的重要性,我尽或许的向咱们告知清楚我关于指针的了解。所以在解说的过程中我尽或许的用代码加文字的描绘方法,经过代码的剖析来加深咱们关于指针的了解,我给出的都是完好的代码,所以读者可以在看的过程中直接copy下去即可运转,期望下面的解说可以对你有所协助。

  首要让咱们来看看界说一个指针的一般方式为:

  基类型 *指针变量名

  看了上面的指针的界说方式,咱们或许关于有些当地会有疑问,如为什么要指定基类型呢?由于咱们都知道整型和字符型在内存中占的字节数是不相同的,当咱们进行指针的移动和指针的运算时,假如指针指向的是一个整型变量,那么指针移动一个方位便是移动4个字节,可是假如指针指向的是一个字符型的变量,那么指针移动的便是一个字节,因此咱们有必要规矩指针变量所指向的基类型。

  为了不单调的解说咱们来看看下面的代码吧。(留意:本博客的一切代码均运用vc6编译运转,所以或许有的规矩跟C言语的稍有差异)

  #include

  int main()

  {

  int a,b;

  int *pointer_1,*pointer_2;

  a=100;

  b=200;

  pointer_1=&a;

  pointer_2=&b;

  printf("——————–改换前——————-\n");

  printf("a=%d\tb=%d\n",a,b);

  printf("*pointer_1=%d\t*pointer_2=%d\n",*pointer_1,*pointer_2);

  *pointer_1=300;

  int c=500;

  pointer_2=&c;

  printf("——————–改换后——————-\n");

  printf("a=%d\t*pointer_1=%d\n",a,*pointer_1);

  printf("c=%d\tb=%d\t*pointer_2=%d\n",c,b,*pointer_2);

  }

  运转成果如下:

  

 

  在此咱们界说了两个整型指针int *pointer_1,*pointer_2;,它们别离指向变量a和b,值得留意的是*pointer_1和a、*pointer_2和b是共用同一个存储空间的,当咱们在接下类的代码中改动 *pointer_1=300;时,由输出就可以看出来a的值也跟从发生了改动。可是当咱们声明晰一个 int c=500;之后,运用pointer_2=&c;,b的值不变,仅仅是改动*pointer_2,由于我仅仅是改动了*pointer_2指向了c的存储空间,假如有有爱好的读者可以自己验证下假如咱们修改了a的值之后*pointer_1的值会跟从一同改动,由于他们指向的是同一个存储空间。

  接下来看看如安在函数的参数中来运用指针。

  #include

  swap(int p1,int p2)

  {

  int temp;

  temp=p1;

  p1=p2;

  p2=temp;

  }

  int main()

  {

  int a,b;

  int *pointer_1,*pointer_2;

  int c,d;

  c=a;

  d=b;

  pointer_1=&a;

  pointer_2=&b;

  a=20;

  b=30;

  swap(a,b);

  printf("a=%d\tb=%d\n",a,b);

  printf("a=%d\tb=%d\n",*pointer_1,*pointer_2);

  printf("c=%d\td=%d\n",c,d);

  }

  开始剖析上面的代码,看似是要经过一个函数的调用来完成一个a、b的交流,还有便是经过c=a;、 d=b;来完成对c、d赋初值。先来看看下面的运转成果:

  

 

  成果跟咱们幻想的不相同,a、b没有完成交流的原因是由于咱们运用的是传值,而不是传址,所以调用的过程中做的处理便是把a、b的值复制到别的请求的两个空间p1、p2中去,因此交流操作是在p1、p2的空间中进行的,所以关于a、b的值并没有影响。c、d的初值为什么没有跟a、b的值相同呢,由于咱们在初始化的过程中给c、d赋初值的时分a、b的并没有给定初值,所以a、b的初值是在编译的过程中由体系给定的,又由于咱们请求的c、d的空间是跟a、b没有任何关系的,所以接下来再对a、b赋初值的时分c、d的初值并不会改动。

  下一个代码:

  #include

  swap(int *p1,int *p2)

  {

  int *temp;

  temp=p1;

  p1=p2;

  p2=temp;

  }

  int main()

  {

  int a,b;

  int *pointer_1,*pointer_2;

  int c,d;

  c=a;

  d=b;

  pointer_1=&a;

  pointer_2=&b;

  a=20;

  b=30;

  printf("********************调用前******************\n");

  printf("a=%d\tb=%d\n",a,b);

  swap(pointer_1,pointer_2);

  printf("********************调用后******************\n");

  printf("a=%d\tb=%d\n",a,b);

  printf("*pointer_1=%d\t*pointer_2=%d\n",*pointer_1,*pointer_2);

  printf("c=%d\td=%d\n",c,d);

  return 0;

  }

  看看上面这个代码好像满意了咱们前面说的传址的要求,那先让咱们来看看试验成果吧。

  

 

  成果好像也是出乎咱们的意料之外,为什么运用了传值却仍是没有可以完成呢?假如咱们在调用函数中加上一句 printf("*p1=%d\t*p2=%d\n",*p1,*p2);,得到下面的成果:

 

  从成果来看好像告知咱们,咱们现已完成交流了,可是为什么没有可以返回来呢?在这儿要留意了,由于咱们在函数的交流句子仅仅是改动了部分指针变量p1和p2的值,所以没有改动a、b的值,所以运用printf("*p1=%d\t*p2=%d\n",*p1,*p2);使得咱们确实看到了a、b交流的假象,仅仅是改动了部分变量p1和p2的值。

  下一个代码:

  #include

  #include

  swap(int *p1,int *p2)

  {

  int *temp;

  temp=(int *)malloc(sizeof(int));

  *temp=*p1;

  *p1=*p2;

  *p2=*temp;

  free(temp);

  }

  int main()

  {

  int a,b;

  int *pointer_1,*pointer_2;

  int c,d;

  c=a;

  d=b;

  pointer_1=&a;

  pointer_2=&b;

  a=20;

  b=30;

  printf("********************调用前******************\n");

  printf("a=%d\tb=%d\n",a,b);

  swap(pointer_1,pointer_2);

  printf("********************调用后******************\n");

  printf("a=%d\tb=%d\n",a,b);

  printf("*pointer_1=%d\t*pointer_2=%d\n",*pointer_1,*pointer_2);

  printf("c=%d\td=%d\n",c,d);

  return 0;

  }

  看看也行成果:

  

 

  最终总算呈现了一个咱们想要的成果了。从以上的剖析读者自己也知道原因地点了吧,这儿操作的才是p1、p2所指向的地址,才真实的做到了关于a、b存储空间的数值的交流。仔细的读者或许看到了咱们在代码中用了赤色部分符号的代码,它彻底可以用一句int temp;来代替,之所以咱们在这儿要用int *temp;无非是要咱们紧记关于指针一些特别的运用,假如咱们没有这句temp=(int *)malloc(sizeof(int));,以上代码在编译的过程中是不会有任何过错的,可是在运转的过程中就会呈现过错,所以通常状况下咱们在运用指针的过程中,要特别留意野指针状况的呈现,避免呈现一些莫名美妙的有错。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/116715.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部