IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C之任督二脉之二脉 指针 -> 正文阅读

[C++知识库]C之任督二脉之二脉 指针


1、指针是一种类型

????????在不同的系统内,指针类型的大小是不一样的,32位系统内指针类型的大小为32位,即4字节,64位系统内指针类型的大小为64位,即8字节。可以使用sizeof函数来分别验证一下,char*、short*、int*、float*、double*这些数据类型的大小。
???????? 测试代码

#include<stdio.h>

int main()
{
	
	printf("%d\n",sizeof(char*));
	printf("%d\n",sizeof(short*));
	printf("%d\n",sizeof(int*));
	printf("%d\n",sizeof(float*));
	printf("%d\n",sizeof(double*));
	
	return 0;
}

????????运行结果
在这里插入图片描述
????????由于我的电脑是64位系统,所以测试的这些指针类型都是8字节。

2、指针的本质是地址

????????指针的本质是地址,这句话可以理解为" 指针==地址 "。

????????首先我们来看看以下几个问题:
????????什么是地址?
???????? ????????地址是对内存空间的一个标号,用来标识每一个内存存放空间。
????????什么是数据的地址?
???????? ????????数据的地址是指为该数据所分配内存空间的首地址。
????????地址的表示方式是什么样的?
???????? ????????在计算机中,往往不用10进制表示地址,而选择使用16进制,因为表示起来更加简易。

????????为了方便理解,我们可以跟现实生活中的例子进行结合。比如,比如把指针看做电话号码,当我们没有保存电话号码,直接输入电话号码,进行拨号,这个过程可以看作直接访问;当我们先保存了电话号码,并对其进行了备注,便可直接利用保存的号码进行拨号,这个过程可以看作间接访问。
????????直接访问示例

int a=10;
printf("%d",a);

????????间接访问示例

int a=10;
int *p=&a;
printf("%d",*p);

????????注意:要区分指针的类型,指针类型决定了该指针存放什么类型数据的地址。比如上面的int *p它是整型数据的指针,因此我们要用整型变量的地址来初始化它,并且这个地址是存放数据空间的首地址。

3、指针有“两个值”

????????指针有两个值,这两个值分别是:
???????? ????????1、指针自身空间存放的值(自身的值)
???????? ????????2、指针所指向空间存放的值(指向的值)
????????下面给出一个实例,可以通过观察这个实例中变量值的变化来很好的理解指针的这一知识点。

#include<stdio.h>

int main()
{
	printf("----------------------------初始化-------------------------\n"); 
	int a = 10;
	printf("变量a的地址:%x\n",&a);
	int b = 20;
	printf("变量b的地址:%x\n",&b);
	int *p = NULL;
	printf("一级指针变量p的地址:%x\n",&p);
	printf("一级指针变量p空间内存放的值:%d\n",p);
	int **s = NULL; 
	printf("二级指针变量s的地址:%x\n",&s);
	printf("二级指针变量p空间内存放的值:%d\n",s);
	
	printf("----------------------------赋值-------------------------\n"); 
	p = &a;
	printf("一级指针变量p的地址:%x\n",&p);
	printf("一级指针变量p空间内存放的值:%d\n",p);
	printf("一级指针变量p所指向空间存放的值%d\n",*p);
	s = &p;
	printf("二级指针变量s的地址:%x\n",&s);
	printf("二级指针变量p空间内存放的值:%d\n",s);
	printf("二级指针变量s所指向空间存放的值%d\n",**s);

	return 0;
}

????????运行结果
在这里插入图片描述
????????为了方便观看,这里将它们用图形绘制出来,其中矩形表示内存空间、矩形左侧的字母表示变量名、矩形中间的值表示空间内存放的值、矩形下发的值表示空间地址。
????????初始化阶段,各个空间的值如下图所示:

在这里插入图片描述
????????赋值阶段各个空间的值,如下图所示:

在这里插入图片描述
????????值得注意的是,p指针保存了a的地址,我们认为p指针指向a的空间。二级指针s保存了p指针空间地址,我们认为s指针指向p的空间。如下图所示:

在这里插入图片描述
????????这种指向只是方便我们对指针的理解,计算机中并不存在这种箭头指向,这种指向关系是通过在一个空间中存放另一个空间的地址来实现。
????????在上面的基础上,我们来整理一下,实例中赋值阶段两个指针的"两个值"分别是什么。
????????指针变量p

p的地址(&p)0x62fe40
p的值(p)0x62fe4c
p指向的值(*p)10(变量a的值)

????????此时指针变量p的两个值分别是,p的值:0x62fe4c,p指向的值:10(变量a的值)。
????????指针变量s

s的地址(&s)0x62fe38
s的值(p)0x62fe40
s指向的值(*s)0x62fe4c(指针变量p的值)
*s指向的值(**s):10(变量a的值)

????????此时指针变量s的两个值分别是,s的值:0x62fe40,s指向的值:0x62fe4c(指针变量p的值)。

4、指针的可操作性

????????指针的可操作性是说,我们可以通过指向某一变量的指针来操作该变量。下面给出一个实例。
????????实例

#include<stdio.h>

int main()
{
	int a=10;
	int b=20; 
	int *p=&a;
	int **s=&p;
	printf("a的原值为:%d\n",a); 
	*p = 100;
	printf("通过p更改a的值为:%d\n",a); 
	**s=200;
	printf("通过s更改a的值为:%d\n",a); 
	return 0;
}

????????运行结果

在这里插入图片描述

结语

????????对C语言指针的介绍就到这里啦,希望这篇文章能给予你一些帮助,感谢各位人才的:点赞、收藏和评论,我们下次见。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:05:39  更:2022-04-09 18:06:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:00:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码