2021-09-25 C语言 指针专题(一)

RexUniNLU零样本通用自然语言理解:nlp_deberta_rex-uninlu_chinese-base模型实战解析 本文深入解析了RexUniNLU零样本通用自然语言理解模型(nlp_deberta_rex-uninlu_chinese-base)的实战应用。通过详细的环境配置、模型加载及实战案例,展示了该模型在零样本场景下的强大能力,如实体识别和复杂关系抽取,显著提升NLP任务效率。 阅读详情

Day6指针专题(一)

指针
1.C程序设计中使用指针可以:
(1)使程序简洁、紧凑、高效
(2)有效的表示复杂的数据结构
(3)动态分配内存
(4)得到多于一个的函数返回值
2.在计算机内存中,每个字节单元(1Byte=8Bits)都有一个编号称为地址;在C语言中,内存单元的地址称为指针,专门用来存放地址的变量称为指针变量。在不影响理解的情况下,有时对地址、指针和指针变量不区分统称指针。
3.指针变量的说明:
(1)一般形式:
<存储类型> <数据类型> * <指针变量名>
例:

char * pName ;

注:
① 指针的存储类型是指指针变量本身的数据类型
② 指针说明时指定的数据类型不是指针变量本身的数据类型,而是指针目标的数据类型。简称指针的数据类型。
(2)指针在说明时也可以被赋予初值,称为指着的初始化
一般形式:
<存储类型> <数据类型> * <指针变量名> = <地址量>
例:

int a = 10 ;
int a , *pa = &a ; //int *pa ; pa = &a ;
//在上面的语句中,把变量a的地址作为初值赋予了刚说明的int型指针pa

例:
地址	存储数据	描述&a:0xbf98c768	00000000	存储数据10,即a、*pa、*(&a)0xbf98c769	00000000	0xbf98c76a	00000000	0xbf98c76b	00010010	……	……	……&pa:0xbf3be5c	10111111(bf)	存储a的地址0xbf98c768,即pa0xbf3be5d	10011000(98)	0xbf3be5e	11000111(c7)	0xbf3be5f	01101000(68)

4.指针变量的使用
(1)指针指向的内存区域中的数据称为指针的目标,如果它指向的区域是程序中的一个变量的内存空间,则这个变量称为指针的目标变量,简称指针的目标(指针指向的地址空间里存放的数据)
*pa = *(&a) = a (通过“*”号可以找到指针的目标,即指针目标区域里存放的数据)

引用指针要注意程序中的pa、*pa、&pa三种表示方法的不同意义。设pa为一个指针则:
①pa——指针变量,它的内容是地址
②*pa——指针所指向的对象,它的内容是指针目标的数据
③&pa——指针变量占用的存储区域的地址,即存储指针变量的地址,是个常量

(2)指针的赋值运算是指通过赋值运算符向指针变量赋予的一个地址值,向一个指针变量赋值时,赋予的值必须是地址常量或者指针变量,不能是普通的整数(零除外)。

指针赋值运算,常见的形式有以下几种:
①把一个普通变量的地址赋给一个具有相同数据类型的指针

double x = 15.0 , *px ;
px = &x ;

②把一个已有地址值的指针变量赋给具有相同数据类型的另一个指针变量

float a , *px , *py ; 
px = &a ;
py = px ;

③把一个数组的地址赋值给具有相同数据类型的指针

int a[20] ,*pa ;
pa = a ; //等价于pa = &a[0] ;

例:

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a = 10;
        int * p;
        int * q;

        p = &a;
        //q = &a;
        q = p;

        printf("&p:%p %d\n", &p, sizeof(p));
        printf("%p %p\n", p, &a);
        printf("%d %d\n", a, *p);

        printf("\n\n&q:%p %d\n", &q, sizeof(q));
        printf("%p %d\n", q, *q);

        return 0;
}

指针运算
指针运算是以指针变量所存放的地址量作为运算量而进行的运算。
指针运算实质就是地址的运算。
指针运算的种类是有限的,它只能进行赋值运算、算术运算和关系运算。
1.指针的算术运算
在这里插入图片描述

注:
① 不同数据类型的两个指针实行加减整数运算是无意义的
② px+n表示实际位置的地址量是:(px) + sizeof(px的数据类型) *n ;px-n表示实际位置的地址量是:(px) - sizeof(px的数据类型) *n
③ 两指针相减运算,px-py运算的结果是两指针指向地址位置之间相隔数据的个数,因此,两指针相减不是两指针持有地址量相减的结果。即两指针相减的结果值不是地址量,而是一个整数值,表示两指针之间相隔数据个数。
例:

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[5] = {4, 8, 1, 2, 7};
        int *p, * q;

        p = a; //&a[0];
        q = &a[3];
        
        printf("%p %p\n", p, q);
        printf("%d %d\n", *p, *q);
        printf("%d\n", q-p);//3

        return 0;
}

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[5] = {4, 8, 1, 2, 7};
        int *p = NULL, *q;

        printf("%d %p\n", p, p);
        p = a; //&a[0];
        
        printf("%p %d\n", p, *p);

        q = p++;

        printf("%p %d\n",p, *p);
        printf("%p %d\n",q, *q);


        return 0;
}

2.指针的关系运算符
在这里插入图片描述

注:
① 两指针之间的关系运算表示它们指向地址位置之间的关系。指向地址大的指针大于指向地址小的指针。
② 指针与一般整数变量之间的关系运算没有意义,但可以和零进行等于或不等于的关系运算判断指针是否为空。

3.程序举例
(1)

int main(){
int a[] = {5,8,7,6,2,7,3} ;
int y , *p = &a[1] ;

y = (*--p)++ ;

printf(“%d_”,y) ;
printf(“%d\n”,a[0]) ;

return 0 ;
}
//结果:5_6

(2)

#include <stdio.h>

#define N 5
int main(int argc, char *argv[])
{
        int a[N];
        int *p, i;
        
        p = a;//int *p = a;
        for (i = 0; i < N; i++) 
                scanf("%d", p++);//&a[i],warning!!!

        p = a;
        for (i = 0; i < N; i++)  {
                printf("%d ", *p++);
        }
        puts("");


        return 0;
}

问:指针加n移动多少个字节?
答:移动sizeof(指针数据类型) *n个字节

指针与数组
在C语言中,数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的起始地址。
1.一维数组
一维数组的数组名为一维数组的指针(起始地址)
例:

double x[8] ; //x即为x数组的起始地址

设指针变量px的地址等于数组指针x即指针变量px指向数组的首元素,则:x[i]、*(px=i)、*(x+i)和px[i]具有完全相同的功能:访问数组第i+1个数组元素。
例:

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[] = {1, 6, 9, 12, 61, 12, 21};
        int *p, i, n;
        
        p = a;
        n = sizeof(a) / sizeof(int);

        printf("%p %p %p\n", a, a+1, a+2);

        for (i = 0; i < n; i++)
                printf("%d %d %d %d\n", a[i], *(p+i), *(a+i), p[i]);
        puts("");

        p++;

        printf("%d\n", p[1]);//*(p+1)

        return 0;
}

注:
指针变量和数组在访问数组中元素时,一定条件下其使用方法具有相同的形式,因为指针变量和数组名都是地址量。但指针变量和数组的指针(数组名)在本质上是不同的,指针变量是地址变量,而数组的指针(数组名)是地址常量。

x++ ; //错误
px++ ; //正确

例:

int a[] = {1,2,3,4,5,6,7,8,9} , *p = a , i ;
/*
数组元素地址的正确表示是:
① &(a+1) //错,表示a[1]的值
② a++ //错,数组名为地址常量不能自增
③ &p //错,表示指针变量的地址
④ &p[i] //对,表示a[i]的地址
 数组名是地址变量:
① p++,p-- //对
② a++,a-- //错
③ a+1,*(a+2) //对
*/

2.程序举例
编写一个函数将整型数组中n个数按反序存放。

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[] = {1, 6, 9, 12, 61, 12, 21};
        int *p, *q, n, t;

        n = sizeof(a) / sizeof(int);

        p = a;
        q = &a[n-1];

        while (p < q) {
                t = *p;
                *p = *q;
                *q = t;
                p++;
                q--;
        }
        
        for (t = 0; t < n; t++)
                printf("%d ", a[t]);
        puts("");


        return 0;
}

指针与二维数组
1.多维数组就是具有两个或两个以上下标的数组。在C语言中,二维数组的元素连续存储,按行优先存储。
例:使用一级指针遍历二级指针

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[3][2] = {{1, 6}, {9, 12}, {61, 12}};
        int * p, i, n;

        n = sizeof(a) / sizeof(int);

        p = a[0]; //&a[0][0];
//p = a ;指针类型不兼容
        printf("%p %p\n", p, p+1);
        printf("%p %p\n", a, a+1);

        for (i = 0; i < n; i++)
                printf("%d ", *(p+i));
        puts("");


        return 0;
}

2.可把二维数组看作由多个一维数组组成。
比如 int a[2][3] ,内含三个元素(一维数组)a[0]、a[1]、a[2](元素a[0]、a[1]、a[2]都是一维数组名)。二维数组名代表数组的起始地址,数组名加1就是移动1行元素。因此二维数组名也称作行地址。

a == a[0] == *(a + 0) == &a[0][0]
a + 1 == a[1] == *(a + 1) == &a[1][0]
a + 2== a[2] == *(a + 2) == &a[2][0]
a[0] + 1 == *(a + 0) + 1 == &a[0][1]
a[1] + 1 == *(a + 1) + 1 == &a[1][1]
a[2] + 1 == *(a + 2) + 1 == &a[2][1]
//“*”作用:改变指针的性质,将行指针降级为一级指针。

例:

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[3][2] = {{1, 6}, {9, 12}, {61, 12}};
        int * p, i, n;

        n = sizeof(a) / sizeof(int);

        //a[1]++;
        //printf("%d\n", sizeof(a[1]));

        p = a[0]; //&a[0][0];
        printf("%p %p\n", p, p+1);
        printf("%p %p\n", a, a+1);

        for (i = 0; i < n; i++)
                printf("%d ", *(p+i));
        puts("");


        return 0;
}

3.行指针(数组指针)
存储行地址的指针变量,叫做行指针变量。形式如下:
<存储类型> <数据类型> (*<指针变量名>) [表达式]
例:

int a[2][3] ;
int (*p)[3] ; // 声明一个指针p,p+1表示移动3个地址(一行)

方括号中的常量表达式表示指针加1,移动n个数据。当用行指针操作二维数组时,表达式一般写成1行元素个数,即列数。
例:使用行指针表示二维数组 int a[3][2] 的元素 a [1][1] 并使用行指针遍历二维数组。

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[3][2] = {{1, 6}, {9, 12}, {61, 12}};
        int (*p)[2], i, j;

        p = a;

        printf("%p %p\n", a, a+1);
        printf("%p %p\n", p, p+1);

        //printf("%d, %d, %d, %d\n", a[1][1], p[1][1], *(*(a + 1)+1), *(*(p + 1) + 1));
        for (i = 0; i < 3; i++) {
                for (j = 0; j < 2; j++)
                        printf("%d, %d, %d, %d ", a[i][j], p[i][j], *(*(a + i)+j), *(*(p + i) + j));
                puts("");
        }


        return 0;
}
YOLO + SubspaceAD:一张良品图,检出所有未知缺陷 当YOLO遇上子空间建模,工业质检正迎来从“见多识广”到“举一反三”的质变时刻。 阅读详情

相关推荐

数据预处理之数据平滑处理#matlab

介绍基于 MATLAB 的数据平滑方法,主要介绍 smooth 函数、smoothts 函数和 medfilt1 函数的用法。

m0_56619132的博客 2415

C_printf中的%p的实质

格式控制符“%p”中的p是pointer(指针)的缩写。指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。printf函数族中对于%p一般以十六进制整数方式输出指针的值。 示例: #include #include int main(){ int *p = new int; int a = 4; printf("%04d\n

迎难而上 2万+

使用bandersnatch搭建pypi 本地镜像源(20211026)

需求背景:公司内网不能联网,同时开发工作需要各种python的模块,因此需要搭建一个pypi的本地镜像源。 参考网上的方法,总结了大致有下面几种方式搭建pypi本地源: devpi: 企业内网利用devpi搭建pypi私服 - 简书 pip2pi: https://yangfannie.com/1439.html pypiserver: https://zhongneng.github.io/2019/02/16/creat-pip/ bandersnatch:基于bandersnatch搭...

liurizhou的博客 6468

c语言 1168账单 指针专题

/***** 题目描述 每到月末,小明就会对这个月的支出账单进行整理和统计。如今电脑已经普及大学校园,所以小明想让电脑帮忙做这件事情。聪明的你就为小明编一个程序来完成这件事情吧。 输入 多实例测试。首先输入一个整数ncase,表示测试实例的个数。每个测试实例的输入如下: 第一行是整数n (n<100)。然后是n行的账单信息,每一行由事物的名字name和对应的花费c组成,长度不超过200。中间...

qq_39345244的博客 938

VLA-JEPA:具身智能中潜空间世界模型的工程落地实践

世界模型是具身智能实现环境理解与因果推演的核心基础,其本质是在状态空间中建模‘动作→结果’的动力学规律。传统基于像素或文本的世界模型因高维、非平稳、弱语义等缺陷,在真实机器人场景中鲁棒性差、部署成本高。JEPA(联合嵌入预测架构)通过构建物理约束的潜空间,将视觉-语言-动作(VLA)信号统一编码为低维、可微、可解释的状态表征,显著提升模型对抖动、遮挡、光照突变等干扰的适应能力,并支持实时闭环控制。该范式已在UR5e、Franka等多构型机械臂及Jetson边缘平台完成实测验证,成为VLA系统从实验室走向产线

weixin_34357928的博客 336

【数学基础】基于欧拉角表达的旋转顺序

欧拉角旋转顺序

FalschxMico 1384

1168: 账单(指针专题)

1168: 账单(指针专题) 题目描述 每到月末,小明就会对这个月的支出账单进行整理和统计。如今电脑已经普及大学校园,所以小明想让电脑帮忙做这件事情。聪明的你就为小明编一个程序来完成这件事情吧。 输入 多实例测试。首先输入一个整数ncase,表示测试实例的个数。每个测试实例的输入如下: 第一行是整数n (n<100)。然后是n行的账单信息,每一行由事物的名字name和对应的花费c组成,长度不超过200。中间会有一个或多个空格,而每一行的开头和结尾没有空格。 0.0 < c < 1000.0

博客 1492

融合Retinex理论与Transformer的YOLOv8低光照目标检测增强方法【YOLOv8】

图像分解:将输入图像分解为光照成分和反射成分。光照估计:估计光照图以消除暗光区域。图像重建:将光照增强后的反射图像重建成最终图像。Retinexformer通过在Transformer中引入Retinex的图像增强思路,使得低光照图像的细节能够得到充分保留。本文提出了一种基于Retinexformer的低光照增强方法,用于改进YOLOv8模型在夜间和低光照环境下的目标检测性能。

博客 1929

小白 C语言之 指针 int *p=0;和int *p;*p=0;和”&“有什么关系和区别

初学者在学习C语言的时候,最头疼的可能就是指针,话不多说。让我们直接进入正题 直接上代码 int main(void) { int *p = 0; printf("%d", *p); system("pause"); return 0; } 直接运行,好了,程序是不是报错了?那就对了。*因为此时的int *p=0实际等于int p; p=0; 让我们来验证一下对不对 int main(v...

weixin_42182477的博客 4619

PT:pt write_change to innovus 脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1526

在Windows 10/11上使用Qt和SOEM构建EtherCAT主站:工业控制新纪元

☑️ Windows平台上的EtherCAT主站☑️ 微秒级精度的实时控制☑️ 动态设备配置与管理☑️ 直观的Qt监控界面☑️ 分布式时钟同步“技术不是取代人类的工具,而是拓展人类能力的翅膀。当我们在Windows上实现微秒级精度的工业控制时,不是在征服机器,而是在创造人与机器和谐共舞的新舞台。集成AI异常检测算法支持EtherCAT G协议云端监控与远程诊断完整项目代码预编译SOEM库示例视频教程。

QQ_778132974的博客 633

学习C语言的第六天:指针

/下面两个语句中*可以靠近int,它也可以远离int,靠近p。但是它们的意思都是一样的:p是一个指针,指向int,q只是一个普通的int类型的一个变量。q这个指针是const,q的值不能被改变,q的值就是i的地址。//*表示p是一个指针,它指向的是一个int。// p可以指向别人,i可以被赋予别的值,因为i不是const,但是通过p去修改i就不可以。/*判断哪个被const了的标志是const在*的前面还是后面,//可以运行,q所指的那个i不是const。//不能运行,(*p)是const。

m0_73520485的博客 1739

小米15修复“NV损坏” 去除主板校验电阻步骤解析与图示

小米15系列将搭载骁龙8至尊版处理器,采用台积电3nm工艺。文章分析了手机出现"NV损坏"故障的表现及修复方法,包括通信异常、系统启动问题等典型症状,并介绍了去除主板校验电阻和刷写工程固件两种修复方案。重点讲解了去除主板电阻后刷写QCN文件的操作流程,强调在维修过程中需要结合分析与思考。适用于小米15系列特定机型(24129PN74G/I/C)的硬件修复。

小马哥的专栏 313

[C语言笔记]09、指针

指针知识大全!

zero654123的博客 1658

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C语言(09)——关于指针(逐渐清晰版)

本文详细介绍了C语言中指针的核心概念,包括内存划分、指针变量定义和使用方法。文章首先解释了内存单元和地址的概念,将内存比作酒店房间,指针就是房间号。然后重点讲解了指针变量的定义、类型(如int*、char*)以及指针变量在不同平台(32位/64位)下的大小差异。通过取地址操作符(&)和解引用操作符(*)的示例,说明了如何获取变量地址并通过指针修改变量值。文章还预告了后续将讲解指针运算和野指针相关内容。这些基础知识对于理解C语言的内存管理和指针操作至关重要。

ankleless的博客 2974

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言——预处理和指针

宏定义的语法形式:#define 标识符 字符串或者是#define 宏名 宏值预处理命令都是以#开头的例如:#define n 10注意在定义宏时在宏值后面是不可以加分号的如果加了分号在预处理进行文本替换的时候会一并把分号一起替换了,比如说我在定义#define N 10的后面加上分号可以看到在进行预处理时N会被替换成10;

attitude_lu的博客 1775

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

09C语言指针

C语言指针 地址 地址就是数据元素在内存中的位置表示; &变量名 #include <stdio.h> int main(){ int aa; unsigned int bb = &aa; printf("%d\n",bb); return 0; } #in...

weixin_30725315的博客 135

10-C语言指针-会指针才算学C!

指针的定义在程序当中,我们使用*表示指向。指针变量的定义为:指向单元的数据类型 *指针变量名;int *intPointer; // 指向int变量的指针intPointe...

bigzql的博客 8840

【C语言初阶】C语言指针全攻略:解锁C语言深层奥秘的钥匙

在编程的广阔天地里,C语言以其接近硬件的特性和强大的灵活性,始终占据着举足轻重的地位。而在这片由代码构建的领域中,指针无疑是那把开启C语言深层奥秘的钥匙。它不仅让程序员能够直接访问和操作内存,更是构建复杂数据结构、实现高效算法、进行底层开发不可或缺的工具

EterNity_TiMe_的计算机学习之路 3136

2021-09-28 C语言 指针专题(二)

Day7 指针专题(二) 字符指针与字符串 C语言通过使用字符数组来处理字符串。通常我们把char数据类型的指针变量称为字符指针变量,字符指针变量与字符数组有着密切关系,它也被用来处理字符串。 1.初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中,可通过指针将字符串的内容做修改。 例: #include <stdio.h> #include <ctype.h> int main(int argc, char *argv[]) { char

Raymond430的博客 321

C 语言奇幻之旅 - 第09篇:C 语言指针

指针是 C 语言的灵魂,它赋予程序员直接操作内存的能力,是编写高效、灵活代码的关键。本文带你从指针的基本概念出发,深入探讨指针与数组、指针与函数的关系,并通过丰富的示例和栈帧模拟,生动展示指针的工作原理。无论你是初学者还是资深开发者,本文都将为你揭开指针的神秘面纱,助你在编程世界中游刃有余。掌握指针,开启 C 语言的奇幻之旅!

星核日记,一个编程开发者的小天地。我将和大家一起,穿梭于多语言迷宫,剖析算法精妙,分享实战项目。 962

C语言---09指针

在C语言中,指针是最重要的的,这里综合了大多数相关的知识

一位正在苦苦追求毕业的研究僧 735

深入浅出C语言指针(进阶篇)

通过本文的学习,相信你对C语言指针有了更深入的理解,能够更好地运用指针来编写高效的C语言程序。加油!祝你更上一层楼!!!

平凡程序猿~的博客 2121

C语言 | 09 指针

9.1 地址与指针变量 9.1.1 内存地址 将内存抽象成一个很大的一维字符数组。 编码就是对内存的每一个字节分配一个32位或64位的编号(与32位或者64位处理器相关)。 这个内存编号我们称之为内存地址。 内存中的每一个数据都会分配相应的地址: char:占一个字节分配一个地址 int: 占四个字节分配四个地址 float、struct、函数、数组等 9.1.2指...

默默提升实验室 422

C语言:指针3

str3和str4的空间是一样的走if,因为str3和str4的内容是一样的编译器会把str4的空间指向str3的空间,所以空间是一样的。还有当我们需要计算%,&,|,>这些的话要一个一个添加,我们就会发现代码非常重复很多的printf , scanf。下面这代码,int是指向的数组的类型,(*p)说明p是一个指针,[10]是指向的数组有10个元素,&arr是整个数组。我们要添加%,&,|,>的话也就只用添加计算函数和函数指针数组里的函数名。

2401_86723488的博客 1984

【C语言】09 指针

1.什么是指针? 1.我们已经知道,"直接引用"是直接通过变量名来读写变量 2.C语言中还有一种"间接引用"的方式(以变量a为例):首先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a,间接读写变量a的值。这就是"间接引用"。 指针" /> 如果程序通过"间接引用"的方式来修改a的值,可以这样做:先根据 变量名b 获取 变量b 的地址ffc2,取出变量b中存储的

LiJin 536
上一篇: 2021-09-17 C语言 数组和字符串
下一篇: 2021-09-28 C语言 指针专题(二)
Raymond430
博客等级 码龄7年 91粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值