C语言 指针

2023-10-27

1.变量的地址

变量对应内存中的一段存储空间,该段存储空间占用一定的字节数,可能是 1个字节,也可能是 4 或是 8 个字节,用这段存储空间的第一个字节的地址表示变量的地址,即低位字节的地址

变量的地址,可以通过 Reference (&) 引用运算符取得,在此可以称为取地址运算符
 

例子如下:

#include <stdio.h>
int main(void)
{
    int a; int b;
    printf("&a = %p\n",&a);
    printf("&b = %p\n",&b);
    return 0;
}

 

2.地址的大小

#include <stdio.h>
int main(void)
{
    char a ; short b; int c; long d;
    float e; double f;
    // 是一种 32 位 16 进制的整数
    printf("&a = %p\n", &a);
    printf("&b = %p\n", &b);
    printf("&c = %p\n", &c);
    printf("&d = %p\n", &d);
    printf("&e = %p\n", &e);
    printf("&f = %p\n", &f);
    //类型不同,大小相同,均为 4 字节
    printf("sizeof(&a) = %d\n", sizeof(&a));
    printf("sizeof(&b) = %d\n", sizeof(&b));
    printf("sizeof(&c) = %d\n", sizeof(&c));
    printf("sizeof(&d) = %d\n", sizeof(&d));
    printf("sizeof(&e) = %d\n", sizeof(&e));
    printf("sizeof(&f) = %d\n", sizeof(&f));
    return 0;
}

通过运算的方式,我们可以求得变量的地址。 32 位机的情况下,无论是什么类型,变量的地址大小均是 4。而 64 位机大小均是 8。这是由当前机型的地址总线决定的。

 

3.间接访问内存

dereference (*) 解引用运算符,在此处我们可以称为,取内容运算符。用法如下:

int main(void)
{
    char a = 1 ; short b=2; int c=3;
    printf("&a = %p\n", &a);
    printf("&b = %p\n", &b);
    printf("&c = %p\n", &c);
 
    printf("a = %d\n", *(&a));
    printf("b = %d\n", *(&b));
    printf("c = %d\n", *(&c));
 
    return 0;
}

 

4.指针常量

指针是有类型地址常量

#include<stdio.h>

int main(void)
{
    char a = 1 ; short b=2; int c=3;

    printf("&a = %p\n", &a);
    printf("&b = %p\n", &b);
    printf("&c = %p\n", &c);

    printf("a = %d\n", *((char*)0x0060FEAF));
    printf("b = %d\n", *((short*)0x0060FEAC));
    printf("c = %d\n", *((int*)0x0060FEA8));

    return 0;
}

 

#include<stdio.h>

int main()
{
    int data = 0x12345678;
    
    printf("%p\n",&data);
    
    printf("%x\n",*(&data));
    printf("%x\n",*((int*)0x0060FEAC)); //这是本人电脑data所在的地址复制下来的,结果相同
    
    printf("%x\n",*((char*)0x0060FEAC));//结果为:78
    printf("%x\n",*((short*)0x0060FEAC));//结果为:5678
    return 0;
}

通过上面这个例子可以知道,指针的本质是一个有类型的地址,类型决定了,从这个地址开始的寻址能力。

(由于我们PC遵从小端序,所以我们的寻址能力就是看包含多少个字节,从78开始寻址)

 

5.指针变量

一个指针是一个有类型地址,是一个有类型的常量。用以存放指针的量,我们叫作,指针变量。一个指针变量却可以被赋予不同的指针值,可以能过指针变量改变指向和间接操作。
 

指针变量的定义

type * variable;

* 表示该变量是一个指针变量
type 表示该变量的内存放的地址的寻址能力

 

6.指针运算

#include<stdio.h>

int main()
{
    int a = 0x0001;
    printf("a = %#x a+1 = %#x\n",a,a+1);  //这里是int的运算,直接加1

    int *p = (int*)0x0001;
    printf("p= %#x p+1 = %#x\n",p,p+1);//这里是 int * 的运算,加的是步长,所以加4

    int aa = 0x0008;
    printf("aa = %#x aa-1 = %#x\n",aa,aa-1);//这里是int的运算,直接减1

    int *q = (int*)0x0008;
    printf("p= %#x p-1 = %#x\n", q, q-1);// int * 的运算,所以减4

    int arr[10];
    int * pHead = &arr[0]; int* pTail = &arr[9];
    printf("%d\n",pTail-pHead);  //结果为9,有9个跨度
    
    //arr[0]+8 = arr[9]  ,即 arr[0]+8*sizeof(int) = arr[9]

    int  ppHead = (int)&arr[0]; int ppTail = (int)&arr[9];
    printf("%d\n",ppTail-ppHead);  //结果为36

    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 指针 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 什么是拦截器?什么是过滤器?

    原文链接 https www longkui site program frontend pipe 4408 0 背景 写项目的时候用到了拦截器 会决定哪些接口拦截 哪些接口不拦截 偶尔一次等保测评的时候又遇到了筛选器 这篇文章简单总结一下
  • echarts 折现图和柱状图 样式修改 设置折线样式 背景(文末附带完整代码)

    1 设置折线图样式 修改后 背景竖条纹间隔 去掉边框 设置折线和节点颜色 设置数据字体颜色 设置折线样式 设置折线图的背景样式 2 设置柱状图样式 修改后 设置柱子的样式 设置柱状图背景 完整代码 路径配置 require config p
  • postman中,发送接口请求,报错Error: connect ECONNREFUSED 10.10.10.33:1111(未完成)

    1 问题 postman发送接口请求 报错Error connect ECONNREFUSED 10 10 10 33 1111 postman执行接口 用的是ip 端口 接口路径进行访问 图1 拒绝连接 图2 2 解决 在网上找了一个 说
  • 野蛮生长的前端,从杂牌军到正规军

    笔者从事后台研发多年 对前端实在是没有多少发言权 下面就斗胆以门外汉的角度聊聊近来对前端技术的一些见解 也自当整理一下思路 使前端技术如何更好的融入到整个产品研发架构中来 这里的前端语言不仅限于js 还是css html等等 来看一看201
  • Java动态绑定和静态绑定

    Java动态绑定和静态绑定 程序绑定 静态绑定 动态绑定 程序绑定 程序绑定 一个方法的调用与方法所在的类 方法主题 关联起来 即计算机要明确最终执行的方法是谁的方法 对Java来说 绑定分为静态绑定和动态绑定 或者叫做前期绑定和后期绑定
  • bash: scp: 未找到命令 lost connection

    通过ssh免密通道上传备份时报错 bash scp 未找到命令 lost connection 解决 分别查看发送端服务器 接收端服务器 1 查找命令是否存在 whereis scp 不存在就重新安装 yum install openssh
  • PyQt5实现父窗口内点击按钮显示子窗口(窗口嵌套功能)

    摘要 在软件中 常会有点击某个按钮 显示一个新的子界面的需求 本文介绍如何在PyQt5中实现这一功能 主要涉及知识点是 信号与槽函数的自动绑定 程序说明 1 开发环境 win10系统 pycharm2021 python3 7 2 实现功能
  • RGBLCD显示实验————复习到这

    目录 LCD 和eLCDIF 简介 LCD 简介 eLCDIF 接口 硬件原理分析 实验程序编写 编译下载验证 编写Makefile 和链接脚本 编译下载 LCD 液晶屏是常用到的外设 通过LCD 可以显示绚丽的图形 界面等 提高人机交互的
  • 图书管理系统 ——mysql数据库

    java图形化 图书管理系统 使用mysql数据库 此博客是本人一次Java实验课作业 1 管理员操作 能够实现图书的增 删 改 查操作 2 普通注册用户操作 1 借阅图书 借阅成功后 对应图书在馆数量相应减1 2 归还图书 归还成功后 对
  • Flutter 自定义steps(横向步骤条,纵向步骤条)

    近期做flutter开发 实现一个自定义进度条功能 直接上代码 import package flutter material dart import package flutter screenutil flutter screenuti
  • C++之大数相乘

    1 问题描述 两个大数相乘 输入是两个字符串 如 99 99 实现两个数的相乘 返回结果也是一个字符串 结果是 9801 因为是C 所以使用string 输入描述 输入两个字符串 输出描述 输出为一行 2 代码 分析在代码中 include
  • qt学习笔记4:QMainWindow 菜单栏、工具栏、状态栏、铆接部件、

    在创建基类的时候 有三大选择 一个是QWidge 空窗口 另一个就是QMainWindow QMainWindow是一个为用户提供主窗口的类 包含一个菜单栏 多个工具栏 多个链接部件 一个状态栏以及一个中心部件 是许多应用程序的基础 如文本
  • 深度学习实战之车牌识别项目

    车牌识别项目 不经常上线 既然有人想要代码 现在我将它发出来 不过需要你们下载 具体下载方法 我想你们都懂得 https download csdn net download weixin 43648821 11423543 本博客关于深度
  • 为什么MySql喜欢B+树

    目录 怎样的索引的数据结构是好的 什么是二分查找 什么是二分查找树 什么是自平衡二叉树 什么是 B 树 什么是 B 树 1 单点查询 2 插入和删除效率 3 范围查询 MySQL 中的 B 树 总结 参考文献 为什么 MySQL 采用 B
  • filter、map函数的区别

    1 def even num 2 if num 2 0 3 return True 4 return False 5 lis 1 2 3 4 5 6 7 8 9 6 res filter even lis 7 print filter li
  • 华为申请注册盘古大模型商标;京东推出言犀大模型,率先布局产业应用

    7月14日科技新闻早知道 一分钟速览 1 华为申请注册盘古大模型商标 据天眼查 App 显示 7 月 7 日 华为技术有限公司申请注册 华为云盘古 Huawei Cloud Pangu Models 文字及图形商标 国际分类为网站服务 社会
  • 未知的生成错误“因为没有预加载,所以无法解析程序集“System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f1

    搜索System Drawing dll 添加到工程中
  • EVE上传Dynamips、IOL和QEMU镜像

    1 镜像保存目录 opt unetlab addons dynamips Dynamips镜像保存目录 iol IOL镜像保存目录 运行IOU的镜像 qemu QEMU镜像 运行ASAv ISE F5等等镜像 2 上传dynamips镜像
  • 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)

    k近邻算法 kNN 本博客来源于CSDN http blog csdn net niuwei22007 article details 49703719 本博客源代码下载地址 CSDN免费下载 GitHub下载地址 均带有详细注释和测试数据
  • C语言 指针

    1 变量的地址 变量对应内存中的一段存储空间 该段存储空间占用一定的字节数 可能是 1个字节 也可能是 4 或是 8 个字节 用这段存储空间的第一个字节的地址表示变量的地址 即低位字节的地址 变量的地址 可以通过 Reference 引用运