| |
|
开发:
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内存谈到指针就离不开内存。先理解内存。 内存是电脑上非常重要的存储器,计算机中程序的运行都是在内存中进行的。 电脑的内存一般是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 = # ????????*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语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |