当前位置:   article > 正文

c语言:摆脱对指针的恐惧【1】

c语言:摆脱对指针的恐惧【1】

 前言: 谈到指针,似乎大家对它的印象是难,以至于认为自己学不会指针,但是指针是c语言的精华部分,c语言对比其他语言的一个大的优势就是指针,指针在c语言的学习中扮演了至关重要的角色,指针如果不学,后面的内容也很难学得会,俗话说基础不牢,地动山摇。那么学习指针有什么好的方法吗,首先情绪上克服对指针的恐惧,计算机里没有黑魔法,计算机内部的所有东西都是人造的,别人能学会的,我们也一定能学会,我们要有不惧困难的精神,在学习编程的道路上我们会遇到比指针更难的知识点,只要行动起来,我们要相信自己一定能学会。

1.指针是什么?

      学习c语言,我们都知道指针,却不知到指针的本质,指针是内存中的一块地址,而我们口中的指针,是一个用来存放地址的变量,也叫指针变量

总结:指针就是地址,人们口中的指针是一个用来存放地址的变量

那么地址是怎么一回事呢?在内存中,cpu为每个字节都进行编号,而每个字节的编号就是它的地址,如果我们想找到某个字节,只需要通过它的地址便可以访问这个字节

指针变量 

我们可以通过 & (取地址操作符)取出变量的内存起始地址,把地址可以存放到一个变量中,这个
变量就是指针变量。例如我们创建一个整型变量a,对它进行&a(对a取地址)操作,把&a赋值给一个指针变量pa,如果变量占了四个字节分别为0xFFFFFFF1,0xFFFFFFF2,0xFFFFFFF3,0xFFFFFFF4,那么pa指向0xFFFFFFF1。
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a = 10;//在内存中开辟一块空间
  5. int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
  6.    //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量
  7. 中,p就是一个指针变量。
  8. return 0;
  9. }

总结: 指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

那么一个指针变量占多大空间呢,答案是指针变量在32位平台下就是4个字节,在64位平台下就是8个字节

指针和指针类型

  我们都知道,变量有不同的类型,有整型,短整型,长整型,字符型,单精度浮点型,双精度浮点型......

指针有没有类型呢,确定的说:有,但是马上又有疑问了,前面我们提到指针在32位台下占四个字节,在64位平台下占8个字节,那么指针分类型有什么意义呢,不都是存储地址的变量吗,是的,指针变量都是存储地址的变量,但是,不同类型的指针是有区别的,下面我将解释不同类型指针变量的区别。

在了解不同类型指针变量的区别之前,我们先了解指针变量是如何定义的

  1. char* pc = NULL;
  2. int* pi = NULL;
  3. short* ps = NULL;
  4. long* pl = NULL;
  5. floa* pf = NULL;
  6. double* pd = NULL;

从这里我们可以清楚地看到,指针定义的方式是:type+*

char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
接下来我们就讲讲指针类型的意义。
一个变量在内存中的值是用8位16进制来表示的,如1在内存中表示为01 00 00 00,每两位占一个字节,而指针定义什么类型 决定了它可以在内存中对它指向那个变量的操作的步长
  1. #include <stdio.h>
  2. //演示实例
  3. int main()
  4. {
  5. int n = 10;
  6. char *pc = (char*)&n;
  7. int *pi = &n;
  8. printf("%p\n", &n);
  9. printf("%p\n", pc);
  10. printf("%p\n", pc+1);
  11. printf("%p\n", pi);
  12. printf("%p\n", pi+1);
  13. return  0;
  14. }

 当我们运行这段代码

我们发现把n的地址给了char指针变量pc,int类型指针变量pi,它们三个的地址打印出来果然一样, 但是当分别对pc和pi+1,也就是向前走一步时,char类型指针变量pc的地址由000000C56993FA04变成了000000C56993FA05,由于它是char类型,char类型的变量默认占一个字节,这里系统默认pc指向的是一个char类型的变量,所以向前走了一个字节,而int类型指针变量pi地址由000000C56993FA04变成了000000C56993FA08,由于它是int类型的指针,所以系统默认它指向的是一个int类型的变量,所以当它+1,也就是向前走一步时,向前走了4个字节。

指针的解引用

&为取地址符,*为解引用符,它们是天生的一对,&是对变量的地址操作,*是对变量的值操作

 

可以看到,当我们输出*pa时,编译器输出了它指向的那个变量的值,而输出&pa, 

编译器输出了pa的所在的地址。

总结:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

我们这一期的指针就到此结束啦, 我们下期不见不散,未完待续。。。。。。。

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/633030
推荐阅读
相关标签
  

闽ICP备14008679号