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语言中(1/13) -> 正文阅读

[C++知识库]初始C语言中(1/13)

目录

指针

1内存

2?指针变量的大小


指针

1内存

谈到指针就离不开内存。先理解内存。

内存是电脑上非常重要的存储器,计算机中程序的运行都是在内存中进行的。

电脑的内存一般是4G,8G,16G,32G,内存的空间大小是如何使用的,操作系统把内存很好的使用了。

内存空间是如何管理,如何使用的?

注:硬盘和内存是两码事

像4G,8G这样的叫内存

像1T的这样的叫硬盘

变量是创建在内存中的,(在内存分配空间的),每个内存单元都有地址,所以变量也是有地址的。

取出地址变量如下:

#include<stdio.h>

int main()

{

????????int a = 10;//一旦创建a,a要在内存中开辟空间的,a是一个整型,要占4个字节,

//而在内存中一个内存单元一个字节,即a要占4个内存单元,所以10在这4个内存单元的空间中存储着

//因为每个内存单元都有一个编号,a的地址是这4个编号中的第一个编号(第一个内存单元的地址)

????????&a;

//&——是取地址操作符

//&a是取出a的地址,拿到a的地址

//注:这里a的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)

????????printf("%p\n", &a);

//打印地址,%p是以地址的形式打印

????????return 0;

}//运行结果是:00B1F8E0

即代码是:

#include<stdio.h>

int main()

{

????????int a = 10;

????????printf("%p\n", &a);

????????int * p = &a;

????????return 0;

}//打印的是a的地址:00EFFB334

//因为地址长,所以它用十六进制显示。以0X开头的数字是十六进制数字,以0开头的数字是八进制。

//若把取地址a(&a)也存起来,怎么存?(即是把a的地址存起来)

//则需创建变量p把a的地址存进去,p的类型是?

#include<stdio.h>

int main()

{

????????int a = 10;

????????printf("%p\n", &a);

????????int * p = &a;//p的类型是int*,此时p就是指针变量

????????

????????char ch = "w";//假设一个叫ch的变量,类型是char,里面放的是一个w

????????&ch;//取地址ch,把这个地址若放到pc里去,

????????pc = &ch;//那怎么写pc的类型呢?

????????char * pc = &ch;

//*说明:pc是指针,pc存的是ch的地址,所以它一定是指针变量,char是指pc指向的是ch,ch是char类型。

//注:前面当p里存放的是a的地址时,不仅仅只是为了存起来,而是为了可以通过p里存放的地址去找到a,那怎么找呢?

//p变量的前面加*变成:*p,*p中的*是解引用操作符,*p代表的意思是通过p里的地址找到它指向的对象,即找到a,

//所以*p就是a,*p=a

????????return 0;

}

#include<stdio.h>

int main()

{

????????int a = 10;

????????printf("%p\n", &a);

????????int* p = &a;

????????*p = 20;

????????printf("%d\n", a);

????????return 0;

}//打印出a为20

所以指针变量前面加*,这个*是解引用操作符,它的作用是通过p里存的地址找打它所指向的对象,因为p是指向a的,所以*p就是a,*p=20,即又赋给a为20。是间接改变了a的值(与直接a=20的直接作用结果一样)

p是指针变量,是用来存放别人的地址的,存放之后是为了日后通过地址去访问或去改变指向的那个对象。

打印出的地址是编译器每次为这个变量分配的内存,?程序运行起来每次的结果不唯一。

地址是放在指针变量中的。

为什么p叫指针变量呢?

理解方式1:因为它指向了a,所以它叫指针变量

理解方式2:&a是a的地址,而我们把地址也称为指针,所以这个变量是用来存放地址的,也是用来存放指针的,所以它也叫指针变量。(如0x0012ff40—是内存单元的一个编号或说是地址,而我们又把地址称为指针,把这个指针存到变量里去,这个变量叫指针变量。)

我们口头上表达的指针,p是一个指针,r是一个指针,q是一个指针,都是说的是指针变量。我们一般把0x0012ff40这样的编号叫地址,口头语上很少叫指针,但本质上也可以叫指针。指针变量里是用来存放地址的。

地址如何存储——则需要定义指针变量。

当我们使用指针变量的时候,其实使用的是里边存放的地址。

p是地址,而*p是a。(它指向的那个对象)

地址又被称为指针,当指针要被存起来的时候(当地址要被存起来的时候),存到一个变量里边去,这个变量就叫指针变量。

指针变量就一个用途:用来存放别人的地址。

在指针变量眼里什么都是地址,只要把任何东西放到p里面,p就认为这是个地址。

int*p、int *p、int* p这几个书写都可以。这个名字也不一定是p,名字随意。

注:printf("%p\n",p);=printf("%p\n",&a);

两者打印的结果是一样的。

//若给出的是:doublel类型的变量,

//double d;

//现在要取出d的地址:

//&d;

//然后把d的地址取出来放到pd里去,

//pd=&d;

//那pd的类型应该怎么写呢?

//double * pd=&d;

//这样写的原因:*告诉我们pd是指针变量,double告诉我们pd指向的对象d,d的类型是double类型

*pd的意思是通过pd中的值找到pd所指向的对象,也就是*pd就是d。

*——解引用操作符,也叫间接访问操作符

注:

#include<stdio.h>

int main()

{

????????int num = 10;

????????int* p = &num;

????????*p = 20;

????????printf("%p\n", &num);

????????printf("%d\n", num);

????????return 0;

}

注意:printf("%p\n", &num);

????????printf("%d\n", num);

%p\n,后面是&num,是地址;

%d\n,后面是num,是整型变量

指针是一种复合数据类型,指针变量内容是一个地址,因此一个指针可以表示该系统的整个地址集合,?按照32位编译代码,指针占4个字节,按照64位编译代码,指针占8个字节(注意:不是64位系统一定占8个字节,关键是要按照64位方式编译)。 指针可以认为是一种数据类型,也可以认为是定义出来的指针变量。

2?指针变量的大小

p要占多大空间才能存放下地址呢?

/*#include<stdio.h>

int main()

{

????????int a = 10;

????????int* p = &a;

????????*p = 20;

????????printf("%d\n", sizeof(p));

????????return 0;

}*///运行结果是:4

//sizeof可以算变量大小,可以算类型大小

#include<stdio.h>

int main()

{

????????printf("%d\n", sizeof(char*));//计算字符指针类型的大小

????????printf("%d\n", sizeof(short*));//计算字符指针类型的大小

????????printf("%d\n", sizeof(int*));//计算字符指针类型的大小

????????printf("%d\n", sizeof(long*));//计算字符指针类型的大小

????????printf("%d\n", sizeof(float*));//计算字符指针类型的大小

????????printf("%d\n", sizeof(double*));//计算字符指针类型的大小

????????return 0;

}//运行结果是:444444

//指针变量是用来存放地址的,指针变量有多大取决于地址存起来需要多大空间

//而地址需要多大空间又取决于地址是如何产生的?(即编号是如何产生的)地址是什么样的数据?

//以32位机器来说,叫32位机器是因为有32根地址线或说是数据线(有时候数据线和地址线是共用的)

//32根地址线是物理的电线,需要通电,通电之后就有了高电平和低电平,高电平和低电平属于电信号,电信号最后转化为数字信号机即1或0

//当32根地址线同时通电时,32根地址线如果都是低电平的话那么转化为数字信号就是32个0,00000000000000000000000000000000即32个二进制位,还可能是

//00000000000000000000000000000001、

//00000000000000000000000000000002、

//00000000000000000000000000000010、

//……

//10000000000000000000000000000000、

//10000000000000000000000000000001、

//……

//11111111111111111111111111111111、

//32根地址线如果电信号转化为数字信号的话,以上所有可能都会出现。

//那产生这样的二进制序列有什么用呢?是用来做为内存编号的,把

//地址线上产生的电信号转化为数字信号之后,我们就可以把这样的一个二进制序列作为一个个内存单元的编号,

//总共能产生2^32次方种这样的编号。

//(2^32次方的理解:因为2位二进制位能产生00、01、10、11这4种情况,

//3个二进制位有000、001、010、011、100、101、110、111这8种情况,即32位则有2^32次方种这样的二进制位。)

//我们就可以把这种二进制序列就可以做为内存的编号,即被称为地址。这样地址的二进制序列是由0或1组成的,有32个比特位

//32个0或1这样的二进制序列存起来的话给上32个比特位的空间就可以了,因为一个比特位上能存放一个1或者0,32个比特位就能存放这样的32个1或0组成的二进制序列。

//32个由0或1组成的二进制序列就是4个字节,即我们产生的这样一个地址数据,这样的一个二进制序列其实在存储时就只需要4个字节就可以了。

//即指针就是用来存放这4个字节的地址,所以指针变量的大小也只需要4个字节就可以了

能够产生2^32次方这样的地址,一个二进制序列管理一个内存单元(一个内存单元都有一个自己的编号)即这样的一个二进制序列管理着一个字节,2^32个地址也就能管理2^32次方个字节的空间,这个空间有多大呢?

(注:二进制里边的第33位,指的是它的权重是2^32次方,最低位的权重是2^0次方

HEX——十六进制

DEC——十进制

OCT——八进制

BIN——二进制)

2^32次方=4,294,967,296(十进制)

即如果是32位机器的话,能管理4,294,967,296个字节的空间,4,294,967,296除以1024换成Kb,再除以1024换成MB,再除以1024换成GB,即是4。

意味着32位机器能管理和使用的内存是4个GB。

最多能产生这么多的地址,所以最多能管理这么大的内存空间。

64位机器与此相似,但需要8个字节。

在32位环境下,指针的大小是4个字节;

在64位环境下,指针的大小是8个字节。

x86——表示的是32位程序,编译出来是32位的程序

x64——表示的是64位程序,编译出来是64位的程序

//指针变量的大小取决于地址的大小

// 32位平台下地址是32个bit位,即4个字节;

// 64位平台下地址是64个bit位,即8个字节。

平台指的是编译程序的位数,编译程序的位数取决于电脑(机器)位数

注:

内存中的一个内存单元的空间大小是一个字节;

而管理这一个内存单元需要一个编号(地址),这个编号所需要的空间大小是4个字节

32个二进制序列是一个地址,这个地址管理了一个字节,维护了一个字节,它是一个字节的编号。

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

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