C/C++ 指针的深入理解

文章目录

    • 内存结构
    • 地址就是指针
      • 为什么地址就是指针?
    • 指针:地址的外号&
      • 变量空间开辟于内存
        • 1.所开辟的空间字节数>=1字节
        • 2.变量的每个字节都一个地址
        • 3.变量的第一个字节的地址代表整个变量的地址
        • 4.如何使用变量的指针找到整个变量空间?
    • 变量指针就是一个数
    • 如何使用一个数据
    • 一级指针与一级指针变量
      • 什么是一级指针
      • 什么是普通变量
      • 普通变量指针的类型
    • 使用指针访问变量空间
      • 使用指针访问空间
      • 如何找到a变量地址,然后读、写a变量地址
      • 使用指针操作a变量空间
      • *的两种用途
    • 指针的好处
      • 传递指针
    • 传递普通数值与传递指针的异同
      • 指针的含义
      • 连续内存
      • 内存单一

内存结构

内存是由字节组成的
每个字节都有一个地址

地址就是指针

地址的别称就是指针

为什么地址就是指针?

因为地址有指向作用,通过这个地址可以找到某个字节空间,然后操作(读、写)字节空间,因为地址有指向作用,因此我们也称地址为指针。

举个例子:
称门牌号为指针,因为门牌号指向了某个房间,当然我们可以称自己家的地址为指针,因为我家的地址指向了我家,根据门牌号和地址的指向,可以找到某个房间和我家,带有指向作用的是指针。

指针:地址的外号&

变量空间开辟于内存

1.所开辟的空间字节数>=1字节

比如

char型变量     1个字节
short型变量    2个字节
int型变量      4个字节
float型变量    4个字节
double型变量   4个字节

sizeof是运算符不是函数

2.变量的每个字节都一个地址

3.变量的第一个字节的地址代表整个变量的地址

即变量的指针就是变量第一个字节的地址
使用变量的地址(第一个字节的地址),找到相应的变量空间,进行操作,读或写变量空间

4.如何使用变量的指针找到整个变量空间?

a.通过变量指针找到变量的第一个字节
b.根据变量的类型得到变量所占的总的字节,从第一个字节往后数,找到变量空间所有字节

变量指针就是一个数

a. 指针这个数好比门牌号
指针就是一个数,只是这个数有点特殊,它是一个地址
门牌号是房间的地址,用来指向某个房间。
b. C语言采用什么方法得到一个变量的指针 ?
方法使用取地址符 &

int a;
&a //表示a变量的第一个地址,即a变量的指针。
printf("%p\n",&a); //16进制打印

提示: 打印一个变量的指针这个数时,可以采用%d方式打印,这也说明指针是一个比较特殊的整形数,但是你又不能说它是整形数,它是一个地址,我们也可以用%p,这个是地址专用的16进制打印形式打印结果

int a;
a指的是一个变量空间,我们可以向空间读写数据
&a指的是一个数,是变量a的指针,或者第一个字节的地址。

如何使用一个数据

a. 使用普通的整形数

直接使用
比如 printf("%d",10);

间接使用
先把这个数放到对应类型的变量中,通过使用变量来使用这个数
正常情况下,在不涉及类型转换时,我们要求将某个类型的数据,放到对应类型的变量中,要求类型必须保持一致

b.使用变量指针这个数
直接使用

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

间接使用
先把这个指针(数)放到一个变量中,然后通过这个变量使用这个数
存放指针这个数的变量就是指针变量。

int a=10;
printf("%d\n",&a);
int *p=&a;
printf("%d\n",p);
return 0; 

一级指针与一级指针变量

什么是一级指针

 a.指针:地址就是指针,指针是地址的别称,指针是一个数,是一个字节的门牌号(地址)。b.变量的指针:变量空间的第一个字节地址c.什么是一级指针所有普通变量的指针就是一级指针

什么是普通变量

只要在变量的声明或定义中,没有*的变量就是普通变量
例如:int a;

普通变量指针的类型

指针的等级:

一级:* 类型
二级:** 类型
三级:*** 类型

一般不会超过三级
一级指针表示指针指向一个普通变量

 char a='a';&a; //普通变量a的指针,表示第一个字节的地址char*类型:char型一级指针类型,*表示一级,char表示这个指针指向的变量空间是一个char型变量空间

使用指针访问变量空间

使用指针访问空间

&a //一个数,表示a变量的第一个地址,即a变量的指针(门牌号)
int *pa;//表示定义一个整型的一级指针变量,用于存放整形一级指针(数)
int *pa=&a;

如何找到a变量地址,然后读、写a变量地址

1.直接通过变量名进行操作
写数据:a=100;
读数据:int b; b=a;

使用指针操作a变量空间

写数据

*pa=200; //等价于a=100

读数据

int b=*pa;    //等价于int b=a;
此时,*pa代表的就是a变量空间,我们可以对其读写
这里的*找空间操作:找到指针变量pa里面存放的指针(数据)所指向的空间。

*的作用就是找到指针指向的空间。

*的两种用途

  1. 定义指针变量时使用,比如
int *pa; //定义一个int型的一级指针
*表示定义的是指针变量,一个*表示一级指针变量

2.访问空间时使用*

int a;
int *pa=&a;
*pa=100;//*找空间操作,找到pa这个指针变量里面放的指针所指向空间,*pa代表指针指向空间

指针的好处

int a=10;
int *pa=&a; //pa里面放的是a的门牌号a=100; //使用变量名a访问变量空间,写空间,把100写入
int b=a;//使用变量名a访问变量空间,读空间,将空间里面存放的数读出,赋值(写)给b*pa=200; //等价于a=200,*pa代表的就是a空间,然后对其进行写操作
b=*pa; //等价于b=a,*pa代表的就是a空间,然后从a空间读数据,写入b变量

传递指针

#include<stdio.h>void fun(int *pa,float *pb) {*pa=200;*pb=300.60;}
int main() {int a=10;float b=0.56;fun(&a,&b);printf("in main a=%d\n",a);printf("in main b=%f",b);return 0;
}

等价于

#include<stdio.h>
#include<string.h>void fun(int *pa,float *pb) {*pa=200;*pb=300.60;}int main() {int a=10;float b=0.56;
//	fun(&a,&b);int *pa=&a;float *pb=&b;fun(pa,pb);printf("in main a=%d\n",a);printf("in main b=%f",b);return 0;
}

传递普通数值与传递指针的异同

(1)相同点
都是将实参的数赋值给形参变量。
(2)区别
前者传递的是一个普通的数,后者传递的是门牌号,即地址(指针),可以通过地址操作它指向的变量空间。

指针的含义

a.指针是一个数
指针是一个地址,变量的指针指的都是变量第一个字节的地址。
地址(指针)具备指向作用

b.指针变量
指针变量是一个变量,用来存放指针(地址),指针变量不具有指向作用,指针变量只是用来存放地址。指针变量因为存放地址才有了指向作用,指针变量存放的指针具有指针作用
指针和指针变量是两个不同的概念,只是约定俗成,习惯统一称为指针。

提示:

当一个指针变量里面存放指针这个数后,即这个指针变量指向了某个空间,但是你自己应该非常清楚,本质并不是指针变量指向某个空间,而是这个指针变量内存放的指针指向某个空间。

连续内存

//连续的动态分配 
#include<stdio.h>
#include<stdlib.h>
int main(){
//	int *p=(int *)malloc (5*sizeof(int));
// 	*(p+3)=3;
//    printf("%d",*(p+3));int number;printf("input student number:");scanf("%d",&number);int *p=(int *)malloc (sizeof(int)*number);for(int i=0;i<number;i++){printf("input %d someone's  grade:",i+1);
//   	scanf("%d",&p[i]);scanf("%d",p+i);} //输出for(int i=0;i<number;i++){printf("%d\t",p[i]);//*(stu+i) } printf("\n");return 0;
} 

内存单一

//单一元素 
#include<stdio.h>
#include<stdlib.h>
int main(){int *p=(int *)malloc(sizeof(int));*p=3;printf("%d",*p);return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux基础必备

文章目录Linux系统中常用目录结构Linux下如何从普通用户切换到root用户Linux系统常用命令Linux系统文件中相关指令Linux查看开机自启动服务Linux常见服务列表Linux关闭某些服务&#xff08;临时关闭&#xff09;Linux关闭服务开机自启动Linux中在屏幕输入一句话Linux查看系统进…

Hadoop搭建集群中输入hdfs namenode -format格式化节点时,提示:hdfs: command not found 解决办法

分析原因&#xff1a; hadoop的安装路径没有加入到当前路径中 解决办法&#xff1a; 方法1&#xff1a; 进入hadoop的安装目录&#xff0c;在执行hadoop命令时在前面加上&#xff1a;./bin ./sbin 方法2: 进入/etc/profile文件中添加hadoop的安装路径 sudo vim /etc/profile添…

Python 微信定向问好

from numpy import * import itchat from threading import Timerdef get_userName():itchat.auto_login(hotReloadTrue)frienditchat.search_friends(name"飞鸟信")print(friend)userName friend[0][UserName]return userNamedef send_msg():userName get_userNam…

Linux高级编程实验(30个)

文章目录1&#xff09;输出Linux下的c也不是太难嘛&#xff01;在linux下编辑&#xff0c;编译&#xff0c;运行2&#xff09;编写一个简单地c语言程序,根据输入的两个整数求平均值并且在终端输出&#xff0c;通过gcc编译器得到它的汇编程序文件。3&#xff09;编写一个c语言程…

jsp中String path = request.getContextPath()的作用

<% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/"; %>上述语句是用来拼接当前网页的相对路径 request.getContextPath()获取web项目的根路…

登录界面验证码的实现

文章目录Javaweb实现验证码前端后台Springboot添加验证码项目结构依赖控制类前端页面效果图Javaweb实现验证码 前端 添加样式 <meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0, minimum-scale1.…

Javaweb MVC设计模式、Modle发展史、项目分层和三层架构

文章目录MVC设计模式MVC的目的MVC举例jspservletjavabean模式MVC的优点MVC的缺点Modle 发展史项目分层三层架构MVC设计模式 MVC模式&#xff08;Model-View-Controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&…

HTML表格和HTML表单

HTML 表格 表格由 <table> 标签来定义每个表格均有若干行&#xff08;由 <tr> 标签定义&#xff09;&#xff0c;每行被分割为若干单元格&#xff08;由 <td> 标签定义&#xff09; 字母 td 指表格数据&#xff08;table data&#xff09;&#xff0c;即数据…

Eclispe创建jsp文件,提示错误:“The import Xxx cannot be resolved“的解决方案

解决方案&#xff1a; a.(可能是jdk、tomcat版本问题) 右键项目->build path&#xff0c;将其中 报错的 libary或lib 删除后重新导入 b.清空各种缓存&#xff1a;右键项目->Clean tomcat... clean &#xff08;Project -clean或者 进tomcat目录 删除里面work的子目录&a…

JSP访问数据库,Session对象和九大内置对象

文章目录JSP访问数据库Session对象JSP九大内置对象JSP访问数据库 JSP就是在HTML中嵌套的java代码&#xff0c;因此java代码可以卸载JSP中&#xff08;<% … %>&#xff09; 导包操作&#xff1a; Java项目&#xff1a;1. Jar复制到工程中2.右键该Jar&#xff1a;build p…

HDFS学习 Java连接hadoop

文章目录建立连接获取hadoop下的文件信息编写hadoop连接工具类建立连接获取hadoop下的文件信息 import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLoc…

解决虚拟机没有ens33网卡的问题

话不多说&#xff0c;直接操作 解决办法 1.在终端中输入: sudo vim /etc/network/interfaces进入interfaces文件后&#xff0c;然后输入以下代码&#xff0c;然后保存退出 auto ens33 iface ens33 inet dhcp 2.重启虚拟机 输入ifconfig命令&#xff0c;成功启动ens33网卡

HDFS上传文件命令报错org.apache.hadoop.ipc.RemoteException(java.io.IOException)

作为作者&#xff0c;强烈不建议进行格式化hadoop&#xff0c;毕竟开发数据是最为重要的&#xff01; Hadoop 3.1 hdfs dfs -put /源文件路径 /目的文件路径解决方案 第一步&#xff1a;停止主节点&#xff08;Master&#xff09;和子节点服务&#xff08;Slave&#xff09; …

hadoop退出安全模式Name node is in safe mode

解决方案&#xff1a; hadoop dfsadmin -safemode leave或者&#xff1a; hdfs dfsadmin -safemode leave

图(Graph)的学习

文章目录图的认识图的概念无向图有向图简单图完全图子图连通、连通图、连通分量边的权和网加权图邻接和关联路径简单路径、简单回路环顶点的度、入度和出度割点&#xff08;关节点&#xff09;桥(割边)距离有向树图的表示邻接列表邻接矩阵图的遍历深度优先遍历广度优先遍历生成…

并查集(Disjiont Set)

并查集 并查集的最大作用是检测一个图上面存不存在环。 无向图&#xff0c;六个顶点 显然 1-2-4-3连成一个环 #include<stdio.h> #include<stdlib.h>#define VERTICES 6void initialise(int parent[]){int i;for(i0;i<VERTICES;i){parent[i]-1; }}int find_…

采用Kruskal算法生成最小生成树,并采用并查集的合并优化和查询优化。

文章目录最小生成树1.什么是图的最小生成树&#xff08;MST&#xff09;?2.最小生成树用来解决什么问题&#xff1f;Kruskal&#xff08;克鲁斯卡尔&#xff09;算法算法描述图解最小生成树 1.什么是图的最小生成树&#xff08;MST&#xff09;? 用N-1条边连接N个点&#x…

Java操作HBase

rowkey查询 //根据rowKey进行查询public static User getDataByRowKey(String tableName, String rowKey,String password) throws IOException {Admin admin connection.getAdmin();Table table connection.getTable(TableName.valueOf(tableName));Get get new Get(rowKe…

Java连接Mysql数据库(JDBC)

文章目录导入包con、stmt、rs 三者存在一定的关系getInt和getStringinput.nextInt();简单使用讲解ResultSet和StatementPreparedStatement的用法JDBC连接代码更多样例导入包 import java.sql.Connection; import java.sql.DriverManager; import java.sql.statement; import j…