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语言的精华——指针 指针初识

这是c语言的重中之重,对于许多数据结构与算法的实现,后续的结构体和数组,联合体这些都与指针有关,所以也希望大家能重视起来,这篇文章只是让大家已最简单的方式了解指针,后续对指针的详细介绍会在后续文章中写出(作者又在给自己挖坑了,而且不知道什么时候填坑)

内存

想了解指针,应该先了解内存。

内存是计算机的存储器,这里扩展一下计算机的大概组成

计算机组成:控制器,运算器,储存器,输入设备,输出设备

计算机所有程序的运行都是在内存中的,所以内存在计算机也是尤为重要。

当我们有一台电脑后都会有相应的内存,比如说我用的

是16G的内存,但是内存这么大,计算机又是怎样使用的呢?

在使用前,计算机会把计算机的内存分为一个个小块,并且每一块给他取了一个名字,在使用的时候直接对接名字即可。用一个实际生活的例子来举例,每次你点外卖时,都会把自己的地址信息提供给外卖平台,这样外卖员在给你送外卖时得知了你是xxx区xxx学校的,这样就可以迅速的把外卖送到。

用图来解释应该是这样

?一整个内存被分配成很多个空间

这样就派生出来两个问题

*1、内存是如何编号的

*2、一个这样的内存单元站多大空间

这里还需要简单介绍一下计算机

在我们讨论计算机的时候应该有聊过32位和64位吧(当然现在应该都是64位的计算机了)

64位就代表了物理上有64根地址线,在计算机通电后会产生正负点,这样就产生了计算机的二进制位(电信号转化为数字信号),正点为1,负电为0

因为现在是为了让大家理解,,而且大家使用大多数编译器都是32位的(除去新的vs2022),所以就以32位来介绍

这样产生的32个二进制位就产生了从00000000000000000000000000000000~1111111111111111111111111111111111111111个数字

这些序列都作为内存的编号,当编号作为内从空间的代表时,我们就称作这些编号为捏村单元的地址。这样编写,我们的计算机就能管理2^32个内存单元,假设一个内存单元是一个bit位那么总共有4294967296个bit位

?这个数字/8就代表了总共能管理的字节数

再/1024

?算出来应该是kb

再/1024

?算出来是512MB

再/1024,就是0.5GB

现在我们来看,这个内存算是非常小的了,所以一般计算机的内存分配也不会是这样分配的。

大家知道c语言最小的变量char类型占一个字节,一个字节就是8bit,那样就是8个地址,所以最终经过平衡后一个内存单元占一个byte(字节),用于分配地址

接下来就要正式的聊到指针了

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = 1;
	return 0;
}

这样的一段代码,计算机就给a这个变量分配了四个字节的空间

接下来介绍一下查看a这个变量的地址,这里我们需要用到&,这是一个取地址符号,用于得到变量地址和%p作为输出

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = 1;
	printf("%p", &a);
	return 0;
}

?得到的地址就是这个,但是&只会拿到这个变量第一个字节的地址,但是当我们需要存放这个地址的时候我们就需要一个变量去储存,这在c语言中就叫指针变量,a这个变量是int型,指向a的这个指针变量的类型位int*,&用于取出变量的直至

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = 1;
	int* A = a;
	printf("%p", &a);
	return 0;
}

这个*代表了A是一个指针变量,Int代表了这个指针所指向的变量的类型是Int型

当然我们可以举一反三

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	char a = 'A';
	char pa = &a;
	return 0;
}

现在我来教大家如何使用这个指针

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = 1;
	int* A = a;
	printf("%p", &a);
	return 0;
}

A这个指针是指向a所在的内存空间,如果我们想使用的时候应该这样

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = 1;
	int* A = a;
	*A = 10;//第三行
	printf("%d", *A);
	return 0;
}

第三行这个*代表的就是解引用操作,就是通过a的地址来找到a所在的内存空间,这里可以跑一下程序验证一下,这里我通过指针将a的值改为了10

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int a = 1;
	int* A = &a;
	*A = 10;
	printf("%d", a);
	return 0;
}

?

这里已经证明更改成功了?

再来看一下最后一点指针类型的大小

#define _CRT_SECURE_NO_WARNINGS 1//取消警告
#include<stdio.h>
int main() {
	int* a = NULL;
	char* b = NULL;
	printf("a的大小为%d", sizeof(a));
	printf("b的大小为%d", sizeof(b));
	return 0;
}

?这里NULL代表了空指针,也就是不指向任何内存的一个指针,这样我们可以使用sizeof来计算一下空指针的大小

?同理,其实实际上所有指针的大小都是相同的,都是四个字节,这是因为32位的编译器指针大小的是32个bit,所以计算出来是4byte.

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 15:53:52  更:2022-01-03 15:55:54 
 
开发: 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 11:05:14-

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