C语言怯魅——指针和数组

news/2025/2/2 20:29:12 标签: c语言, 算法, 数据结构

C语言怯魅——指针和数组

指针—— C的精华,也是重难点,很多人将C作为入门语言,指针往往成了新手入门编程的拦路虎。 其本质很简单,但由于衍生出来的用法多样,知晓如何以及何时使用指针并不简单。

以下是我个人的一些经验分享:

1. 指针的本质

  1. 直接从字面意思来理解,就是指向一个方向的方向标,可以类比为指南针的磁针
  2. 指针其指向的位置——地址(这里往往会和数组结合起来)

2. 指针的运用

1. 解引用 *

  1. 因为指向地址,而非值,需要解引用”*“(一个星号)
  2. 通过解引用指针可以直接对数据进行修改(就相当于一座桥梁,直接让作用对象变为了数值)
#include <stdio.h>

int main() {
    // 定义并初始化一个整数数组
    int arr[5] = {10, 20, 30, 40, 50};
    // 定义一个整数变量
    int num;
    // 让指针 ptr 指向变量 num
    int *ptr = &num;

    // 将数组 arr 的首元素的值赋给 ptr 所指向的变量
    *ptr = *arr;  //  不可以的理解为ptr = arr 这是两个东西
	 //上式的本质是值的赋值,而ptr = arr是地址的赋值     // 非常重要
    // 输出 ptr 所指向变量的值
    printf("ptr 指向的变量的值是: %d\n", *ptr);

    return 0;
}

2. 改变实参的值

  1. 指针传入函数后,函数依据指针所指向的地址,就可以直接对传入的实参进行修改
  2. 因为指针可以改变实参的值

(直接对数据本身进行修改(指针一般无法改变其指向的数据类型),”本源伤害“)

因此在函数传参时传入在形参前加上*,就可以对传入的函数值进行修改

以下是示例:

#include <stdio.h>

// 交换两个整数的值的函数
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int num1 = 10;
    int num2 = 20;

    printf("交换前: num1 = %d, num2 = %d\n", num1, num2);

    // 调用 swap 函数,传入 num1 和 num2 的地址
    swap(&num1, &num2);

    printf("交换后: num1 = %d, num2 = %d\n", num1, num2);

    return 0;
}

解析:

  1. 一个简单的通过传入指针实现值交换的函数。
  2. 这里指针的运用使得形参可以对实参产生影响

3. 与数组的结合

  1. 数组的名称就是它的首地址,比如:
int arr[10];             //这里arr就是数组的首地址
  1. 在传入函数的时候,可以将数组名传入函数其实就是将数组的地址传入
  2. 如此就可以实现对数组的元素进行修改

要注意:

  1. 这里数组名已经是地址了,传入函数时,如果要求传入的是数组的地址

  2. 不要对它解引用,否则传入的将是数组的第一个元素

  3. (对数组首地址解引用不就是对数组的第一个元素的地址解引用吗!

    解出来当然是数组的一个元素了)
    
  4. 那么如果要传入第i个数组元素的地址,那该传入的就该是arr[i]了

  5. 如果定义了一个*ptr(pointer的简写)指向arr[10],那就该写为

int *ptr;
int arr[10];
ptr = arr;
  1. 以下代码中的*ptr = *arr,其实就是ptr = arr的对赋值语句两边的解引用,

    从而实现对指针指向的值的赋值

#include <stdio.h>

int main() {
    // 定义并初始化一个整数数组
    int arr[5] = {10, 20, 30, 40, 50};
    // 定义一个整数变量
    int num;
    // 让指针 ptr 指向变量 num
    int *ptr = &num;

    // 将数组 arr 的首元素的值赋给 ptr 所指向的变量
    *ptr = *arr;

    // 输出 ptr 所指向变量的值
    printf("ptr 指向的变量的值是: %d\n", *ptr);

    return 0;
}

4. &取地址符——解引用的逆操作

总结:

指针在C语言中非常重要,也是C++中许多操作的内置机理(比如引用)

熟练掌握指针的使用场景,会为未来学习C++以及其他语言打好基础。

本文篇幅不长,列举的例子也都比较简单,指针的运用要多写代码,才能加深理解。

不必因为一时学习指针有些困难垂头丧气,再啃一段时间,对其理解慢慢加深后,就会感觉好很多。


http://www.niftyadmin.cn/n/5840277.html

相关文章

lstm代码解析1.2

在使用 LSTM&#xff08;长短期记忆网络&#xff09;进行训练时&#xff0c;model.fit 方法的输入数据 X 和目标数据 y 的形状要求是不同的。具体来说&#xff1a; 1. 输入数据 X 的形状 LSTM 层期望输入数据 X 是三维张量&#xff0c;形状为 (samples, timesteps, features)…

upload labs靶场

upload labs靶场 注意:本人关卡后面似乎相比正常的关卡少了一关&#xff0c;所以每次关卡名字都是1才可以和正常关卡在同一关 一.个人信息 个人名称&#xff1a;张嘉玮 二.解题情况 三.解题过程 题目&#xff1a;up load labs靶场 pass 1前后端 思路及解题&#xff1a;…

【Docker】dockerfile识别当前构建的镜像平台

在编写dockerfile的时候&#xff0c;可能会遇到需要针对不同平台进行不同操作的时候&#xff0c;这需要我们对dockerfile进行针对性修改。 比如opencv的依赖项libjasper-dev在ubuntu18.04上就需要根据不同的平台做不同的处理&#xff0c;关于这个库的安装在另外一篇博客里面有…

Miniconda 安装及使用

文章目录 前言1、Miniconda 简介2、Linux 环境说明2.1、安装2.2、配置2.3、常用命令2.4、常见问题及解决方案 前言 在 Python 中&#xff0c;“环境管理”是一个非常重要的概念&#xff0c;它主要是指对 Python 解释器及其相关依赖库进行管理和隔离&#xff0c;以确保开发环境…

react redux监测值的变化

现在想了解如何在React Redux中监测值的变化。他们之前已经讨论过使用useSelector来获取状态&#xff0c;但可能对如何有效监听状态变化的具体方法还不够清楚。需要回顾之前的对话&#xff0c;看看用户之前的需求是什么。 用户之前的问题涉及将Vue的响应式设备检测代码转换为Re…

Unity安装教学与相关问题

文章目录 1. 前言2.Unity Hub2.1 下载Unity Hub2.2 安装Unity Hub2.3 注册Unity账号2.4 在Hub上登录账号2.5 在Hub上获取许可证 3. 下载并安装Unity3.1 从Unity Hub下载&#xff08;推荐&#xff09;3.1.1 选择下载版本3.1.2 选择下载组件3.1.3 安装Visual Studio Community 20…

pytorch实现简单的情感分析算法

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 在PyTorch中实现中文情感分析算法通常涉及以下几个步骤&#xff1a;数据预处理、模型定义、训练和评估。下面是一个简单的实现示例&#xff0c;使用LSTM模型进行中文情感分析。 1. 数据预处理 首先&#xff0c;我…

Kubernetes组成及常用命令

Pods(k8s最小操作单元)ReplicaSet & Label(k8s副本集和标签)Deployments(声明式配置)Services(服务)k8s常用命令Kubernetes(简称K8s)是一个开源的容器编排系统,用于自动化应用程序的部署、扩展和管理。自2014年发布以来,K8s迅速成为容器编排领域的行业标准,被…