c语言:指针知识点

C语言程序设计:C语言指针知识点复习-1 指针的主要知识点:指针与数组;指针与函数;动态内存管理;高级指针 阅读详情

1. 内存与指针

内存是给程序运行而开辟的空间。如果不考虑动态内存,就有创建变量和数组两种方式。
内存可以视分解为大量内存单元,一个内存单元大小为 8 个比特位,每个内存单元都有一个编号,这个编号就是指针。(int *pa=&a;
a是房间,&a是房间号,*pa 是记录房间号的纸条 )
只有嵌入式的地址是实际物理空间,其余是假想的。

2. 取地址操作符

& 用于取出变量的地址。

#include <stdio.h>
int main()
{
int a = 10;
&a; // 这里就是直接取出地址,是指针
printf(“%p\n”, &a);
return 0;
}


 # #    3. 指针变量

用于存放地址的一种变量。

例:`int *pa = &a;` 就是把 a 的地址存放到 pa 中,这也是用 `&a` 给 pa 初始化(`&a` 是读出的地址)。
pa就是指针变量
全局变量(`int *pa`):

```c
int main()
{
    int a = 0;
    int *pa = NULL;
    return 0;
}

此时相当于 pa 没有存放地址,可以之后再存。

但是,如果是局部变量,&a 在一个小函数内,此时 int *pa 是一个未知数,也叫做野指针,不可以强行使用。

4. 理解指针类型

int a = 10;
int *pa = &a;

这里 * 说明 pa 对应指针变量,但 int 对应的是 pa 的类型,总说是一个整型的指针。

5. 解引用操作符 *(既有标记作用,也有访问作用)

#include <stdio.h>
int main()
{
    int a = 10;
    int *pa = &a;
    *pa = 0;
    return 0;
}

*即提示pa是指针变量,又有去访问的意思
这里 *pa 是通过 pa 中存放的地址,找到 a,将 a 赋值为 0(找到门牌号,然后找客人)。

6. 指针的大小

例:printf("%zd\n", sizeof(int *))

1 字节 = 8 比特。

  • 32 位平台下地址是 32 比特,4 字节
  • 64 位平台下地址是 64 比特,8 字节

指针变量的大小只与平台有关。
*char
*int
*short 它们的指针变量大小都是一样的,差别只是±1的时候它会跨越本元素内部的多少个byte,从而到达下一个元素,最终达到遍历打印的目的。
指针解引用(找到 pi 里存的地址,找到对应的内存空间,修改里面的数值):

``公式:指针+n=地址+n*

int *pi = &a;
*pi = 0;

char *pi = (char *)&a;
*pi = 0;

pi   = 001EFA94
pi+1 = 001EFA98
pc   = 001EFA94
pc+1 = 001EFA95
 
 
 通俗理解:
 int* pi+1 :跨过当前int内部剩下3个字节,直接落到下一个完整int元素的起始地址。
 char* pc+1 :只前进1个字节,到相邻的字节。
 
 这就是为数组遍历设计:
数组是一片连续同类型元素。用对应类型指针, p+1 自动跳到下一个数组元素,不用手动算字节。
 
- 想遍历int数组 → 用 int* 
- 想遍历char数组(字符串)→ 用 char* 
- 想遍历short数组 → 用 short* 
前者可以把 4 个字节改为 0,但后者只可以改一个,这是不同类型对解引用操作符的作用权限。

总结一下:

- 指针变量的大小只与平台有关
- 指针对解引用操作符的权限与指针类型有关

## 7. 指针加减整数

指针类型决定了指针向前或向后的距离,但指针必须跨越与自己同类型的距离。

- `char * + 1` 向前走 1 个byte
- `int * + 1` 向前走 4 个byte

## 8. void* 指针

专门用于接收不同类型的地址。

```c
void *pa = 10;
void *pc = 10;

pc 和 pa 可以接收不同类型的地址。

9. 指针加减指针

  • 指针加减指针 = 整数
  • 指针加减整数 = 指针

F2897 - 2 = F2895

指针加减指针的结果绝对值是指针间元素的个数(必须在同一个内存中)。

#include <stdio.h>
int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    printf("%d\n", &arr[4] - &arr[2]);
    return 0;
}

这里 &arr[4] - &arr[2] 便是指针加减指针。

10. 指针的比较

本质:一个数值。用数组举例。

先明确一个点:p 这个存的是地址,*p 这个既是指针符号,也是解引用,取数组里的数。

#include <stdio.h>
int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    int *p = &arr;
    int sz = sizeof(arr) / sizeof(arr[0]);
    while (p <= &arr[sz]) // 这个地方就是用到了指针的比较
    {
        printf("%d\n", *p);
        p++;
    }
    return 0;
}

11. 传值调用和传址调用

前者相当于给复印件,不给原稿;但后者相当于直接给原稿。前者实参不改变形参,改不了原值;但后者可以改实参。

传值调用:(适用于之读取数据而不修改原值,如果要接收那个原值的话,就要弄一个新的变量去接收)

void change(int a)
{ 
  a=100;  
}
int main()
{  int num=10;
    change(num);
    printf("%d",num);
return 0;
}```

这种情况无返回值。
结果还是10
传址调用:(适用于需要修改外部变量)

```c
#include <stdio.h>
void change(int a)
{
    *a=100;    
}
 int main()
 {
    int num=10;
     change(&num);
     printf("%d",num);
}

这样才打开房门,把数值传过去。

一个是把门牌改变,里面数值不变;一个是打开房门,改数值。后者才可以建立函数与主函数的关系。

12. 二级指针

用来存放一级指针的指针变量。**ppa 用来存放 pa 的指针变量,访问 pa。

13.整形提升

整型提升(课程顺带内容)

CPU运算单元ALU,默认以int长度来做计算。
只要表达式里面, char / short 这类小于int长度的整型,运算前自动转成int,这个转换叫整型提升。

规则

  1. 有符号char/short:按照符号位补齐高位
  2. 无符号char/short:高位补0

示例代码

c

char a = 10;
char b = 120;
char c = a + b;
printf(“%d\n”,c); // 输出 -126

分析:

  1. char是1字节,范围 signed char:-128 ~ 127
  2. a+b=130,超出char上限127,发生溢出
  3. 130 二进制: 10000010 ,作为signed char,最高位是符号位 → 代表-126

一句话总结:char、short做运算,会先提升成int算;算完再截断放回char/short变量。

其实就是把a和b的补码相加,得到c的补码,最高位不动,0000010,之后取反,1111101,之后+1,1111110这里有7为数是参与计算的,最高位只用于符号判断,和计算无关。

14六、常见易错点汇总

  1. ❌ 误区:指针变量大小由指向类型决定
    ✅ 纠正:指针大小只看32/64位系统,全部指针一样大。指针类型只控制解引用访问字节数、指针+1的偏移步长。
  2. ❌ 误区: int* p , *p 是指针变量名字
    ✅ 纠正:变量名是p; int * 是类型, * 只是标记这是指针。
  3. ❌ 误区: pi+1 是地址+1字节
    ✅ 纠正: pi+1 = 地址 + 1 * sizeof(int) ,一次跳过一整个int。
  4. ❌ 随便把int地址直接赋值给char*不会出事
    ✅ 纠正:语法允许强制转换,但是解引用的时候只会读写1字节,容易出现数据异常。
  5. 只有数组内的两个指针相减才有意义,不同变量的指针相减无意义。

15 const 修饰指针(有三种写法)

1.const intp 这里是指p不可以修改,但是可以换p。(相当于可以换房间,但是不可以专门去换房间里的床)

  1. int *p const 这里不可以换p,但是可以换p
    (相当于可以换房间里的被子,但是不可以换房间)

3.const int p const 这里既不可以换p,也不可以换p

例子:const int*p=&a; 这里已经固定好了
如果 *p=100; 这里就会报错
但是 p=&c;这里没问题(换了一个地址)

const离谁近,谁就不可以改

16 野指针

指针指向的内存是不处于当前可用程序,是无法访问的

造成这个的三个成因
1.没有给指针初始化,使指针存随机的垃圾地址,
自然找不到对应的内存了
2.指针越界:超出数组/变量的内存范围
3.返回局部变量的地址:函数结束,局部变量栈镇会自动销毁。除非加上一个static,这样就可以把它给保留了

17 assert断言

头文件:#include<assert.h>
作用:括号内表达式为假时,程序直接跳出一个界面报错(这个就是用来找错误的)

#include<assert.h>
int main()
{
int a=10;
assert(a==15); //在这一步就直接报错了
return 0;
}

C语言指针基础知识点(四)--通过指针引用数组 前期回顾   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数 通过指针引用数组元素 引用一个数组元素,可以用以下两种方法: 1.下标法,如 a[i] 形式; 2.指针法,如 *(a+i)或 *(p+i)。其中 a 是数组名,p是指向数组元素的指针变量,其初值为 p=a; 栗子: 有一个整... 阅读详情

相关推荐

从UART到RS485:手把手教你用SIT3485E收发器搞定工业级通信(含原理图与PCB布局要点)

本文详细解析了从UART到RS485的工业级通信转换,重点介绍了SIT3485E收发器的原理图设计、PCB布局要点及抗干扰技巧。通过差分信号传输和优化电路设计,实现长距离、多设备稳定通信,适用于工业自动化等复杂环境。

weixin_29169505的博客 352

C语言知识点总结:指针

一说到指针,大家可能都觉得,这才是C语言,但是关于指针,你又知道多少呢? 一、什么是指针? 先来说一说,什么是指针? 指针是一种特殊的数据类型,使用指针可以定义变量,这个变量就叫做指针变量 指针变量中存储的是整型数据,代表了内存编号,通过这个编号可以访问对应的内存' 二、为什么要使用指针 1、函数之间相互独立,但有时是需要共享变量 传参是单向传递 全局变量容易命名冲突 使用数组还需要...

wangshengge的博客 2289

基于PLC智能立体车库控制系统设计

摘要 本系统设计以三层立体车库为研究对象,通过对立体车库的原理分析、动作流程设计和一系列的软硬件设计,达到立体车库自动化控制的目的。系统采用可编程控制器作为立体车库控制系统的控制单元,实现该系统的工艺要求,通过程序仿真调试,完成系统的各种动作要求,达到自动控制的目的。系统设计分为总体设计、硬件设计以及软件设计。按照立体车库控制系统的控制策略进行图纸设计;重点分析工艺流程图,对立体车库控制系统进行程序编译和MCGS上位机调试,通过系统的调试和修改,达到了基本控制的要求。系统设计明确了工艺要求,确定

DX884164131的博客 3601

C语言指针知识点(三):指针数组与数组指针

1.指针数组 即指针的数组,本质是一个数组,数组的每个元素都是指针变量   定义指针数组,含有4个元素,每个元素都是一个char *类型的指针,指向字符串 char *p[] = { "lemon","C language","hello world","=.=!" }; 直接将p[0],p[1]等当作普通指针使用: for (int i = 0; i &lt; sizeof(p...

Lemon_jay的博客 1390

手把手教你用STM32F103的IO口模拟XY2-100协议驱动数字振镜(附Keil O3优化代码)

本文详细介绍了如何使用STM32F103的IO口模拟XY2-100协议驱动数字振镜,包括协议解析、偶校验算法、寄存器级优化及Keil O3编译下的性能调优。通过硬件配置、核心代码实现和优化技巧,帮助开发者实现高速二维偏转控制,适用于工业激光雕刻和精密定位系统。

weixin_42527401的博客 261

Linux平台CCS安装配置完整示例

手把手讲解在Linux系统中完成CCS安装与环境配置的全过程,涵盖关键步骤与常见问题解决,是查找ccs安装教程时不可多得的实战指南。

weixin_42601134的博客 516

C语言:指针全套核心知识点总结

本文全面介绍了C语言中指针的核心知识体系。

2601_96015117的博客 465

《嵌入式最全面试题-Offer直通车》目录

嵌入式领域蓬勃发展,嵌入式工程师成为众多科技企业争抢的热门人才。如果你渴望在嵌入式面试中脱颖而出,成功斩获心仪的 offer,那么《嵌入式最全面试题 - Offer直通车》将是你的绝佳选择。本专栏是优快云是热门专栏,100多篇文章,总字数过百万。每月新增订阅用户过百,现在是优惠价9.9元,后面要逐渐恢复原价,早订阅早受益。本专栏精心整理了众多超万字的精华内容,总计达数十万字的嵌入式面试题总结。涵盖从嵌入式基础知识到各大厂面试真题,从驱动开发到操作系统,从硬件到软件等各个方面。

大模型大数据攻城狮的专栏 8404

C语言指针习题及答案:助你掌握C语言核心知识点

C语言指针习题及答案:助你掌握C语言核心知识点 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 提供C语言指针习题与答案,助力理解指针概念与应用。 项目介绍 在C语言的编程世界中,指针是一个至关重要 yet 易于混淆的概念。它不仅涉及内存管理,还深刻影响了程序的效率和性能。因此,"C语言指针习题及答案"项目应运而生,专为那些希望在C语言学习...

gitblog_06725的博客 363

全球建筑物提取数据集(免费下载):微软/GlobalMLBuildingFootprints

这个是GitHub上的开源数据集: https://github.com/microsoft/GlobalMLBuildingFootprints 介绍 必应地图正在世界各地发布开放式建筑足迹。我们从 2014 年到 2021 年间的 Bing Maps 图像中检测到了 7.77 亿座建筑物,包括 Maxar 和 Airbus 的图像。数据可在 ODbL 下免费下载和使用。该数据集补充了我们的其他版本。 包括的地区 执照 此数据由 Microsoft 根据Open Dat..

此星光明博客 6290

YOLOv5 自定义模型 Android 部署完整指南

本文详细介绍了将YOLOv5模型部署到Android设备的完整流程,包含三个核心部分:首先验证官方模型测试,确保基础环境配置正确;随后进行模型转换,从PyTorch导出ONNX格式并优化,再转换为NCNN格式;最后在Android项目中集成自定义模型,包括文件替换、参数修改和代码适配。教程基于YOLOv5 6.1版本,使用NCNN框架进行移动端推理,涵盖了常见问题解决方案和关键配置要点,为开发者提供了从训练到部署的完整技术路线。

FJN110的博客 592

stm32语言c指针吗,STM32——C语言知识点:指针、结构体

1 /*2 ============================================================================3 Name : Cyuyanfuxi.c4 Author :5 Version :6 Copyright : Your copyright notice7 Description : Hello W...

weixin_42099942的博客 301

深入解析高通SA8775芯片:性能、架构与研发创新趋势

SA8775芯片凭借其强大的CPU、GPU和AI加速能力,能够应对现代智能系统中的复杂计算任务。它不仅适合高性能计算、深度学习应用,也在汽车、智能设备等领域有广泛的应用前景。无论是在自动驾驶系统中,还是在车载信息娱乐和高级嵌入式系统中,SA8775都展现了其出色的计算能力和能效平衡,是现代智能系统的重要硬件基础。SA8775芯片作为高通的高性能处理平台,具有出色的计算和AI加速能力,但也存在一些值得关注的地方。

weixin_43199439的博客 9351

C语言核心知识点总结:指针、数组与字符串

本文总结了C语言中指针、数组与字符串的核心知识点。指针本质是地址,通过指针变量可间接访问变量,需避免野指针,建议初始化为NULL。指针运算的步长由类型决定,数组名是指向首元素的指针常量。指针数组存储指针,数组指针指向数组。字符串使用字符数组或指针表示,注意区分可修改的字符数组与不可修改的字符串常量。推荐使用fgets和puts等安全的输入输出函数。掌握这些概念对C语言编程至关重要。

m0_62270504的博客 634

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

stm32语言c指针吗,STM32——C语言知识点:指针、结构体(示例代码)

1 /*2 ============================================================================3 Name : Cyuyanfuxi.c4 Author :5 Version :6 Copyright : Your copyright notice7 Description : Hello W...

weixin_28938385的博客 449

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C 语言指针:从本质到实战(全知识点 + 避坑指南)

数据类型 *指针变量名;数据类型:指针变量指向的目标变量的类型(如int *p表示p指向int型变量);:表示该变量是指针变量(不能省略);指针变量名:遵循 C 语言标识符规则(字母、数字、下划线,不以数字开头)。正确示例int *p;// 定义int型指针变量p,指向int型变量float *q;// 定义float型指针变量q,指向float型变量char *str;// 定义char型指针变量str,指向char型变量(后续用于字符串)的位置误区(误以为p1和p2都是指针,实际p2。

m0_53738516的博客 1410

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言核心知识点全解析:从基础语法到指针应用

C语言作为计算机编程的基石,其简洁高效的特性使其在系统编程和嵌入式开发中占据重要地位。理解C语言的核心概念如指针、内存管理等,不仅能提升编程效率,更能深入掌握计算机底层工作原理。本文系统梳理了C语言的基础语法、流程控制、函数模块化等核心知识点,特别针对指针这一关键概念进行了深入解析。通过实际代码示例演示了数组操作、字符串处理等常见应用场景,这些技术广泛应用于操作系统开发、编译器设计等高性能计算领域。对于初学者而言,掌握这些基础概念是迈向高级编程的重要阶梯;对有经验的开发者,则提供了系统性的知识梳理和最佳实践

weixin_28683689的博客 222

c语言四十个知识点,c语言学习之基础知识点介绍(十四):指针的进阶

一、指针的加、减法运算/*1、加法运算1)、可以跟整数进行加法运算,得到的还是一个地址公式:地址 + 1 = 地址 + 1 * 类型所占的字节数地址 + n = 地址 + n * 类型所占的字节数2)、只能跟整数运算,不能跟浮点数运算2、指针的减法运算:1)、可以跟整数进行减法运算,得到的还是一个地址公式:地址 - 1 = 地址 - 1 * 类型所占的字节数地址 - n = 地址 - n * 类型...

weixin_34800530的博客 691

C语言指针万字超详细教程:吃透指针,才算真正学会C语言

掌握指针,才能看懂链表、栈、队列、动态内存、操作系统底层逻辑,这也是C语言区别于高级语言的核心能力。后续学习数据结构、嵌入式开发、逆向工程,指针都是必不可少的基础。

dnbug Blog 479

C语言知识点汇总

C语言知识点汇总 (1)C程序主要是由函数构成 (2)函数是C程序的基本单位 (3)一个程序由两部分组成:函数首部、函数体 (4)函数参数分为形式参数和实际参数 (5)一个C程序总是从main函数开始执行的 (6)C程序书写自由 (7)每个语句和数据声明的最后必须有一个分号 (8)C语言本身没有输入输出语句 (9)数据在计算机与二进制形式存储 (10)计算机语言中数据有两种基本表现形式:常量和变量 (11)程序的三种基本结构:顺序结构、选择结构、循环结构 (12)所谓输入输出是以计算机主体为主体而言的 (1

Scxioi0的博客 382

c语言static知识点,C语言知识点集锦

C语言知识点集锦C语言作为一门非常适合编程入门的语言,打好基础的重要性不言而喻。下面整理了一些C语言知识点,希望对大家有所帮助!知识点1:指针使用注意Int *p只能指向int类型的数据指针变量只能存储地址指针变量未经初始化不要拿来间接访问其他存储空间知识点2:指针与数组遍历数组int ages[5] = {10, 4, 9, 44, 99};for(int i = 0; i<5; i++)...

weixin_39996101的博客 188

C语言 知识点-指针

本文总结了C语言指针的核心概念与操作:1. 指针声明时int*p的空格不影响语义;2. &取地址符与*解引用符的用法,通过p=&a使指针指向变量地址后,修改*p会同步改变原变量值;3. 通过swap函数案例对比,说明指针传参可修改实参值,而值传递只在函数内部生效;4. 数组名本质是指向首元素的指针,支持*(arr+1)与arr[1]等价操作,但数组名不可重新赋值。指针通过内存地址间接操作数据的特性,使其成为实现高效内存管理和函数参数传递的关键机制。

2302_81312344的博客 214

【C语言】指针、多维数组零碎知识点

🌈 关于C指针和数组 相关的东西 现在回忆整理一下相关的知识点,既作分享,也加强记忆。本blog需要有基本的指针和数组相关的知识储备。

成为富婆,报效祖国!! 1274

C语言基础指针知识点总结

C语言指针知识点总结,入门级指针,全面总结,这一篇足够了

qq_43591406的博客 1万+

C语言指针知识点小结

前期回顾   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过指针引用数组   C语言指针基础知识点(五)–用数组名作函数参数   C语言指针基础知识点(六)–通过指针引用多维数组   C语言指针基础知识点(七)–通过指针引用字符串   C语言指针基础知识点(八...

zhf的博客 1万+

【C语言】全面解析指针,指针知识点整理

目录前言:1.指针的概念2.指针的类型3.野指针3.1野指针的成因: 3.2如何避免野指针?4.指针的运算5.指针和数组6.二级指针7.指针数组总结: 对C语言来说,指针是一个难点,如果用C语言来写数据结构的话,掌握指针的用法是必须的,如果指针没学好,学数据结构很吃力。所以希望大家一定要掌握指针啊!!!1.指针就是个变量,用来存放地址,地址唯一表示一块内存空间。ps:(内存编号 = 地址 = 指针)2.指针的大小是固定的4/8个字节(32位平台/64位平台)指针是有类型的,指针的类型决定了指针+-整数的步长

云泽野の编程日记 2万+
上一篇: 二分查找的递归实现,汉若塔,青蛙跳阶
下一篇: 结构体知识
Code_Solitude
博客等级 码龄116天 1粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值