C语言基础---指针的基本语法
概述
内存地址
- 在计算机内存中,每个存储单元都有一个唯一的地址(内存编号)。
- 通俗理解,内存就是房间,地址就是门牌号

指针和指针变量
- 指针(Pointer)是一种特殊的变量类型,它用于存储内存地址。
- 指针的实质就是内存“地址”
- 指针变量就是存储这个地址的变量。

指针作用
可间接修改变量的值
指针变量的定义和使用
- 指针也是一种数据类型,指针变量也是一种变量
- 指针变量指向谁,就把谁的地址赋值给指针变量
语法格式:
类型 变量;
类型 * 指针变量 = &变量;
- & 叫取地址,返回操作数的内存地址
- 叫解引用,指操作指针所指向的变量的值
- 在定义变量时,* 号表示所声明的变量为指针类型
指针变量要保存某个变量的地址,指针变量的类型比这个变量的类型多一个* - 在指针使用时,* 号表示操作指针所指向的内存空间
示例代码:
#include <stdio.h>int main() {// 定义一个int类型的变量,同时赋值为10int a = 10;// 打印变量的地址printf("&a = %p\n", &a);// 定义一个指针变量,int *保存int的地址// int *代表是一种数据类型,int *指针类型,p才是变量名int* p;// 指针指向谁,就把谁的地址赋值给这个指针变量p = &a;// 打印p, *p, p指向了a的地址,*p就是a的值printf("p = %p, *p = %d\n", p, *p);return 0;
}

通过指针间接修改变量的值
指针变量指向谁,就把谁的地址赋值给指针变量
通过 *指针变量 间接修改变量的值
#include <stdio.h>int main() {// 定义一个int类型变量a,同时赋值为0int a = 0;// 定义int *指针变量,同时赋值a的地址int *p = &a;// 通过指针间接修改a的值*p = 123;printf("a = %d\n", a);// 定义一个int类型变量b,同时赋值为5int b = 5;// p 保存 b的地址p = &b;// 通过指针间接修改b的值*p = 250;printf("b = %d\n", b);return 0;
}
指针与常量
- 语法格式
int a = 1;
const int *p1 = &a; // 等价于 int const *p1 = &a;
int * const p2 = &a;
const int * const p3 = &a;
从左往右看,跳过类型,看修饰哪个字符
如果是*, 说明指针指向的内存不能改变
如果是指针变量,说明指针的指向不能改变,指针的值不能修改
#include <stdio.h>int main() {int a = 1;int b = 2;// p1 可以改,*p1不能改const int *p1 = &a; // 等价于 int const *p1 = &a;// p1 = &b; // ok// *p1 = 555; // err// p2 不能修改,*p2可以修改int *const p2 = &a;// p2 = &b; //err// *p2 = 555; // ok// p3 和 *p 都不能改const int *const p3 = &a;// p3 = &b; // err// *p3 = 555; // errreturn 0;
}
指针大小
- 使用sizeof()测量指针的大小,得到的总是:4或8
- sizeof()测的是指针变量指向存储地址的大小
- 在32位平台,所有的指针(地址)都是32位(4字节)
- 在64位平台,所有的指针(地址)都是64位(8字节)
#include <stdio.h>int main() {int *p1;int **p2;char *p3;char **p4;printf("sizeof(p1) = %llu\n", sizeof(p1));printf("sizeof(p2) = %llu\n", sizeof(p2));printf("sizeof(p3) = %llu\n", sizeof(p3));printf("sizeof(p4) = %llu\n", sizeof(p4));printf("sizeof(double *) = %llu\n", sizeof(double *));return 0;
}
指针步长
- 指针步长指的是通过指针进行递增或递减操作时,指针所指向的内存地址相对于当前地址的偏移量。
- 指针的步长取决于所指向的数据类型。
- 指针加n等于指针地址加上 n 个 sizeof(type) 的长度 指针减n等于指针地址减去 n 个 sizeof(type) 的长度
#include <stdio.h>int main() {char ch;char *p1 = &ch;printf("p1:%p, p1+1: %p\n", p1, p1 + 1); // 步长为1字节int a;int *p2 = &a;printf("p2:%p, p2+1: %p\n", p2, p2 + 1); // 步长为4字节double d;double *p3 = &d;printf("p3:%p, p3+1: %p\n", p3, p3 + 1); // 步长为8字节return 0;
}
野指针和空指针
- 指针变量也是变量,是变量就可以任意赋值
- 任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针
- 此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)
- 野指针不会直接引发错误,操作野指针指向的内存区域才会出问题
- 为了标志某个指针变量没有任何指向,可赋值为NULL
- NULL是一个值为0的宏常量
#include <stdio.h>int main() {int *p;p = 0x12345678; // 给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义// *p = 1000; // 操作野指针指向未知区域,内存出问题,errprintf("111111111111111111\n");int *q = NULL; // 空指针return 0;
}
多级指针
C语言允许有多级指针存在,在实际的程序中一级指针最常用,其次是二级指针。
二级指针就是指向一个一级指针变量地址的指针。
#include <stdio.h>int main() {int a = 100;// 一级指针int* p1 = &a;printf("&a=%p\n", &a);printf("p1=%p\n", p1);printf("&p1=%p\n", &p1);// 二级指针,可以存储一级指针变量的地址int** p2 = &p1;printf("p2=%p\n", p2);printf("&p2=%p\n", &p2);// 三级指针,可以存储二级指针变量的地址int*** p3 = &p2;printf("p3=%p\n", p3);printf("&p3=%p\n", &p3);printf("---------------------\n");// 通过一级指针访问100,打印出来printf("*p1=%d\n", *p1);// 通过二级指针访问100,打印出来printf("**p2=%d\n", **p2);// 通过三级指针访问100,打印出来printf("***p3=%d\n", ***p3);return 0;
}
相关文章:
C语言基础---指针的基本语法
概述 内存地址 在计算机内存中,每个存储单元都有一个唯一的地址(内存编号)。通俗理解,内存就是房间,地址就是门牌号 指针和指针变量 指针(Pointer)是一种特殊的变量类型,它用于存储内存地址。指针的实…...
记录--病理切片图像处理
简介 数字病理切片,也称为全幻灯片成像(Whole Slide Imaging,WSI)或数字切片扫描,是将传统的玻片病理切片通过高分辨率扫描仪转换为数字图像的技术。这种技术对病理学领域具有革命性的意义,因为它允许病理…...
Android使用shape属性绘制边框内渐变色
目录 先上效果图实现方法shape属性介绍代码结果 先上效果图 这是使用AndroidStudio绘制的带有渐变色的边框背景色 实现方法 项目中由于UI设计需求,需要给按钮、控件设置带有背景色效果的。以下是UI效果图。 这里我们使用shape属性来绘制背景效果。 shape属性介…...
分类算法(数据挖掘)
目录 1. 逻辑回归(Logistic Regression) 2. 支持向量机(Support Vector Machine, SVM) 3. 决策树(Decision Tree) 4. 随机森林(Random Forest) 5. K近邻(K-Nearest …...
scaling laws for neural language models
关于scaling law 的正确认识 - 知乎最近scaling law 成了最大的热词。一般的理解就是,想干大模型,清洗干净数据,然后把数据tokens量堆上来,然后搭建一个海量H100的集群,干就完了。训练模型不需要啥技巧,模型…...
水经微图IOS版5.2.0发布
随时随地,微图一下! 水经微图(简称“微图”)IOS新版已上线。 在该版本中主要新增图层树节点排序功能、常规(矩形、圆、椭圆、扇形)绘制功能、地形夸张等主要功能。 当前版本 当前版本号为:5…...
聚观早报 | 哪吒L上市定档;iPhone 16最新高清渲染图
聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 4月10日消息 哪吒L上市定档 iPhone 16最新渲染图 华为太空表与问界M9联动 蔚来万里长城加电风景线正式贯通 Red…...
【C++】手搓 list 容器
送给大家一句话: 若结局非你所愿,就在尘埃落定前奋力一搏。—— 《夏目友人帐》 手搓 list 容器 1 前言1.1 底层结构1.2 使用场景1.3 功能简介 2 框架搭建2.1 节点类2.2 list 类2.3 迭代器类 3 功能实现3.1 begin() 与 end()3.2 插入操作3.3 删除操作3…...
LinkedList用法详解(Java)
LinkedList LinkedList 是 Java 中的一个常用类,它实现了 List 接口,采用双向链表数据结构。 1. 创建 LinkedList 对象 import java.util.LinkedList;LinkedList<String> linkedList new LinkedList<>();2. 添加元素 linkedList.add(&q…...
34. 在排序数组中查找元素的第一个和最后一个位置
Problem: 34. 在排序数组中查找元素的第一个和最后一个位置 文章目录 思路解题方法复杂度Code 思路 二分查找, 口诀:左右右,求左段区间的右端点,动r 解题方法 两次二分查找 复杂度 时间复杂度: O ( l o g n ) O(logn) O(logn) 二…...
音乐文件逆向破解
背景 网易云等在线音乐文件的加密源码都按照一定的规则加密,通过对音乐文件的源码分析转化,有望实现对加密文件的解密 实现内容 实现对加密音乐文件的解密 实现对无版权的音乐文件的转化 实现环境 010editor 010 Editor是一个专业的文本编辑器和十六…...
xhci 数据结构
xhci 数据结构 xhci 数据结构主要在手册上有详细的定义,本文根据手册进行归纳总结: 重点关注的包括: device contexttrb ringtrb device context设备上下文 设备上下文数据结构由xHC管理,用于向系统软件报告设备配置和状态信息。…...
Go——Goroutine介绍
一. 并发介绍 进程和线程 进程是程序在操作系统中一次执行过程,系统进程资源分配和调度的一个独立单位。线程是进程执行的实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程可以创建和撤销多个线程,…...
Centos7,部署etcd集群,基于二进制包,https安全通讯
由于etcd集群https通讯,所以需要自建CA数字证书,学习使用https部署etcd集群前,可以先完成一下,基于http通信的etcd集群: 关于CA原理以及工作可以阅读,以下两篇文章: CA工作原理 对称加密与非对…...
设置MariaDB,创建新库,新用户并授权其可以从任何主机登录
OS:CENTOS 7 1、从系统进入MariaDB # mysql -u root -p 这里的root是指MariaDB的管理员用户,和系统的root不搭边,只是同名而已。 2、看下有哪些库、用户 MariaDB [(none)]> show databases; MariaDB [(none)]>select user,host from mysql.us…...
每日一VUE——组件的生命周期
文章目录 VUE组件的生命周期生命周期钩子函数实例创建Teleport VUE组件的生命周期 组件生命周期 组件从创建到挂载、更新、到销毁的一系列过程被称为组件的生命周期。 生命周期函数 在组件的各个生命周期节点执行的函数,为生命周期钩子函数。 生命周期钩子函数…...
Redis中的BigKey
Redis中的BigKey 文章目录 Redis中的BigKey什么是BigKey?BigKey的危害找到Bigkey删除BigKey优化BigKeyBigKey对持久化的影响对AOF日志的影响对AOF重写和RDB的影响 什么是BigKey? 大 key 并不是指 key 的值很大,而是 key 对应的 value 很大。…...
MySQL中的存储过程详解(上篇)
使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法,看完代码自己敲一遍,十分有用 拖动表名到查询文件中就可以直接把名字拉进来中括号,就代表可写可不写 目录 1.认识存储过程 1.1 存储过程的作用 1.2 存储过程简介…...
面试官:说一说CyclicBarrier的妙用!我:这个没用过...
写在开头 面试官:同学,AQS的原理知道吗? 我:学过一点,抽象队列同步器,Java中很多同步工具都是基于它的… 面试官:好的,那其中CyclicBarrier学过吗?讲一讲它的妙用吧 我&…...
MySQL高可用搭建方案MHA
MHA架构介绍 MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中&am…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
