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

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

1.指针是什么?

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

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

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

指针变量 

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

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

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

指针和指针类型

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

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

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

char*   pc = NULL;
int*    pi = NULL;
short*  ps = NULL;
long*   pl = NULL;
floa*   pf = NULL;
double* pd = NULL;

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

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

 当我们运行这段代码

我们发现把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* 的指针的解引用就能访问四个字节。

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

  • 60
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值