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

C语言 DAY09 指针02 野指针局部变量定义的指针没有赋初值如:int *p;空指针指针的值为NULL如:空类型指针万能指针指针类型为void *的指针如:指针的指针存储指针地址的指针如:int *p = #指针常量本质是一个常量该指针变量不能修改指向的地址但是可以修改地址中的值如:常量指针本质上是一个指针,指向常量所以可以修改其指向的地址但是不能修改其指向地址的值如:常量指针常量指针常量与常量指针的结合体既不能修改地址也不能修改值如:数组指针。 阅读详情

Day7 指针专题(二)

字符指针与字符串
C语言通过使用字符数组来处理字符串。通常我们把char数据类型的指针变量称为字符指针变量,字符指针变量与字符数组有着密切关系,它也被用来处理字符串。

1.初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中,可通过指针将字符串的内容做修改。
例:

#include <stdio.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
        char ch1[] = "hello World!";
        char ch2[] = "hello World!";

        char * p;

        p = ch1;
        //ch1[0]---*(ch1+0)----p[0], *p
        if(isalpha(*p)) {
                if (isupper(*p)) 
                        *p = tolower(*p);
                else
                        *p = toupper(*p);
        }
        printf("%p %s\n", p, p);

        p = ch2;
        printf("%p %s\n",p, p);

        return 0;
}

2.在C编程中,当一个字符指针直接指向一个字符串常量时,不能修改指针指向对象的值。通过指针直接存储字符串常量,指针存储字符串常量的起始地址,且输出时不需要加“*”。
例:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
        char ch[50] = "welcome";
        char * p1 = "hello World!";
        
        //strcpy(ch, p1);//可以将p1拷贝到ch
        strcpy(p1, ch);//不可以将ch拷贝到p1,因为字符串常量不能修改

        puts(ch);
        puts(p1);

        return 0;
}

3.程序举例
不利用任何字符串函数,编程实现字符串连接函数的功能。

#include <stdio.h>

int main(int argc, char *argv[])
{
        char ch[100] = "welcome";
        char * p = "hello World!", * q;
        int i = 0;

        q = p;

        while (*(ch+i) != '\0') 
                i++;

        while (*p != '\0') {
                *(ch+i) = *p;
                i++;
                p++;
        }
        *(ch+i) = *p;

        p = q;
        puts(ch);
        puts(p);

        return 0;
}

指针数组
1.指针数组的定义
所谓指针数组是指有若干个具有相同存储类型和数据类型的指针变量构成的集合,通常和二维数组联合使用。

指针数组的一般说明形式:

<存储类型> <数据类型> * <指针数组名> [<大小>] ;

指针数组名表示该指针数组的起始地址。
例:

//声明一个指针数组
double * pb[2] , b[2][3] ;
//把一维数组b[0]和b[1]的首地址分别赋予指针变量数组的元素pb[0]和pb[1]
pb[0] = b[0] ; //等价于pb[0] = &b[0][0] ;
pb[1] = b[1] ; //等价于pb[1] = &b[1][0] ;
//此时pb[0]指向了一维数组b[0]的第一个元素b[0][0];而pb[1]指向了一维数组b[0]的第一个元素b[1][0]。

在这里插入图片描述

例:

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[2][3] = {{1, 4, 6}, {12, 9, 7}};//a----a[0]   a[1]

        int * p[2];


        p[0] = a[0];//&a[0][0] 
        p[1] = a[1];//&a[1][0]

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

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



        return 0;
}

2.程序举例
编程利用指针数组处理一个二维数组,要求遍历二维数组所有元素并求出二维数组所有元素的和。

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[2][3] = {{1, 4, 6}, {12, 9, 7}};//a----a[0]   a[1]
        int * p[2] = {a[0], a[1]};
        int i, j, sum = 0;

        int *  * q;

        q = p;//q = &p[0]

        printf("total:%d\n", sizeof(p));
        //printf("%p %p\n", p[0], a[0]);
        //printf("%p %p\n", p[1], a[1]);

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

问:如何计算指针数组占用的内存空间?
答:一个指针占用4个字节(32位),指针数组占用内存空间=指针数组元素*4

问:指针数组名加1,移动多少字节?
答:4

问:指针数组名相当于什么样的指针?
答:二级指针
例:

int a[2][3] ;
int *p[2] = {a[0] , a[1]} ;
int * *q ;
//第一个“*”号表示q所存储的变的数据类型为指针类型
//第二个“*”号表示声明q也是一个指针变量,存储指针变量的地址
q = p ;//q = &(p[0])

多级指针
1.多级指针的定义
把一个指向指针变量的指针变量,称为多级指针变量。对于指向处理数据的指针变量称为一级指针变量,简称一级指针;而把指向一级指针变量的指针变量称为二级指针白能量,简称二级指针。
二级指针变量的说明形式如下:

<存储类型> <数据类型> ** <指针名> ;

第一个“*”表示指针变量所存储的变量(指针变量)的数据类型为指针类型
第二个“*”表示声明为指针变量

2.多级指针的运算
指针变量加1,是向地址大的方向移动一个目标数据的地址量。类似的道理,多级指针运算也是以其目标变量为单位进行偏移。比如:int *p ; p+1移动一个int*变量所占的内存空间;再比如int **p ; p+1移动一个int**所占的内存空间。

3.多级指针和指针数组
指针数组也可以用另外一个指针来处理
例:

#include <stdio.h>

int main(int argc, char *argv[])
{
		//有一个一维字符数组ps[5]
        char * ps[5] = {“Beijing city” , “Moscow city” , “New York city” , “Paris city” , “London city” } ;
		//定义另外一个指针变量pps,并且把指针数组的首地址赋予指针pps
        char ** pps;
        int i, n;

        i = 0;
        n = sizeofp(s) / sizeof(char *);
        pps = &ps[0];//pps = ps;

        while (i < n){
                printf("%s %s\n", ps[i], *(pps + i));
                i++;
        }

在这里插入图片描述

例:

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[] = {3, 6, 9};
        int * p[2] = {&a[0], &a[1]};//int * ---  p[0]  p[1]

        int ** q;

        q = &p[0];//p
        q = p;

        printf("%d %d %d\n", a[0], *p[0], **q);
        printf("%d %d %d\n", a[1], *p[1], **(q+1));
        printf("%d %d %d\n", a[2], *(p[1]+1), *((*(q + 1))+1));

        return 0;
}

在这里插入图片描述

问:多级指针在内存中占几个字节?
答:4(32位机)

问:多级指针加1,移动多少字节?
答:4

Void指针
void指针是一种不确定数据类型的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量。
一般形式如下:

void * <指针变量名称> ;

对于void指针,在没有强制类型转换之前,不能进行任何指针的算术运算。void指针在使用时必须强制转换为目标指针类型,赋值时可以省略。
例:

int main(int argc, char *argv[])
{
        int m = 10;
        double n = 3.14;
        void * p, * q;

        p = &m;//(void *)&m;
        printf("%d %d\n", m, *(int *)p);
        printf("%p\n", p);
        p++;
        printf("%p\n", p);

        q = &n;//(void *)&n;
        printf("%.2lf %.2lf\n", n, *(double *)q);
        printf("%p\n", p);
        q++;
        printf("%p\n", q);

        return 0;
}

程序举例:使用void指针遍历一维数组

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[] = {5, 9, 1, 6, 9, 10};
        int i, n;
        void * p;

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

        return 0;
}

const修饰指针
1.常量化变量的值
一般形式:

const <数据类型> <变量名> = [<表达式>] ;

常量化变量是为了使变量的值不能修改。变量有const修饰时,若想用指针间接访问变量,指针也要由const修饰。

2.常量化指针目标表达式
一般形式:

const <数据类型> * <指针变量名> [=<指针运算表达式>] ;

常量化指针目标是限制通过指针修改其目标的数值,但<指针变量>存储的地址值可以修改。

3.常量化指针变量
一般形式:

<数据类型> * const <指针变量名> [=<指针运算表达式>] ;

使得<指针变量>存储的地址值不能修改,但可以通过*<指针变量名>修改指针所指向变量的数值。

4.常量化指针变量及其目标表达式
一般形式:

const <数据类型> * const <指针变量名> [=<指针运算表达式>] ;

常量化指针变量及其目标表达式,使得及不可以修改<指针变量>的地址值,也不可以通过*<指针变量名>修改指针所指向变量的值。

例:

#include <stdio.h>

int main(int argc, char *argv[])
{
         int m = 10;
         const int * p;
         int * const q = &m;
         const int * const r = &m;
         
         p = &m;//right;

         //(*p)++; //error;

         //q = &m; //error;
         *q = 20;//right

         r++;//error;
         (*r)++;//error;

        return 0;
}

问:void指针由什么用?
答:使得指针可以通过不同类型转换来完成不同场合的应用。

问:main函数是否可以带参数(涉及到const指针)?
答 :可以

#include <stdio.h>

int main(int argc, const char * argv[]) {
        //const char * argv[] = {"./a.out", "192.168.1.5", "9999"};
        int i;

        printf("argc=%d\n", argc);

        for (i = 0; i < argc; i++) {
                printf("%s\n", argv[i]);
        }

        return 0;
}

/*
结果:
argc=1
./a.out
若输入执行代码为:./a.out 192.168.1.7 6000
则结果为:
argc=3
./a.out
192.168.1.7
6000
*/
特性阻抗 – SI/PI 世界碰撞的地方 除了谐振零点和峰值外,在一定频率下,传输线的阻抗看起来像远端开路时的电容器的阻抗,也看起来像远端短路时电感的阻抗。如果随后的制造变化将测得的阻抗推到 -10% 容差的低端(例如 44 欧姆)的测量区域内,那么如果在初始下降时测量,则真正的特性阻抗将在 42 欧姆时降低 5%,并且超出规格。这意味着,当我们测量红色或蓝色图的峰和相邻谷之间的中间阻抗时,它是该频率下传输线的特性阻抗。图 7 远端开路时(红色常亮)与远端短路时(蓝色常亮)的电感和电容抗阻抗与频率的关系(上图)和传输线的阻抗与频率(下图)的对比。 阅读详情

相关推荐

刚入职,软件测试岗,有点迷茫不知道下一步怎么提升自己

软件测试前景和发展都是不错,已经入了软件测试这行业就坚挺下去

大白的博客 2218

void指针和const

1&amp;amp;gt;void 指针是一种不确定数据类型的指针变量,它可以通过强制类型转化让该变量指向任何数据类型的变量。 2&amp;amp;gt;对于void指针,在没有强制类型转换之前,不能进行任何指针的算术运算。(例如给一void指针++,上一次void指针地址与加一后的地址没有任何规律。) 错误代码:(目标s遍历一个一维数组) int m[]={5,8,6,45,6} ; void *p; p=m; int i; ...

k_ys的博客 803

串口调试神器诞生记:我是如何用Cursor+AI自动生成C#上位机的(含VSCode插件清单)

本文详细介绍了如何利用Cursor和AI技术快速开发C#上位机程序,实现高效的串口通讯调试。从开发环境搭建到代码自动生成,再到性能优化和功能增强,全面展示了AI辅助开发在串口调试中的实际应用和显著效率提升。

weixin_28340315的博客 300

void指针和const笔记

前言:之前学习C语言,不知是忘记了还是印象不够深刻,在之后写代码的一些日子里,用到void的时候只知道他是一个空类型,而const类型基本上没用过。这次第三次细致地再学一遍C的时候,对这两个知识点有了个重点的回顾,在此记录下易搞混的几个知识点。 void指针 void指针是一种不确定数据类型的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量 一般形式为:...

hua15617159775的博客 470

Cocos Creator3.5.2使用Spine切换皮肤

3、然后获取当前spine中是否有皮肤数据,如果spine连皮肤数据都没有,接着写可能会error,这里的 skins[skin],是判断皮肤列表中是否有需要更换的皮肤。2、因为spine往往意味着异步加载,换肤时也经常出现频繁异步的情况,所以下一步我们要可以判断当前spine组件里是否已经加载好了spine文件。换肤前隐藏好需要换肤的节点,避免穿帮;官网文档的换肤流程太简化,对于实际使用来说会有各种各样的问题。1、首先获取对应的spine组件。这里的skin自然是外部传入的需要换肤的皮肤名。

tc654321的博客 1818

Benchmark系列——UnixBench测试项深度解析与性能优化指南

本文深度解析UnixBench基准测试套件的各项测试原理,包括Dhrystone、Whetstone、系统调用、进程管理、IPC及文件I/O等核心测试项。通过详细的测试项分析,指导用户解读测试报告,并提供针对性的内核参数调整、编译优化及系统配置实战指南,帮助用户精准定位并优化系统性能瓶颈。

weixin_29230901的博客 276

二维数组用指针的方式初始化

二维数组用指针的方式初始化,理解下面的程序,首先要对二维数组有深刻的理解。 #include <stdio.h> int Array[5][6]; int main(void) { int (*i)[6]; //定义一个数组指针 for(i=Array;i<&Array[5];i++) { int *p; fo...

Somnus陳的博客 4199

Android以太网开关流程分析

Android以太网开关流程分析 一、引言   在Android 以太网服务启动流程中我们启动了EthernetService(ES),NetworkManagementService(NMS)等服务,其中ES作为Binder的服务端,向客户端EthernetManger提供了调用接口的引用。因此,应用可以通过EthernetManger来访问以太网的相关接口。本篇文章将从APP调用以太网的使能和关闭的接口流程作为切入点来分析,以太网框架中,上层app是如何将指令传递到底层。图1-1所示为以太网使能和关闭

franc521的博客 6113

C语言基础6指针专题二字符指针与字符串

C语言基础6指针专题二字符指针与字符串

m0_60718520的博客 1551

高电压技术的面试内容整理(详细版本:57题)

涵盖了高电压技术的关键领域,包括气体放电的物理过程、液体和固体介质的绝缘特性、高压外绝缘的分类与特性、电气设备绝缘试验的方法与原理、电力系统的防雷保护措施,以及内部过电压的产生、影响与限制方法,为理解和应对高电压环境下的电气问题提供了系统的知识框架。通过深入探讨气体放电理论、介质极化与损耗、绝缘子的电气特性、绝缘试验技术、防雷策略以及内部过电压的管理。

weixin_44808274的博客 776

人工智能在慢病管理中的具体应用全集:从技术落地到场景创新

这一成果的取得,得益于 AI 对居民血压数据的实时监测和分析,以及及时的干预措施。据统计,医疗支出下降了 18%,这主要是由于 AI 慢病管理系统实现了对慢病患者的早筛早诊早治,减少了并发症的发生,降低了医疗资源的浪费,从而减轻了患者和社会的医疗负担。医院信息系统(HIS)、电子病历(EMR)、区域卫生平台、可穿戴设备(如三诺血糖仪、华为手环)、第三方健康APP以及体检中心的数据往往采用不同的数据标准和格式(如HL7、FHIR、JSON、CSV等),且存储在相互隔离的系统中,形成典型的数据孤岛。

AllenLV的博客 2091

用指针数组处理一个二维数组,求出二维数组所有元素的和。

1   #include   2   3  int main(void)   4  {   5         int ar[3][4]= { {7,10,-2,3},   6                         {14,30,6,-15},   7                         {0,5,27,-7}   8                     

u012502219的专栏 1万+

三臂杆大型液压机械臂集中式ADRC控制系统设计

本文设计了一种用于三臂杆液压机械臂的集中式自抗扰控制(ADRC)系统。该系统通过建立包含惯性矩阵、科氏力、重力及摩擦力的非线性动力学模型,并集成液压系统传递函数,构建了完整的系统模型。控制方案采用跟踪微分器安排过渡过程,扩张状态观测器实时估计系统状态和总扰动,以及非线性状态误差反馈生成控制量。MATLAB实现展示了集中式ADRC控制器的核心结构,包括参数定义、跟踪微分器、扩张状态观测器和非线性反馈模块的设计。该系统能有效处理多关节耦合效应,实现三输入三输出的MIMO控制,具有抗干扰能力强、响应速度快的特点。

huanghm88的专栏 270

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

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

ankleless的博客 2974

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[C语言笔记]09、指针

指针知识大全!

zero654123的博客 1658

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

Raymond430的博客 361

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C语言指针②

32位体系系统中,指针变量的大小是4个字节64位体系系统中,指针变量的大小是8个字节解引用:运算符给出指针指向地址上储存的值。假设一个指针p,它存储了一个内存地址。通过解引用这个指针,可以访问或修改这个内存地址处的值。

weixin_62409078的博客 1286

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

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

bigzql的博客 8840

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

09C语言指针

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

weixin_30725315的博客 135

【C语言】09 指针

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

LiJin 536

C语言09-指针I、字符串

文章目录指针I铺垫知识:类型强制转换指针的两个内涵指针的相关运算变参函数的实现字符串ASCII码字符串字符串有关函数字符串函数的实现 指针I 铺垫知识:类型强制转换 在C语言中,允许类型强制转换。 int main(int argc, char* argv[]) { int nValue = 0; float fltValue = 3.14f; nValue = (in...

KarlingNans's Blog 413

c语言-指针

例如 * p++,是先执行++运算符,这里的++运算符是指p的运算,这里的p++是先运行后++,也就是先把p给前面的运算符使用,先解地址得到值,并执行printf,而p的值也会改变,会在原来的编号后面加4字节,这里的编号不是真正的物理地址,相当于一个寄存器对物理地址的编号,一位是一个字节,所以直接加4。c[0] = a,c代表是首行元素的地址,上面说到[]有解地址的作用,这里c[]就代表是单个元素的地址,c[0]就是数组的首个元素的地址, c[0][0]是首个元素,而&[0][0]是首个元素的地址。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值