C语言基础——指针

文章详细介绍了C语言中的指针概念,包括指针的意义、类型表示、操作方法、指针变量的定义和使用,以及指针与一维、二维数组的关系。还探讨了指针变量的地址操作、指针的算术运算、指针类型的强转等高级用法,并提到了二级指针的概念。
摘要由CSDN通过智能技术生成

一、指针

指针就是地址。

1.指针的意义

地址:数据的位置。
指针是C语言提供的一种类型。

2.指针类型表示

类型 *
类型:char int float double 指针 结构体 数组
//char * – 代表这个地址里面存放的是char型数据 — 该指针指向一个char型空间
//int * – 代表这个地址里面存放的是int型数据
问题:
在这里插入图片描述
通过强制类型转换:(int *)0x40000000 – C语言代表1个可以存放整型数据的地址
在这里插入图片描述
*地址 – 代表该地址中的内容。
int num = 10;
打印num变量的地址:%p,&num
32位CPU和系统:地址 – 0x0000 0000 ~ 0xffff ffff – 32位
64位CPU和系统:地址 – 64位

3.一些操作

3.1打印1个变量地址

&变量名 – 普通变量。
数组名 – 数组。

3.2通过地址查看改地址的内容以及修改改地址的内容

在这里插入图片描述
操作空间如下图
在这里插入图片描述

3.3操作某个空间 – 4个字节,给他赋值为100,只知道该空间的地址0x8000 0000

*((int *)0x8000 0000) = 100;
//但是操作系统显示段错误,不允许普通用户直接修改地址的空间,基层嵌入式可以

4.指针变量的定义

类型 *标识符; – 没有赋初值,称为野指针变量。
类型 *标识符 = NULL; (习惯)
类型 *标识符 = &变量名;(习惯)

int num = 100;
定义1个指针变量指向该num空间?
int *pnum = #
pnum 代表的是本身变量的空间
*pnum 代表的是指向的空间
在这里插入图片描述

5.指针类型的大小

指针类型的大小–32位/64位
在这里插入图片描述
在这里插入图片描述

6.指针变量的使用

6.1 指针变量的初始化

例如:int num = 0; char ch = 0; char str[1024]=”\0”;
int *pnum = NULL;//NULL – 空 = 0
指针变量在不使用的情况下,一般初始化为NULL,否则我们称该指针为野指针。

6.2一个指针变量对应多个普通变量

//int num1=100,num2=500;
//int pnum = NULL;
//pnum指向num1 – C语言如何编写? pnum = &num1; – 可以通过
pnum 操作num1的空间。
//pnum指向num2 – C语言如何编写? pnum = &num2; – 可以通过*pnum操作num2的空间。
在这里插入图片描述

6.3想通过指针对某个变量空间操作:

1.定义一个指针变量 int pnum = NULL;
2.把某个变量的地址赋值给指针变量 pnum = #
3.通过
指针变量名,就可以操作某个变量空间 *pnum = 1000;

6.4一个变量,多个指针指向该变量

在这里插入图片描述

6.5指针类型的强转

和普通变量一样。(指针类型) 某个变量地址。
unsigned int num = 0x12345678;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.指针的其他应用

7.1 指针变量+1,物理地址变化

指针变量+1,物理地址+类型大小。

7.2指针与一维数组

7.2.1数组名代表该数组的首地址

打印数组的首地址
在这里插入图片描述
在这里插入图片描述

7.2.2num和&num[0] – 指针类型

一样:num – 整型*
num[0] – 整型*

7.2.3 *num – 代表

– 数组中第0个元素的空间 num[0]

7.2.4 (p+1)和p+1的区别
          *(p+1) 代表:地址+1 -- num[1] 

在这里插入图片描述
p+1 = num[0]+1 = 11 – -因为优先级 > + 先执行*p,再执行+1

例1:
打印:int num[5]={10,8,6,4,2};num的内容,通过地址打印
在这里插入图片描述
例2:
打印:int num[5]={10,8,6,4,2};num的内容,通过指针变量打印
在这里插入图片描述

7.2.5 *p++和++*p的区别:

原因:++和的优先级相同,从右到左执行。
先执行++,再执行
p,地址+1(下面例子)
在这里插入图片描述
先执行*p,再++,内容+1
在这里插入图片描述

7.2.6扩展:数组名代表该数组的首地址,不能够进行变量++。

7.3数组名和指针名:指针名可以替换数组名

在这里插入图片描述
在这里插入图片描述

7.4指针与二维数组

指针变量与二维数组的元素之间的关系:
在这里插入图片描述

7.4.1二维数组的首地址表示

在这里插入图片描述
在这里插入图片描述

7.4.2上述3种首地址表示方式他们的指针类型分别是:

&num[0][0] – int * – 整型指针类型 – 第0行0列元素的地址 = int *
num – int (*)[4] – 整型数组指针类型
num[0] – int * – 整型指针类型 – 第0行的首地址 = int *
在这里插入图片描述

7.4.3获取第一行首地址

获取第1行的首地址:
&num[1][0]
也可以:num[1]
在这里插入图片描述
结果:num[0] num[1] num[2] – 代表了3个一维数组

在这里插入图片描述
在这里插入图片描述

7.4.4二维数组的数组名 – 数组指针类型

在这里插入图片描述
在这里插入图片描述

7.5扩展

数组指针 – 代表是指针 – 用于二维数组中。
指针数组 – 代表是数组 – 指针类型的数组
在这里插入图片描述

7.6指针的指针–二级指针

获取一个指针变量的地址?
&变量名;
定义1个指针变量,保存另外一个指针变量的地址。 — 二级指针

p – 本身变量空间
*p – 指向的空间
*(地址) – 对该地址进行寻址

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值