C语言实现数组串联--力扣冒险

一个C语言复习自用

c 复制代码
#include <stdlib.h>

// 函数签名中的*:位置1、位置2
int* getConcatenation(int* nums, int numsSize, int* returnSize) {
    // 语句中的*:位置3
    *returnSize = numsSize * 2;  // 这里还有一个*:乘法运算符(位置4)
    int* ans = (int*)malloc(*returnSize * sizeof(int));  // 位置5、位置6、位置7
    if (ans == NULL) {
        return NULL;
    }

    for (int i = 0; i < numsSize; i++) {
        ans[i] = nums[i];
        ans[i + numsSize] = nums[i];
    }
    return ans;
}

实现思路

首先复习一下C语言的数组和指针

1. *的 3 种核心用途(结合代码逐处解析)

用途 1:声明指针变量(用于变量 / 函数返回值声明,标识 "这是一个指针")
指针的本质是 "存储内存地址的变量" ,声明时用标记,告诉编译器该变量 / 返回值不是普通数据,而是一个内存地址
对应代码中的
位置:

  • int* getConcatenation:这里的用于声明函数的返回值是一个int类型的指针(即函数返回的是一块存储int数据的内存地址,对应后续malloc分配的数组首地址)。
    补充:int
    也可写成int *,空格不影响,语义一致,均表示 "返回值是指向int的指针"。
  • int* nums:这里的*用于声明nums是一个int类型的指针变量 (接收调用者传入的原始数组首地址,因为 C 语言中数组名传递时会隐式转换为数组首元素指针)。
  • int* returnSize:这里的*用于声明returnSize是一个int类型的指针变量 (接收调用者传入的 "用于存储返回数组长度的变量地址")。
  • int* ans:这里的*用于声明 ans是一个int类型的指针变量 (用于存储malloc动态分配的新数组首地址,后续操作这个指针来操作新数组)。
  • (int*)malloc(...):这里的 * 是强制类型转换的一部分,配合int声明,将malloc返回的通用void * 类型指针,强制转换为int类型指针(malloc默认返回void*,无法直接赋值给int*类型的ans,需要强制转换)。

用途 2:解引用操作符(又称 "间接访问操作符")(用于操作指针指向的内存空间,标识 "访问指针指向的内容")

当 * 用在已声明的指针变量前(非声明场景),表示 "通过指针存储的地址,访问该地址对应的内存空间的值",可以读取该值,也可以修改该值(即解引用)。

对应代码中的*位置:
returnSize = numsSize * 2:这里的 是解引用操作符。

解析:returnSize是一个指针变量(存储了一个内存地址),

*returnSize表示 "访问returnSize指针所指向的内存空间",并将numsSize * 2(新数组长度)赋值给这个空间。

通俗理解:调用者传入了一个 "存储长度的变量地址",

*returnSize就是对这个变量的 "远程修改",让调用者能获取到新数组的长度。

*returnSize * sizeof(int):这里的第一个returnSize)是解引用操作符。
解析:先通过
returnSize获取到指针指向的 "新数组长度"(即numsSize * 2),再和sizeof(int)相乘,得到malloc需要分配的总字节数。

用途 3:乘法运算符(用于数值计算,实现乘法运算)

这是最基础的用途,和指针无关,仅用于数值之间的相乘计算。

对应代码中的位置:
numsSize * 2:这里的
是乘法运算符,计算numsSize的 2 倍(新数组总长度)。
returnSize * sizeof(int):这里的第二个 (在*returnSize和sizeof(int)之间)是乘法运算符。

解析:将解引用得到的 "新数组长度" 和 "单个int类型的字节数" 相乘,得到动态分配内存的总字节数,确保malloc分配足够的空间存储串联后的数组。

二、关键区分:如何快速判断*的用途?

看场景:声明场景(定义变量 / 函数返回值时)→ 指针声明标记。

示例:int* p;、char* func();,此时 * 和类型(int/char)绑定,标识指针。

看位置:非声明场景,且*前是一个已存在的指针变量→ 解引用操作符。

示例:*p = 10;、int len = *returnSize;,此时 * 和指针变量绑定,访问指针指向的内容。

看两侧:*两侧都是数值 / 数值变量 / 表达式→ 乘法运算符。

示例:3 * 5、a * b、numsSize * sizeof(int),此时 * 用于数值计算。

相关推荐
Chester_19996 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲7 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员7 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导8 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan8 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_695251498 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
是隼人8 小时前
buuctf-pwn xdctf2015_pwn200题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
大衛說9 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
学习星球10 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
可乐鸡翅yeah_10 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线