C语言-基础语法学习-2 一级指针

news2024/9/21 12:08:07

目录

      • 指针
  • C语言指针笔记
        • 用指针指向一块地址
        • 指针变量指向数组
        • 指针变量和常量指针
        • 函数指针
        • 注意事项

指针

  1. 基本概念
    指针定义:使用符号声明指针变量,例如int * ptr;。
    指针初始化:指针变量可以通过赋值操作初始化为某个变量的地址,例如ptr = & num;。
    指针访问:通过
    符号可以访问指针所指向的内存地址上的值,例如*ptr。
    空指针:指针变量可以被赋值为NULL,表示指向空地址。
    指针算术:指针可以进行加法和减法运算,用于访问数组中的元素或者在内存中进行偏移操作。
  2. 指针和数组
    指针与数组名:数组名本身就是一个指针,可以用于访问数组的首地址。
    指针和数组的关系:指针可以用于遍历数组,通过指针算术实现数组元素的访问和操作。
    指针数组:可以创建指针的数组,每个元素都是指向特定类型的指针。
  3. 指针和函数
    指针作为函数参数:可以将指针作为参数传递给函数,以便在函数内部修改原始数据。
    指针作为函数返回值:函数可以返回指针,以便将函数内部的动态分配内存传递给调用者。
  4. 动态内存分配
    动态内存分配函数:malloc()、calloc()和realloc()函数用于在运行时动态分配内存空间。
  5. 释放内存:使用free()函数释放之前动态分配的内存空间。

C语言指针笔记

## 指针的基本概念
- 指针是一个变量,用于存储内存地址。
- 通过指针,可以访问和操作内存中的数据。

## 声明和初始化指针
- 声明指针时,使用`*`符号来表示指针类型。
- 初始化指针时,可以使用`&`运算符获取变量的地址。

```c
int *ptr;       // 声明一个整型指针
int num = 10;
ptr = #     // 将ptr指向num的地址

各种指针的定义

在这里插入图片描述

既然指针在操作系统中都是用8个字节表示一个地址,那么为什么定义的时候需要声明什么类型的指针变量呢?

声明类型以后,在p+1的时候,编译器才知道应该跨越多少字节(如指向a[1]a[1][1] 的指针在加1后偏移的地址不同)才能指向下一个变量的地址。

用指针指向一块地址

注意要把常量转换成无符号整形指针的数据类型,一般还要加 volatile 防止被优化

volatile unsigned int *p = (volatile unsigned int *)0x000051EF;
printf("p = 0x%p\n", p);

指针变量指向数组

C语言中,数组名代表数组中首元素的地址

p = &a[0];  //p的值是a[0]的地址
p = a;   //p的值是数组a首元素(即a[0])的地址

指针变量和常量指针

int array[3] = {1, 2, 3};
int *p = array;
for (int i = 0; i < 3; i++) {
    printf("%d", *p++); //指针变量可以改变,指向数组下一个元素的地址
    printf("%d", *array++); //错误,array数组名为常量指针,指向固定地址  
}

函数指针

函数地址(函数名就是函数地址

如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配了一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。

定义一个函数指针变量

int getData(int, int);
int (*p)(int, int);  
//如果不加括号 int *p(int a, int b); 括号优先级更高,代表一个返回值为整形指针的函数,所以必须加括号
p = getData; //函数指针指向函数,函数名就是函数地址
int data;
data = (*p)(12); //*表示取值运算符,调用p指向的函数

案例:回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

#include<stdio.h>

int Callback_1(int x) // Callback Function 1
{
    printf("Hello, this is Callback_1: x = %d ", x);
    return 0;
}

int Callback_2(int x) // Callback Function 2
{
    printf("Hello, this is Callback_2: x = %d ", x);
    return 0;
}

int Callback_3(int x) // Callback Function 3
{
    printf("Hello, this is Callback_3: x = %d ", x);
    return 0;
}

int Handle(int y, int (*Callback)(int))
{
    printf("Entering Handle Function. ");
    Callback(y);
    printf("Leaving Handle Function. ");
}

int main()
{
    int a = 2;
    int b = 4;
    int c = 6;
    printf("Entering Main Function. ");
    Handle(a, Callback_1);
    Handle(b, Callback_2);
    Handle(c, Callback_3);
    printf("Leaving Main Function. ");
    return 0;
}

运行结果:

Entering Main Function.
Entering Handle Function.
Hello, this is Callback_1: x = 2
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_2: x = 4
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3: x = 6
Leaving Handle Function.
Leaving Main Function.

可以看到,并不是直接把int Handle(int (*Callback)()) 改成 int Handle(int (*Callback)(int)) 就可以的,而是通过另外增加一个参数来保存回调函数的参数值,像这里 int Handle(int y, int (*Callback)(int)) 的参数 y。同理,可以使用多个参数的回调函数。

注意事项

指针的使用需要注意空指针和野指针的情况,避免访问无效内存。
在进行指针操作时,确保指针指向有效的内存地址。
熟练掌握指针的概念和操作,能够灵活运用指针来处理各种编程任务。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

让你的pytest日志更有序:配置和使用技巧

简介&#xff1a;pytest是一个成熟的全功能的Python测试工具&#xff0c;它覆盖了所有大小和级别的测试需求。从简单的单元测试到复杂的功能测试&#xff0c;都能得心应手。本文将重点介绍如何配置pytest以捕获和存储日志&#xff0c;让你的测试日志更有序。 历史攻略&#xf…

微信小程序页面导航

1.声明式导航 1.1声明式跳转Tab页面 1.1.1配置的Tab页面 1.1.2页面跳转书写 <navigator url"/pages/home/home" open-type"switchTab">跳转首页</navigator> 1.2.3页面展示 1.2声明式跳转到非Tab页面 1.2.1页面跳转代码 <navigator ur…

mediaSoup编译流程(ubuntu20.04不用翻墙,以及踩坑记录)

ubuntu20.04&#xff0c;一定要确保能够ping通github.com因为我们有很多依赖包需要从上面下载 首先安装node.js >16版本 sudo apt-get update curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt-get install -y nodejs 为node换源 查看node…

数学建模—层次分析法

数模算法1&#xff1a;层次分析法 适用问题&#xff1a;评价类问题&#xff0c;决策&#xff08;方案选择类&#xff09; ** input**&#xff1a;判断矩阵&#xff08;A&#xff09; AHP处理 output:权重&#xff08;得分&#xff09;向量 1.整体导图 2.算法步骤及代码 2.1算…

从关键新闻和最新技术看AI行业发展(2023.5.22-6.22第一期) |【WeThinkIn老实人报】

Rocky Ding WeThinkIn 写在前面 【WeThinkIn老实人报】是WeThinkIn的全新栏目&#xff0c;旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0…

Git:Rebase和Merge之间的区别

一、merge merge的原理是找到这两个分支的祖先commit&#xff0c;在两个分支最新的commit进行三方对比合并 例如下图&#xff0c;共同的祖先commit2,master最新commit6&#xff0c;develop最新commit5&#xff0c;merge会基于2&#xff0c;5&#xff0c;6这三个commit进行对比&…

多模态信息融合研究

1、主要研究方向 多模态学习可以划分为以下五个研究方向&#xff1a; 多模态表示学习 Multimodal Representation&#xff1a;主要研究如何将多模态的数据所蕴含的语义信息通过embedding的方式实现向量化&#xff0c;便于后续的计算&#xff1b; 模态转化 Translation&#…

BN层的参数γ、β以及前、后向传播

γ、β 存在问题 在对输入做完标准化后&#xff0c;可能会出现以下情况&#xff1a;网络中间某一层学习到特征数据本身分布在sigmoid激活函数的两侧&#xff0c;标准化会强制把输入的均值限制为0、标准差限制为1&#xff0c;这样就把数据变换成分布在sigmoid激活函数的中间部…

补充python部分细节性知识点

未完&#xff0c;持续更新中。。。 一、数据类型 1.浮点型&#xff1a;float 使用浮点型的变量相加之后可能会存在值不准确的问题&#xff0c;可以考虑引入decimal模块,decimal其实也是一种数据类型&#xff0c;是十进制的数据类型&#xff0c;实际上就是将flaot类型进行一次…

Java安全——语言安全结构

Java安全 Java语言安全 Java语言安全结构 面向对象的一个设计突出点就是允许数据的隐藏和数据的封装。数据封装确定了数据的访问只能通过公共接口访问操作。而一般的操作是直接管理对象的数据元素。对于开发大型的&#xff0c;健壮性的面向对象的系统的重要性。 java实体的…

Linux下std::ifstream成员函数对应系统调用验证

最近在分析离线数据使用时的bug&#xff0c;发现代码中对std::ifstream成员函数使用存在疑问&#xff0c;所以就写了个简单测试程序来分析std::ifstream成员函数对应那些系统调用。 目录 1.gcount 2.seekg和tellg 3.read 代码如下&#xff1a; test.cpp #include <ios…

python中如何使用正则表达式提取数据

这篇文章主要介绍了python中如何使用正则表达式提取数据问题。具有很好的参考价值&#xff0c;希望对大家有所帮助。如有错误或未考虑完全的地方&#xff0c;望不吝赐教。 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 re…

mac m4a转mp3怎么转?

mac m4a转mp3怎么操作&#xff1f;小编之前编写了在windows系统电脑上进行音频格式转换的教程和方法&#xff0c;帮助了不少的小伙伴。最近有一个粉丝朋友向我求助&#xff0c;因为自己使用的是苹果mac电脑&#xff0c;有没有什么方法可以在上面将m4a音频格式转换成mp3。因为使…

从加密转型AI:追求可持续性发展还是盲目跟风?

很多批评者曾说&#xff0c;加密行业充斥着流行语&#xff0c;总是在追逐下一个新趋势&#xff0c;甚至会因为过度追求短期利润而忽视了可持续性发展的重要性。在大多数情况下&#xff0c;他们似乎是对的。 上周末&#xff0c;国内最早也是最大的比特币论坛巴比特宣布转型AI赛道…

ClickHouse单节点安装配置

创建目录 mkdir /opt/clickhouse 将文件复制到目录 cp /opt/clickhouse-*.rpm /opt/module/clickhouse/ 在/clickhouse目录下解压安装文件 rpm2cpio clickhouse-client-21.7.3.14-2.noarch.rpm | cpio -idmv rpm2cpio clickhouse-common-static-21.7.3.14-2.x86_64.rpm | …

OpenCV学习笔记 | 边缘检测Canny算法复现 | Python

摘要 OpenCV中的边缘检测是指在图像中检测出明显的边缘轮廓线&#xff0c;可以通过计算图像中每个像素的梯度来实现。Canny算法是一种常用的边缘检测算法&#xff0c;它主要通过连续的操作来寻找边缘&#xff0c;包括对图像去噪、计算图像梯度、非极大值抑制和双阈值处理等步骤…

第36节:cesium 下雨效果(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

[ JVM ] 常用参数 优化参考

基础概念回顾 JDK、JRE、JVM的关系&#xff08;JDK>JRE>JVM&#xff09; JDK JRE 开发工具 、JRE JVM 类库&#xff0c;具体关系如下图&#xff1a; JDK&#xff08;Java Development Kit&#xff09; 用于开发 Java 应用程序的软件开发工具集合&#xff0c;包括 了 …

【接口mock工具】推荐一个好用的api接口关联,接口mock,文档管理的工具-yapi

【接口mock工具】推荐一个好用的api接口关联&#xff0c;接口mock&#xff0c;文档管理的工具-yapi 能满足的功能 &#xff1a; 1. 接口mock 2. 接口文档生成 3. 接口自动化测试 4. 接口自动化测试结果可以发送到你的企业微信上面 5. 接口管理可以按照分组&#xff0c;分项…

python数据分析之利用多种机器学习方法实现文本分类、情感预测

大家好&#xff0c;我是带我去滑雪&#xff01; 文本分类是一种机器学习和自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;旨在将给定的文本数据分配到预定义的类别或标签中。其目标是为文本数据提供自动分类和标注&#xff0c;使得可以根据其内容或主题进行组织、排…