C语言,指针详解

article/2025/8/29 7:28:22

1. 指针是什么?

1. 指针是内存中一个最小单元的编号

在这里插入图片描述

2. 口头上的“指针”,指的是指针变量
#include<stdio.h>int main()
{int a=10;int * pa=&a;// pa 是一个指针变量,用来存放 a 的地址//int ——> pa 所指向对象的类型//* 代表 pa是个指针变量return 0;
}
3. 编址

在这里插入图片描述

4. 指针变量大小
//32位机器上,地址是32个0/1组成的二进制序列,地址要用4个字节的空间来储存//指针在32位平台上,占4个字节
//在64位平台上,占8个字节

2. 指针和指针类型

1. 内存中的信息

2. 指针类型的意义
2.1[

在这里插入图片描述

//指针的类型,决定了指针解引用时,访问多少个字节 —— 指针的访问权限//short* ——> 2
//int* ——> 4
//float* ——> 4
//double* ——> 8
//...
#include<stdio.h>int main()
{int a=0x11223344;//在内存中开辟四个字节的空间;//放入44 33 22 11//"44" 所占空间的地址 就是 a 的地址char* pa=&a;*pa=0;//将 44 33 22 11 ——> 00 33 22 11return 0;
}
2.2

//指针的类型决定了 指针+1 操作时的步长
//
//char* 类型的指针 +1时,跳过 1  个字节
//int* 类型的指针 +1时,跳过 4 个字节
////type* p ,p +/- n
//跳过 n* sizeof(type) 个字节

3. 野指针

3.1

1. 指针未初始化
#include<stdio.h>int main()
{int* pa;*pa=10;//局部变量指针未初始化,为随机值return 0;
}
2. 指针越界访问
#include<stdio.h>int main()
{int arr[10]={0};for(int i=0;i<11;i++){*(p++)=i;//i=10,指针的指向超出了数组范围 ,此时为野指针}return 0;
}
3. 指针所指向的空间释放
#include<stdio.h>int* test()
{int a=10;return &a;
}int main()
{int* p=test();printf("%d\n",*p);//出test()后,a所在空间还给操作系统了//此时 p 为野指针return 0; 
}

3.2 规避野指针

1. 指针初始化
#include<stdio.h>int main()
{int a=0;int* pa=&a;int* pc=NULL;//如果不知道指针初始化为何值,暂时初始化为 NULLreturn 0;
}
2. 指针指向的空间释放,及时置 NULL
#include<stdio.h>int* test()
{int a=10;return &a;
}int main()
{//避免返回局部变量的地址int* p=test();p=NULL;    return 0; 
}
3. 指针使用之前检查有效性
#include<stdio.h>int main()
{int a=10;int* pa=&a;int* ptr=NULL;if(ptr != NULL){//使用ptr    }return 0;
}

4. 指针运算

1. 指针加减整数

在这里插入图片描述

//利用指针访问数组中的元素
//1#include<stdio.h>int main()
{int arr[10]={0};int* p=arr;for(int i=0;i<10;i++){*p=i;p++;//指针不断向后移}return 0;
}

注意:

在这里插入图片描述

//2
#include<stdio.h>int main()
{int arr[10]={0};int* p=arr;for(int i=0;i<10;i++){*(p+i)=i;//指针不移动,利用i++ 对数组中的元素进行访问}return 0;
}
补充:

" int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };"

arr ——> 数组名 ——> 首元素地址

#include<stdio.h>int main()
{int arr[10]={0,1,2,3,4,5,6,7,8,9};int* p=arr;for(int i=0;i<10;i++)printf("%d ",p[i]);return 0;
}

在这里插入图片描述

" arr[i] == *(arr + i) == *(i + arr) == i[arr] "

在这里插入图片描述

//[] ——> 操作符 arr[i] == i[arr]
// + ——> 操作符 a+b == b+a
2. 指针减指针
#include<stdio.h>int main()
{int arr[10]={0};printf("%d\n",&arr[9]-&arr[0]);return 0;
}//&arr[9] ——> arr+9
//&arr[0] ——> arr

在这里插入图片描述

//结论://1. 指针 - 指针 得到数值的绝对值,是指针与指针之间的元素个数
//2. 指针 - 指针 运算的前提条件是:指针和指针指向了同一块空间

补充:

//my_strlen() 的多种实现方式
#include<stdio.h>int my_strlen(char ch[])
{int len=0;while(*ch){len++;ch++;}return len;
}
#include<stdio.h>int my_strlen(char ch[])
{int i=0;while(*(ch+i)){i++;}return i;
}
#include<stdio.h>int my_strlen(char ch[])
{char* start=ch;while(*ch){//判断 *ch!='\0', ch++ch++;}return ch-start;
}//err
//while(*ch++)
3. 指针关系运算
//指针是有大小的
//指针关系运算就是比较指针大小
#include<stdio.h>int main()
{int arr[5]={0};for(int* p=arr;p<&arr[5];)*p++=1;for(int i=0;i<5;i++)printf("%d ",arr[i]);return 0;
}

在这里插入图片描述

在这里插入图片描述

C语言标准规定:

允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置进行比较;

但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

5. 指针和数组

1. 指针和数组的联系
//数组中,数组名是数组首元素地址
//数组是连续存放的//当我们知道数组首元素地址时,可以通过指针访问数组

6. 二级指针

在这里插入图片描述

在这里插入图片描述

//可以通过修改 **ppa ——> 修改 a 

7. 指针数组

1. 指针数组 ——> 用来存放指针的数组
#include<stdio.h>int main()
{int arr1[]={1,2,3,4,5};int arr2[]={2,3,4,5,6};int arr3[]={3,4,5,6,7};int* parr[]={arr1,arr2,arr3};return 0;
}//parr[] 就是一个指针数组
通过指针数组 打印字符串

在这里插入图片描述

2. 指针数组模拟二维数组

在这里插入图片描述

真实的二维数组是连续的

在这里插入图片描述


http://chatgpt.dhexx.cn/article/EWx6IiEY.shtml

相关文章

C语言指针详细解析

C语言指针详细解析 概述指针指针运算符示例 指针类型示例 指针变量的初始化关系运算示例 数组一维数组示例 二维数组示例 字符串指针示例示例 指针函数示例 函数指针示例 指针函数和函数指针定义写法用途 最后 概述 指针也就是内存地址&#xff0c;指针变量是用来存放内存地址…

C语言:详解指针

本人录制技术视频地址&#xff1a;https://edu.csdn.net/lecturer/1899 欢迎观看。 指针应该算得上是c语言的精华&#xff0c;但也是难点。很多教程或者博客都有对其详细的讲解与分析。我这一节的内容&#xff0c;也是讲解指针&#xff0c;但我会尽量使用图解的方式&#xff0…

【C语言】指针(详解)

文章目录 前言1.字符指针2. 指针数组3. 数组指针3.1 数组指针的定义3.2 &数组名VS数组名3.3 数组指针的使用 4. 数组参数、指针参数4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参 5. 函数指针6. 函数指针数组7. 指向函数指针数组的指针8. 回调函数8.1…

【c语言】 指针详解 【图文+代码】

指针 前言一、指针是什么&#xff1f;1.1 认识指针1.2 变量1.3 变量放在哪&#xff1f;1.4 指针的本质1.5 解引用 二、指针类型2.1指针有类型吗&#xff1f;2.2指针类型的意义是什么&#xff1f; 三. 野指针3.1什么是野指针3.2野指针成因3.2.1指针未初始化3.2.2 指针越界访问3.…

【初阶】C语言指针详解——指针必备的7大知识点

文章目录 前言一、指针是什么&#x1f351;1、浅谈指针&#x1f351;2、内存&#x1f351;3、指针变量 二、指针和指针类型&#x1f351;1、指针类型&#x1f351;2、指针-整数&#x1f351;3、指针的解引用 三、野指针&#x1f351;1、野指针成因&#x1f333;(1) 指针未初始化…

详解C语言指针

文章目录 1.字符指针2.指针数组3.数组指针3.1 数组指针的定义3.2 &数组名和数组名的区别3.3 数组指针的使用 4.数组参数&#xff0c;指针参数4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参 5.函数指针6.函数指针数组7.指向函数指针数组的指针8.回调函…

C语言——指针(入门详解)

文章目录 1.什么是指针&#xff1f;1.1.理解指针的两个要点&#xff1a;1.2.指针变量&#xff1a;1.3.内存是如何编址&#xff1f; 2.指针和指针类型2.1指针的创建与初始化2.2.指针类型 3.野指针3.1.什么视野指针&#xff1f;3.2.野指针成因3.3.规避野指针 4.指针运算4.1.指针-…

c语言指针用法详解,通俗易懂超详细!

文章转自&#xff1a;无际单片机 大家好&#xff0c;我是无际。 今天给大家来讲解一下指针。 我会由浅到深&#xff0c;最后结合实际应用讲解&#xff0c;让大家学会指针的同时&#xff0c;知道大佬们都用指针来干嘛&#xff01; 长文预警&#xff01;全文大约5200多字&#xf…

C语言指针详解(超级详细)

C语言指针精解 前言 这不是我第一次写关于C指针的文章了&#xff0c;只是因为指针对于C来说太重要&#xff0c;而且随着自己编程经历越多&#xff0c;对指针的理解越多&#xff0c;因此有了本文。然而&#xff0c;想要全面理解指针&#xff0c;除了要对C语言有熟练的掌握外&…

C语言中的指针详解

1. 什么是指针 C语言中指针是一种数据类型,指针是存放数据的内存单元地址。 计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节,为了便于管理,必须为每个存储单元编号,该编号就是存储单元的“地址”,每个存储单元拥有一个唯一的地址。 指针变量除了可以存…

C语言——指针详解(必收藏)

目录 1.什么是指针&#xff1f; 1.1概念 1.2指针的大小 ​ 1.3指针类型的作用 2.野指针 2.1野指针产生的原因 2.2 如何规避野指针 3.指针运算 3.1指针-整数 3.2指针-指针 3.3 指针的关系运算 4. 二级指针 5. 数组名 *6.指针数组和数组指针 6.1指针数组 *6.…

C语言指针详解

一、什么是指针 C语言里&#xff0c;变量存放在内存中&#xff0c;而内存其实就是一组有序字节组成的数组&#xff0c;每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里&#xff0c;数据对象是指存储在内存中的一个指定数据类…

C语言之指针详解

文章目录 1 指针1.1 简介1.2 什么是指针1.2.1 定义1.2.2 指针表示1.2.3 为什么*p&a不正确 1.3 使用指针1.3.1 简单使用1.3.2 NULL 指针1.3.3 指针算术运算1.3.3.1 定义1.3.3.2 遍历数组&#xff1a;递增一个指针1.3.3.3 遍历数组&#xff1a;递减一个指针1.3.3.4 指针的比较…

c语言—指针详解

文章目录 一、指针是什么二、指针和指针变量1.左值与右值2.两者的区别 三、指针和指针类型1.定义指针2.大小端3.指针的解引用 四、野指针野指针成因如何规避野指针 五、指针运算1.指针- 整数2.指针-指针3.指针的关系运算 六、指针和数组七、二级指针八、指针数组和数组指针1.指…

机器学习主动学习和半监督学习

一、主动学习&#xff08;active learning&#xff09; 学习器能够主动选择包含信息量大的未标注的样例并将其交由专家进行标注&#xff0c;然后置入训练集进行训练&#xff0c;从而在训练集较小的情况下获得较高的分类正确率&#xff0c;这样可以有效的降低构建高性能分类器的…

active learning主动学习

active learning 是半监督式的机器学习的一种&#xff0c;这种机器学习算法能够交互式地查询用户或者信息源&#xff0c;从而对于一个新的数据样例得到可人的输出。在统计学文献中&#xff0c;它有时也被称为最佳实验设计。 在这样的一种情形下&#xff1a;无标签的数据量很大…

深度主动学习综述2020

A Survey of Deep Active Learning 中文版仅作参考&#xff0c;以正式的pdf版为主。 https://arxiv.org/pdf/2009.00236.pdf 西北大学等最新《深度主动学习》全面综述论文&#xff0c;30页pdf abstract 主动学习试图通过标记最少量的样本使得模型的性能收益最大化。而深度学习…

每日一学-- 主动学习(active learning)

1. 在机器学习中&#xff0c;有监督学习、半监督学习、无监督学习。 在使用监督学习时&#xff0c;模型在标注的数据中学习信息&#xff0c;而存在的问题就是有大量的数据需要标注&#xff0c;非常费时费力。so主动学习为我们提供了方法&#xff0c;通过一定的算法找出最有用的…

一张图展示被动学习与主动学习的效率差距

一张图展示被动学习与主动学习的效率差距 起因一张图 起因 由于工作原因。最近的一段时间&#xff0c;又回到了大量的学习实践当中。之前的主观感受是&#xff0c;通过文字语音视频结合的多渠道信息获取方式学到的东西&#xff0c;记忆会比自己只是看文字&#xff0c;读文字&a…

深度学习 主动学习(Active Learning)概述、策略和不确定性度量

文章目录 主动学习概念策略基于数据流的主动学习方法基于数据池的主动学习方法基于查询的主动学习方法 不确定性度量 参考 主动学习 概念 主动学习是指对需要标记的数据进行优先排序的过程&#xff0c;这样可以确定哪些数据对训练监督模型产生最大的影响。主动学习不是一次为…