C语言指针基础(一)


前言:指针是C语言尤为重要的知识,可以这么说掌握了指针就掌握了C语言的精髓。因此深入理解指针,对于我们学习C语言是十分有帮助的。

1.内存和地址

我们想要了解指针,首先就要了解指针在内存中是如何储存的。
了解内存和地址其实也不难理解,举一个生活中的例子:

你去找你的朋友,你的朋友将详细的住址:某某街道 某某小区 某某栋 某某单元 某某号 。有了地址你就能够快速的找到朋友家。

⼀楼:101,102,103...
⼆楼:201,202,203....
...

在计算机CPU在处理数据时,需要的数据时在内存中读取的,处理后的数据还会放回内存中。而内存是划分为一个个的内存单元,每个单元内存为一个字节大小。
每个单元内存单元都会有编号,这个编号就相当于宿舍的房间号,有了这个编号就可以使CPU快速的找到对应的内存空间。这个编号也称为地址。
在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起了新的名字叫:指针
所以我们可以理解为:
内存单元的编号 == 地址 == 指针

在这里插入图片描述

2. 指针变量和地址

2.1 取地址操作符(&)

理解了内存和地址的关系,我们再回到C语言,C语言中创建变量就是向内存申请空间
比如:

#include<stdio.h>
int main()
{
     int a = 10;
     return 0;
}

在这里插入图片描述
上述的代码就是创建整形变量a,内存中申请4个字节,用于存放整数,每个字节都有自己的地址,上图的4个字节地址为:

1  0x006FFD70
2  0x006FFD71
3  0x006FFD72
4  0x006FFD73

那如何得到a地址呢?
这里就要用到操作符(&)-取地址符

#include<stdio.h>
int main()
{
     int a=10;
     printf("%p\n ",&a);
     return 0;   
} 

变量在内存中的存储
&a取出的是a所占4个字节的地址。

2.2 指针变量和解引用操作符(*)

2.2.1 指针变量

我们通过(&)取地址符取得的地址也是一个数值。这个数值有时也是需要存储起来的。
那我们的地址值该放在哪里呢?答案是在指针变量中。

#include<stdio.h>
int main()
{
   int a = 10;
   int *pa = &a;
   return 0 ; 
}

指针变量也是一种变量,这种变量是用来存放地址的,存放在指针变量种的值都会理解成地址。

2.2.2 如何拆解指针类型

我们看到的 pa 的类型是 (int *),那我们该如何理解指针类型呢?

    int a = 10;
    int * pa = &a;   

这里pa 的左边是(int *), ‘ * ’说明 pa是指针变量, int 是在说明pa指向的是整形类型(int)的对象 。
在这里插入图片描述

2.2.3 接引用操作符

将地址存起来,那后面还要使用,那该如何?
在现实生活中我们用房间号找到房间,就可拿房间中的物品或者存放物品。
C语言中也是一样,我们拿到了地址,就能通过地址(指针)找到地址(指针)指向的对象。而这里就要用到( * )解引用操作符。

#include<stdio.h>
int main()
{
   int a = 10;
   int *pa = &a;
   *pa = 0;

    return 0;
}

上面的代码中 *pa = 0; 就使用到了解引用操作符 ,*pa 是通过pa中的地址,找到指向的空间,从而将a的值改为0。其实 *pa 就是a变量。

3 指针变量类型的意义

3.1指针的解引用

//代码1
#include <stdio.h>
int main()
{
 int n = 0x11223344;
 int *pi = &n; 
 *pi = 0; 
 return 0;
}

//代码2
#include <stdio.h>
int main()
{
 int n = 0x11223344;
 char *pc = (char *)&n;
 *pc = 0;
 return 0;
}

在这里插入图片描述

加粗样式

观察上面两段代码,再进行调试我们可以看到,代码1会将4个字节改为0。但是代码2只是将第一个字节改为0。
因此我们可以得到结论:指针类型决定了,对指针解引用的权限有多大(一次能操作几个字符)。
例如:char * 的指针类型解引用一次只能访问一个字节,int * 类型的指针解引用就只能访问四个字节。

3.2 指针+ - 整数

#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;
}

代码运行结果如下:
在这里插入图片描述
我们可以从图中看出char * 类型指针变量+1跳过一个字节,int *类型的指针变量+1跳过四个字节。
结论:指针的类型决定了指针向前或向后走一步多大(距离)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值