c语言笔记 指针篇(上)

embedded/2025/3/6 1:07:33/

1.指针

在计算的存储器中有很多的存储单元,我们的操作系统把这些存储单元以字节为单位进行编号,也就是每个存储单元(字节),都有编码。这些编码在我们内存中就称为地址。一个字节有八位,位是存储信息的最小单位,字节是存储单元的基本单位。

指针就是地址;指针变量就是存放别人的地址的变量。(指针就是用来放地址的)

一级指针存放整型,浮点型,字符型,数组,函数。

那么一级指针存放别人的地址,它本身有地址吗?

答案是有的,我们专门用二级指针来存放一级指针的地址。

二级指针是存放一级指针的地址。那么二级指针也是有地址的,我们就有三级指针。

注意我们的一级指针跟二级指针的类型也要匹配。

c语言中相同符号有不同的含义

int *p; //此处的*p 是表示指针标记

int a = 3; p=&a;//指针初始化

*p = 30;//此处的*p 是解引用,取目标操作符 在c语言中相同的操作符是有着不同的含义的。

int *(*q);//此处的*q 跟上面的*p是一样的,都是指针的标记。定义一个二级指针 而int * 是类型,这样的理解就是q是一个指针,指针int *类型。

2.指针的偏移理解

类型+数组名+n,偏移量是类型的字节大小。 例如 int a[4], a+1标识a代表首元素的地址偏移四个字节;*(a+1) 等价于a[1]; 一次是偏移四个字节,也就是一个整型。

char a[4], a+1标识数组名a代表首元素的地址偏移一个字节,也就算是一个char型。

那么,我们char型跟int型之间要怎么转换呢,我们可以用一个指针指向char型数组,然后对指针进行偏移。

如果是int a[3] = {1,2,3};

int (*p)[3] = &a;

p,&a,a三者表示的地址是一样的,但它们表示的含义是不一样的。

1.p表示想系统申请一块空间存储了数组a这这块内存空间的地址

2.&a表示数组a这块内存空间取地址

3.a在这里表示首元素地址

p+1 //表示数组名a代表的首地址整体的偏移12个单位,因为要偏移三个整型,所以就是偏移12个字节。

#include <stdio.h> //指针的偏移
int main()
{int a[3] = {1, 2, 3}; // 初始化一维数组int *p = a; // 等价于  p = a;printf("%p\n", a);// printf("%p\n", a);// printf("%p\n", p);// printf("%p,%d\n", p + 1, *(p + 1));// printf("%p,%d\n", p + 2, *(p + 2));// printf("---------------------\n");int(*q)[3] = &a; // 类型匹配 int [3] 存放数组a的地址printf("%p\n", a);printf("%p\n", q);q = &a;// char *qq = p;printf("%d\n", **q);printf("---------------------\n");printf("%p\n", *q); // q == &a;  *q == a      &a跟a的地址都是首元素的地址。// 但是&a 跟 a 两个+1的偏移量是不同的printf("%p\n", a);printf("---------------------\n");printf("%p\n", q);printf("%p\n", a+1);printf("%p\n", q+1);char *qq = p;printf("%d\n", *qq);return 0;
}


http://www.ppmy.cn/embedded/170345.html

相关文章

接口测试工具:postman详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Postman 是一款功能强大的 API 开发和测试工具&#xff0c;以下是一些高级用法的详细介绍和操作步骤。 一、环境和全局变量 环境变量允许你设置特定于环境&#…

【云原生之kubernetes实战】在k8s环境下部署Vikunja任务管理工具

【云原生之kubernetes实战】在k8s环境下部署Vikunja任务管理工具 前言一、Vikunja介绍1.1 Vikunja简介1.2 Vikunja主要特点1.3 使用场景二、kubernetes介绍2.1 kubernetes简介2.2 kubernetes特点三、本次实践介绍3.1 本次实践简介3.2 本次环境规划四、检查k8s环境4.1 检查工作节…

FlashMLA(DeepSeek开源周,第一个框架):含源码分析

1. 概述 FlashMLA 是由 DeepSeek 原创开发的一种深度学习框架&#xff0c;专门用于加速多头注意力机制&#xff08;MLA&#xff09;架构的推理过程。它通过优化内存管理和计算效率&#xff0c;显著提升了模型在高性能 GPU 上的推理速度。FlashMLA 主要适用于 DeepSeek 的架构模…

Leetcode1 两数之和 python两种方法实现

Leetcode1 两数之和 python两种方法实现 文章目录 Leetcode1 两数之和 python两种方法实现方法一&#xff1a;枚举法&#xff08;暴力解法&#xff09;方法二&#xff1a;用空间换时间。 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为…

【Vue CLI脚手架开发】——2.ref属性

文章目录 前言一、ref属性二、使用步骤1.实现代码2.结果展示 前言 Vue 的 ref 属性是框架中用于直接访问 DOM 元素或子组件实例的核心特性&#xff0c;在模板中标记元素或子组件&#xff0c;通过 this.$refs 获取其引用&#xff0c;支持直接操作 DOM 或调用子组件方法。 一、r…

threejs:用着色器给模型添加光带扫描效果

第一步&#xff1a;给模型添加光带 首先创建一个立方体&#xff0c;不进行任何缩放平移操作&#xff0c;也不要set position。 基础代码如下&#xff1a; 在顶点着色器代码里varying vec3 vPosition;vPosition position;获得threejs自动计算的顶点坐标插值&#xff08;也就…

力扣1594. 矩阵的最大非负积

力扣1594. 矩阵的最大非负积 题目 题目解析及思路 题目要求返回从左上到右下的最大非负积&#xff0c;本题和简单图dp的区别就是出现了负数 若grid[i][j] > 0则和简单图dp一致&#xff0c;dp[i][j] max(dp[i-1][j],dp[i][j-1]) * grid[i][j] 若grid[i][j] < 0则分两…

自学微信小程序的第十天

DAY10 1、调用wx.login()方法获取用户登录凭证code,然后将它发送给开发者服务器。 表43:wx.login()方法的常用选项 选项 类型 说明 timeout number 超时时间,单位为毫秒 success function 调用成功的回调函数 fail function 调用失败的回调函数 complete function 调用结束…