2024/06/24(11.1115)指针进阶

1.字符指针

2.数组指针

3.指针数组

4.数组传参和指针传参

5.函数指针

6.函数指针数组

7.指向函数指针数组的指针

8.回调函数

9.指针和数组一些题目的解析

字符指针 char*

我们用这种方法修改了*pch的内容从"A"变成了"a"

存储内容是什么一般指针就用什么类型.

#include <stdio.h>
#include <stdlib.h>

int main(){
    
    char ch = 'A';
    char *pch = &ch;
    *pch = 'a';

    system("pause");
    return 0;
}

字符数组和字符指针存储同样的字符串但依然有所区分.

#include <stdio.h>
#include <stdlib.h>

int main(){
    
    char str[] = "Hello World";// 字符数组,开辟了一个数组区间
    char* str1 = "Hello World";//字符指针,保存了一个地址,地址指向数组的首个元素位置

    printf("str size = %d\n",sizeof(str));
    printf("str size = %d\n", sizeof(str1));

    system("pause");
    return 0;
}

做一道小练习,猜输出结果:

#include <stdio.h>
#include <stdlib.h>

int main(){
    
    char str1[] = "Hello World";
    char str2[] = "Hello World";
    char* str3 = "Hello World";
    char* str4 = "Hello World";
    
    if (str1 == str2)
        printf("str1 and str2 are same\n");
    else
        printf("str1 and str2 are not same\n");
    if (str3 == str4)
        printf("str3 and str4 are same\n");
    else
        printf("str3 and str4 are not same\n");

    system("pause");
    return 0;
}

12不相同 34相同

这里比较直接用 == 所以比较的是地址

1和2开辟了两个不同的空间来存储字符串,3和4所指的字符串是常量,系统只开辟一个空间.

但是如果使用 strcmp 这个专门比较字符串内容的函数,那么12也就相等了.

例如: strcmp(str1,str2);

指针数组 数组指针又来咯

指针数组: 存放指针的数组

int* arr1[10];//整型指针的数组

        int a, b, c;

        arr1[0] = &a;

        arr1[1] = &b;

char* arr2[];//字符指针的数组

        char c1, c2, c3;

        arr2[0] = &c1;

char** arr3[];//二级字符指针的数组

        char ch = 'a';

        char *pch = &ch;

        arr3[0] = &pch;

数组指针:指向数组的指针

#include <stdio.h>
#include <stdlib.h>

int main(){
    int arr[] = {10, 20, 30};
    printf("%p\n",arr);
    printf("%p\n",&arr[0]);
    printf("%p\n",&arr);


    system("pause");
    return 0;
}

它们三个输出结果都是数组的第一个元素地址

但当给它们都加1结果却不一样

#include <stdio.h>
#include <stdlib.h>

int main(){
    int arr[] = {10, 20, 30};
    printf("%p\n",arr);
    printf("%p\n",&arr[0]);
    printf("%p\n",&arr);

    int* p1 = arr;
    int* p2 = &arr[0];
    int* p3 = &arr;
    printf("%p : %p\n", p1, arr + 1);
    printf("%p : %p\n", p2, &arr[0] + 1);
    printf("%p : %p\n", p3, &arr + 1);

    system("pause");
    return 0;
}

前两个都是元素 + 1;第三个是加了这个数组它就是一个数组指针.

做区分,他俩只有一个小括号的区别:

        int* arr[]是一个指针数组

        int(*arr)[]是一个数组指针

[] 的优先级 高于 * 所以先(*p)形成指针指向[]这个数组

做一下简单回顾:

int arr[5];5个整型数组

int* parr1[10];指针数组

int(*parr2)[10];数组指针

int(*parr3[10])[5];?有10个指针的数组,指针指向一个数组

函数指针和指针函数

#include <stdio.h>
#include <stdlib.h>

int func(int a, int b){
    int ret = a + b;
    return ret;
}

int main(){
    int num = func(10, 20);
    printf("num = %d\n", num);
    //标准写法
    int(*pfunc)(int, int);//函数指针
    pfunc = &func;
     num = (*pfunc)(10, 20);
    printf("num = %d\n", num);
    //简化写法
    pfunc = func;
    num = pfunc(10, 20);
    printf("num = %d\n",num);

    system("pause");
    return 0;
}

所以指针可以指向 变量 数组 函数 结构体 文件

函数指针 int(*pfunc)(int);  指向函数的指针

               I                     I

        (返回值类型) (参数类型)

指针函数 int * pfunc(int);  返回指针的函数

小练习:

用变量a给出下面定义:

一个整型数 int a;

一个指向整型数的指针 int* a;

一个指向指针的指针,它指向的指针是一个整型数 int** a;

一个有十个整型数的数组 int a[10];

一个有十个指针的数组,该指针是指向一个整型数的 int*a[10];

一个指向有10个整型数数组的指针 int(*a)[10];

一个指向函数的指针,该函数有一个整型参数并返回一个整型数int (*a)(int);

一个有十个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数.

int (*a[10])(int);

(题目的考察点在于"变量a",之前习惯用arr *p的习惯要改2.按照要求一步一步写就能写出答案)

怎么解析一个复杂的指针状况呢?

举例:int *(*(*fun)(int*))[];

右左法则: 找到变量名,先往右看如果遇到括号就调转方向,往左解读,遇到了星号,名字和星号结合成了指针,再往右看,它是用来指向函数的,又遇到了括号,再往左看还是星号,说明函数的返回值是一个指针,又往右看,函数出来遇到方括号,说明函数返回的是一个数组数组元素有十个,再往左看发现元素类型是整型指针.

思路如上,来形容的时候要怎么说.fun是一个指针,这个指针是指向一个函数的,所指的函数为一个整型指针的参数和一个指针的返回值,返回的指针是指向一个具有10个元素的数组,每个元素的类型为整型指针. 它是返回值为数组指针的函数指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/746324.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浏览器扩展V3开发系列之 chrome.storage 的用法和案例

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 chrome.storage 是用于存储、获取用户数据的 API。当我们需要持久化存储数据时&#xff0c;比如&…

无忧易售升级:一键设置图片分辨率,赋能十大跨境电商平台

在电商领域&#xff0c;产品图片的品质直接影响着顾客的购买决策与品牌形象的塑造。无忧易售ERP特推出图片分辨率修改功能&#xff0c;为电商卖家们提供更专业的图像优化工具&#xff0c;让每一像素都成为吸引客户的秘密武器&#xff01; 一、Allegro、OZON、Coupang、Cdiscou…

低成本STC32G8K64驱动控制BLDC开源入门学习方案

低成本STC32G8K64驱动控制BLDC开源入门学习方案 ✨采用STC32G8K64单片机&#xff0c;参考梁工的STC32G12K128-LQFP48驱动方案制作&#xff0c;梁工BLDC相关的资料&#xff1a;https://www.stcaimcu.com/forum.php?modviewthread&tid7472&extrapage%3D1&#xff0c;在此…

如何编写时区源文件

0、背景 ① 修改TZ环境变量改变时区不能立即生效。要求设置时区后立即生效&#xff0c;只能用修改/etc/localtime方式。 ② 原文作者 Bill Seymour&#xff0c;想要查看原文&#xff0c;点击官网地址https://www.iana.org/time-zones下载 zic 源码&#xff0c;源码目录中的 tz…

[leetcode] smallest-k-lcci. 最小的k个数

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> smallestK(vector<int>& nums, int k) {int L 0, R nums.size() - 1;while (L < R){int left L, right R;int key nums[left];while (left < right){while (left &l…

XX能源云数据平台建设项目_投标书_技术部分(194页word)

标书介绍&#xff1a; 该标书通过物联网技术&#xff0c;实时采集能源行业各类数据&#xff0c;并进行标准化整合。采用分布式存储技术&#xff0c;确保数据的安全性和可扩展性。运用大数据和人工智能技术&#xff0c;对数据进行深度分析和挖掘&#xff0c;提供有价值的业务洞…

鉴权开发框架Django REST framework的应用场景

目录 一、鉴权开发框架介绍二、Django REST framework是什么三、如何实现认证、权限与限流功能四、Django REST framework的应用场景 一、鉴权开发框架介绍 鉴权开发框架是一种用于实现身份验证和授权的软件开发工具。它可以帮助开发者快速构建安全、可靠的身份验证和授权系统…

AI大模型训练过程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 大模型训练概述 AI大模型训练是指在海量数据中&#xff0c;对拥有数百万至数千万参数及深层次神经网络结构的模型进行训练的过程。这类大模型因其庞大的参数规模和复杂的网…

利用LabVIEW和数字孪生技术实现PCB电路板测试

利用LabVIEW和数字孪生技术对PCB电路板进行测试&#xff0c;可以通过动画展示实现测试过程的生动、形象和直观。本文详细说明了如何结合LabVIEW与数字孪生技术进行PCB电路板的测试&#xff0c;包括系统架构、实现方法以及具体展示效果&#xff0c;适合对外展示。 在现代电子制造…

Redis安装与使用

目录 1、介绍 1、redis的特点: 2、缓存 2、安装Redis 1、安装单机版redis 2、redis-cli命令参数 3、清空数据库的两种方式和作用域&#xff1a; 4、redis的增删查改命令 5、redis的查看所有分类命令 6、redis过期时间与控制键的行为 7、redis的相关工具 1、介绍 r…

如何成为专业的 .NET 开发人员

如今&#xff0c;网上有大量信息&#xff0c;找到正确的信息并非易事。当你开始编程之旅并希望获得全面的指南时&#xff0c;最好寻找一个可以指导你完成整个过程的指南。 本文将帮助您制定一份路线图&#xff0c;告诉您什么是重要的以及什么是需要学习的. 一.一切从软件基础…

CSS|03 尺寸样式属性文本与字体属性

尺寸样式属性 height:元素高度height的值&#xff1a;auto 自动length 使用px定义高度% 基于包含它的块级对象的百分比高度 width&#xff1a;元素的宽度width的值与height一样span标签可以设置宽度、高度吗&#xff1f; 答&#xff1a;不可以&#xff0c;因为span标签是一个行…

机器人控制系列教程之动力学建模(1)

简介 机器人动力学是对机器人机构的力和运动之间关系与平衡进行研究的学科。机器人动力学是以机器人运动为基础&#xff0c;研究在运动过程中连杆与连杆之间、连杆与工件之间力或力矩等关系。 分类&#xff1a; 根据研究方向的不同&#xff0c;机器人的动力学分析也分为正、逆…

华为OD机试 - 掌握单词个数(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

一文搞懂Linux多线程【下】

目录 &#x1f6a9;多线程代码的健壮性 &#x1f6a9;多线程控制 &#x1f6a9;线程返回值问题 &#x1f6a9;关于Linux线程库 &#x1f6a9;对Linux线程简单的封装 在观看本博客之前&#xff0c;建议大家先看一文搞懂Linux多线程【上】由于上一篇博客篇幅太长&#xff0c;为…

任务5.1 初识Spark Streaming

实战概述&#xff1a;使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架&#xff0c;用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统&#xff0c;能够处理流式数据并统计文本中的单词出现频…

网易严选礼品卡有什么用?

网易严选的礼品卡可以在网易商城里买东西 但是现在好多人买东西基本上都用的是淘宝京东之类的 很少会有人用网易吧 但是最近我朋友送了我几张网易的卡&#xff0c;我自己也用积分兑换一张&#xff0c;一直不知道怎么用 最后还是在收卡云上转让出去了&#xff0c;价格高不说…

yolo-world使用自己数据集训练

YOLO-World下载&#xff1a; https://github.com/AILab-CVC/YOLO-World/tree/master 1.数据准备 数据格式COCO格式即可 2.配置文件修改 configs/finetune_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_40e_8gpus_finetune_coco.py &#xff08;1&#xff09; 模型下载路径&#xf…

vue3-openlayers 要素聚合(cluster)、icon聚合

本篇介绍一下使用vue3-openlayers 要素聚合&#xff08;cluster&#xff09;&#xff0c;icon聚合 1 需求 要素聚合&#xff08;cluster&#xff09;&#xff0c;icon聚合 2 分析 使用ol-source-cluster 4 实现 <template><ol-map:loadTilesWhileAnimating"…

gin数据解析和绑定

一. Json数据解析和绑定 html文件&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <meta htt…