指针和数组

【系列06】端侧AI:构建与部署高效的本地化AI模型 第5章:模型剪枝(Pruning) 结构化剪枝移除的是模型中的整个结构,比如一个完整的神经元、一个卷积核或一个通道。修剪后的模型权重矩阵仍然是稠密的,因此能够充分利用现代硬件和软件的并行计算优势,从而显著提升推理速度。非结构化剪枝是最细粒度的剪枝方法。对于需要极致压缩但对推理速度要求不高的场景,非结构化剪枝是好的选择。它就像修剪一棵树,通过移除模型中不必要的“枝叶”,让模型变得更精简、更高效,从而适应资源受限的设备。,开发者可以方便地对模型的不同层进行剪枝,并根据需求进行微调,从而在不影响太多性能的前提下,获得一个更轻量、更高效的模型。 阅读详情

指针和数组参在一块确实很让人头疼,特别是对于我这种菜鸟级别的,简直一个晕字了得。
可是再难也得学啊,那就慢慢捋捋吧。。。。。。
一、指针
1. 在计算机内存中,每一个内存单元都有一个地址,在c语言中这个地址就大概可以充当指针。
2. &和*
&是对变量取地址,*是对取变量的值。互为逆运算。
3. 地址的打印;

#include <stdio.h>
int main(void)
{
   int a = 3;
   int *p = &a;
printf("%p\n",&a);//打印a的地址需用p%
printf("%p\n",p);//此时p = &a,即为打印a的地址需用p%
printf("%p\n",&p);//p本身是指针变量,即为一个地址,&p是对p取地址,也就是对a的地址再取地址
printf("%d\n",*p);//打印a的值;

return 0;
} 
//运行结果: 
//0xbfe758b8
//0xbfe758b8
//0xbfe758bc
//3
  1. 指针大小
#include <stdio.h>
int main(void)
{
    char *p = "hello world";//指针p中只存放了字符串的首地址;
    int *q = NULL;//初始化指针q;
    double *p1 = NULL;
    //32位操作系统,指针变量的大小恒为4个字节,不论数据类型是什么;
    printf("%d,%d,%d\n",sizeof(p),sizeof(q),sizeof(p1));
    return 0;
}
//运行结果:
//4,4,4
  1. 二级指针
    只有变量才有地址,常量放在寄存器中,没有地址;
    二级指针:地址的地址,常量没有地址。
    一级指针和二级指针的比较:
#include<stdio.h>

int fun(char *str)
{
    str = "helloworld";

 return 0;
}
int main(int argc, const char *argv[])
{
 char *str = NULL;

 printf("%p\n",str);
 fun(str);
 printf("%p\n",str);
 puts(str);
 return 0;
}

==========================================
#include<stdio.h>

int fun(char **str)
{
     *str = "helloworld";

 return 0;
}
int main(int argc, const char *argv[])
{
     char *str = NULL;

     printf("%p\n",str);
     fun(&str);
     printf("%p\n",str);
     puts(str);
 return 0;
}

二、数组
1. 例如:int a[5] = {1,2,3,4,5};
char b[6] = “hello”;
其中数组名代表数组的首地址,也就是表示这个数组的开始地址。
当数组为字符串的时候,数组最后一位有’\0’结束符。
2. 指针与数组

#include <stdio.h>
int main(void)
{
    int a[5] = {1,2,3,4,5};
    int *p = a;
    printf("%d,%d,%d,%d\n",a[1],*(p+1),*(a+1),p[1]);
    //此时,a[1] = *(p+1) = *(a+1) = p[1];
    return 0;
}
//结果:
//2,2,2,2
  1. 二维数组
    二维数组:a(行地址指针) —->*a(降级变为列指针)—->**a(再降级变为 元素)
    **a—>&(**a)(*a升级为列地址)—–>&*a(a 升级为行地址)
#include <stdio.h>
int main()
{
 char ch[3][3] = {1,2,3,4,5,6,7,8,9};
 int i,j;

 for (i = 0; i < 3; i ++) {
  for (j = 0; j < 3; j ++)
   printf("%12d",ch[i][j]);
  putchar(10);
 }

 for (i = 0; i < 3; i ++) {
  for (j = 0; j < 3; j ++)
   printf("%12p",&ch[i][j]);
  putchar(10);
 }

#if 1
/* 二维数组中ch代表行地址,ch[0]代表列地址;ch[0][0]代表是元素   */
 printf("&ch + 1 = %#x\n",&ch + 1); // char(*)[3][3];        //   ch代表行地址,取&升级为数组,数组+1,指向整个数组下一个地址 &ch代表整个数组的首地址,而ch代表数组首元素的地址,虽然两者值相等,但意义不一样。
 printf("&ch[1][0] = %#x\n",&ch[1][0]);                          //   取ch[1][0]的地址       
 printf("ch + 1 = %#x\n",ch + 1);                                      //   ch代表行地址,+1,表示行地址加1,换一行;
 printf("ch[0] = %#x\n",ch[0]);                                         //   ch[0]代表是ch[0][0]的地址       
 printf("ch[0] + 1= %#x\n",ch[0] + 1);                              //   ch[0]是列地址,+1,表示列地址加1;ch[0][1]的地址 
 printf("ch[1] + 3 = %#x\n",ch[1] + 3);                            //    ch[1]是列地址;+3,表示列地址加3;ch[1][3];即为ch[2][0]的地址
 printf("*(ch[0] + 2) = %#x\n",*(ch[0] + 2));                    //    ch[0]是列地址;+2,代表列地址+2;ch[0][2]的地址;

 printf("*ch[1] = %#x\n",*ch[1]);                                    //    ch[1]是列地址;*ch[1],降级为元素;ch[1][0]的元素
 printf("&ch[1] + 1 = %#x\n",&ch[1] + 1);// ch + 1 + 1    //    ch[1]是列地址;&ch[1],升级为行地址;&ch[1]+1;行地址加1;ch[2][0] 地
                                                                                              址                                                                                                                                                                                                                                   
 printf("*(*(ch + 1) + 1) = %#x\n",*(*(ch + 1) + 1));        //    (ch+1)行地址加1;*(ch+1),降级为列地址ch[1];(*(ch+1)+1),为ch[1][1]地址;

 printf("*(*(&ch[0] + 1) + 1) + 1 = %#x\n", *(*(&ch[0] + 1) + 1) + 1 );            //
 printf("ret = %#x\n",*(*(ch + 1) + 2) + *(*(&ch[1] + 1)) + 1 );                          //
#endif

 return 0;
}    

运行结果:
这里写图片描述

三、指针数组、数组指针
指针数组为一个数组,
char *p[3] = {“hello”,”world”,”hi”};
p[0] = “hello”的地址, p[1] = “world”的地址, p[2] = “hi”的地址。
当用“%s”打印p[0]这个地址指向的值,即为“hello”;当用“%p”打印时,则是打印p[0]的地址。
数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

所以数组指针也称指向一维数组的指针,亦称行指针。

指针数组
定义 int *p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。

这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

四、函数指针,指针函数
函数指针:实质上是一个指针,指向一个函数。
指针函数:实质上是一个函数,返回值是一个指针。

华为OD机试 - 整型数组按照个位数排序(Python/JS/C/C++ 双机位C卷 100分) 本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。给定一个非空数组(列表),其元素数据类型为整型,请按照数组元素十进制最低位从小到大进行排序,十进制最低位相同的元素,相对位置保持不变。当数组元素为负值时,十进制最低位等同于去除符号位后对应十进制值最低位。给定一个非空数组,其元素数据类型为32位有 阅读详情

相关推荐

Altium Designer20-柔性PCB绘制技巧

Altium Designer2020-柔性PCB绘制技巧 注:教程所用PCB随意找的,并没有完全绘制完,大家学习PCB折弯方法即可。 1.打开PCB,点击视图->板子规划模式1,如下图所示 2.点击设计->定义分割线,用两条分割线绘出要折弯的区域 3.点击设计->定义弯曲线(弯曲线呈现黄色) 4.用快捷键d,k进入layer manage stack(层叠管理器),在f...

weixin_44450279的博客 1万+

指针与数组

较为的详细介绍了 指针与数组的关系

m0_60292931的博客 1万+

家用电器维修必备:手把手教你用双向可控硅改造单相电机调速(附电路图)

本文提供了一份详细的家用电器维修指南,手把手教你如何利用双向可控硅为核心元件,为单相交流电机(如风扇、排气扇)实现平滑的无级调速改造。内容涵盖核心原理、安全须知、元件选型(如BT136、DB3)、电路图解析、分步搭建教程以及常见故障排查方法,旨在帮助维修爱好者和DIY用户安全、成功地完成这一实用且富有成就感的项目。

read5的博客 838

【C语言】数组和指针

数组和指针,十分全面!!

Qiuhan_909的博客 1万+

大疆mini 3 pro rtmp推流(带屏遥控器不支持)windows

大疆mini 3 pro无人机rtmp推流(带屏遥控器不支持)至windows电脑

xbsigeibwkouvfcj的博客 3432

基于大模型的急性重症胰腺炎全流程预测与诊疗方案研究

本研究构建了基于大模型的急性重症胰腺炎(SAP)全流程预测与诊疗系统,实现了从术前风险评估到术后康复管理的精准诊疗闭环。通过整合临床信息、实验室检查和影像学等多源数据,模型在测试集上预测准确率达X%,AUC为X,显著优于传统评分系统。研究创新性地将预测结果应用于手术方案制定、麻醉决策、并发症防控及个性化护理,形成智能化诊疗方案。验证结果显示模型具有良好的稳定性和临床适用性,同时配套的健康教育体系提升了患者自我管理能力。尽管存在样本局限性和模型可解释性等不足,该研究为SAP的精准诊疗提供了新范式,未来可通过扩

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1116

C语言知识:数组和指针

目录 数组 一维数组 1、作用: 2、数组框架: 3、数组的定义方式: 4、计算数组内存大小: 5、访问数组元素: 6、数组名和数组的数据类型问题: 二维数组 1、本质上也是一维数组 2、二维数组定义模型 3、二维数组定义和初始化 4、二维数组的大小 5、数组元素的访问 指针数组 1、概念: 2、定义模型 指针 一级指针 1、概念: 2、如何定义一个指针变量 3、 怎么使用指针变量(解引用、取目标) 4、指针内存大小: 5、指针加减-->内存地址加减

Supreme_god的博客 5841

Allegro层叠中的Etch Factor-铜皮的腐蚀因子如何计算

在用Allegro进行PCB设计的时候,Cross-section中需要填入对应的信息,一般填入每层的厚度即可,如下图。当PCB需要进行仿真分析的时候,Etch-Factor这个值是必须要填写的,如下图。实际铜皮进行蚀刻的时候,Etch-Factor的值并不是标准的90度,如下图。线路层实际形状是个梯形,Etch-Factor代表的就是梯形的角度,如下图。首先输入数值,比如1,再点击Inv,最后点击tan-1,可以得到角度的值。如果tanσ=2,σ=63.4,如下图计算结果。即tanσ=1,得到σ=45。

weixin_54787054的博客 885

C语言 指针与数组

一、指针与数组 二、数组参数、指针参数 三、指针与函数 (了解) 四、指针与数组的笔试题 五、指针笔试题

lfm1010123的博客 2669

推荐系统[八]算法实践总结V3:重排在快手短视频推荐系统中的应用and手淘信息流多兴趣多目标重排技术

快手推荐系统包括了传统的召回、粗排、精排、Learning To Rank 的多目标排序、多目标预估等技术环节。而在这些模块之后的技术环节就属于重排序,主要包括手机端和服务端两部分。服务端通过传统服务器部署重排服务,包括序列重排、多源内容混排、多样性模块。端上部分包括端上重排模型和端上重排策略两部分。重排技术是快手十分重要的技术环节,它的发展速度远快于其他排序环节,属于较新的技术范畴。整个序列的价值并非单 item 效果的累计,如何使得序列价值最大化;

丨汀、的博客 1064

手把手教你学Simulink——四开关 Buck‑Boost(FSBB)变换器的无缝模式切换仿真

本文详细介绍了四开关Buck-Boost(FSBB)变换器的Simulink仿真方法,重点解决模式切换时的直通风险和输出电压波动问题。通过统一电压PI控制、迟滞比较模式仲裁(Buck/Boost/Pass-Through)和200ns死区设计,实现了Vin从26V到22V变化时Vout稳定在12V±0.15V。关键步骤包括:搭建功率级电路、Stateflow模式判断、PI控制器输出占空比映射(Buck模式D≈Vo/Vin,Boost模式D≈1-Vo/Vin),以及带死区的PWM信号分配。仿真验证了切换过程中

MHD0815的博客 116

指针进阶之数组指针和指针数组

指针进阶之数组指针和指针数组,超详细,不会来看

人生得意须尽欢 7953

大数据安全 | 期末复习(上)| 补档

大数据定义:无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

知识库搭建ing 2589

指针数组和数组指针(非常易懂)

指针数组 指针与一维数组 当定义一个一维数组时,系统会在内存中为改数组分配一个储存空间,其数组的变量名就是数组的首地址。若定义一个指针变量,并将数组的首地址赋值给指针变量,则我们说该指针指向了这个一维数组。 例如: int *p,a[10]; p=a; //数组的变量名a就是数组的首地址 另一种赋值方式也可写为: int *p,a[10]; p=&a[0]; //a[0]的地址也是数组的首地址 ...

itszok的博客 10万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

指针数组和数组指针的区别和用处

“数组指针”和“指针数组”,其本质只要看最后的后缀 数组指针:是一个指针,指向数组的指针。 指针数组:是一个数组,装着指针的数组。

m0_74234485的博客 6668

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

指针数组和数组指针

int *p[n]:根据优先级,先看[],则p是一个数组,该数组是一个int *型,因此数组的元素是指针类型,共n个元素。int (*p)[n]:根据优先级,先看括号内,可知p是一个指针,这个指针指向一个一维数组,数组长度为n。第二,指针变量可以赋值。对于语句“int*p[5]”,它是一个指针数组,该数组包含 5 个int*型的指针,如图所示。第一,“指针”是一个变量,用于保存一个地址,这个地址的数据类型在定义指针变量时确定。a 和 &a 的数据类型不同,前者是指向数组首元素的指针,后者是指向数组的指针。

m0_56878426的博客 2404

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C语言数组之指针数组和数组指针

指针数组指针数组指针数组

weixin_34481217的博客 1万+

【C语言】指针数组和数组指针的区别

的情况就更好理解了,在这里“()”的优先级比 “[ ]” 高,“ * ”号和 p2 构成一个指针的定义,指针变量名为 p2,int 修饰的是数组的内容,即数组的每个元素。p1 先与 “[]” 结合,构成一个数组的定义,数组名为 p1,int *修饰的是数组的内容,即数组的每个元素。指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在 32 位系统下任何类型的指针永远是占 4 个字节。指针数组可以说成是”指针的数组”,首先这个变量是一个数组。

猫猫的小茶馆 5831

数组指针和指针数组

1、数组指针(指向数组的指针) (1)数组在内存中的表示 创建一个数组就是在内存里面开辟一块连续的空间,比如int a[4];就是在内存里面开辟了一个大小为4*sizeof(int)字节的内存空间。二维数组是特殊的一维数组。 先来看一段代码: void main() { int a[2][2]={1,2,3,4};//这是一个2*2的二维数组 int (*p)[2];//数

Touch_2011的专栏 5万+

数组指针和指针数组的区别

数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a;        //将该二维数组...

weixin_34189116的博客 4990

函数指针和指针函数以及数组指针和指针数组区别

函数指针(指向函数的指针) 与数据项类似,函数也有自己的地址。函数的地址是存储其机器代码的内存的开始地址。例如,可以编写将另一个函数的地址作为参数的函数,这样第一个函数将能够找到第二个函数,并运行它。与直接调用另一个函数相比,这种方法显得很笨重,但它允许在不同的时间传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。 函数指针的用法需要以下三个步骤: 获取函数的地址 声明一个函数指...

一丁的博客 2987

对于数组指针和指针数组的理解及其应用

在之前的学习中,我们已经简单了解过了数组指针和指针数组(数组指针,指针数组,二级指针)我们知道指针数组其实就一个用来存放指针的数组.这里先做一个指针数组简单的回顾. int* arr[10]; //这是一个存放整型指针的数组 char* arr[10]; //存放字符型指针的数组 char** arr[5]; //存放二级字符型指针的数组 而容易与之混淆的就是数组指针. 数组指针其实就是指针,这个...

persistence_Y的博客 3787

理解 一级指针 二级指针 指针和数组 指针数组

理解 一级指针 二级指针 指针和数组 指针数组 一级指针 指针是编程语言中的一个对象,它的值直接指向存在电脑存储器另一个地方的值, 由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。 因此,将地址形象化的称为“指针”,意思是通过它能找到以它为地址的的内存单元 指针是变量,用来存放地址的变量 int main() { int a = 10; int* p = &a; ...

PNUHC的博客 428
上一篇: scanf/printf/getchar/putchar/gets/puts/
下一篇: 顺序表、链表
Jasons_
博客等级 码龄12年 32粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值