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),此时 * 用于数值计算。

相关推荐
shilei_c3 分钟前
qt qDebug无输出问题解决
开发语言·c++·算法
pop_xiaoli5 分钟前
effective-Objective-C 第一章阅读笔记
开发语言·笔记·ios·objective-c·cocoa·xcode
jghhh015 分钟前
基于C#的CAN总线BMS上位机开发方案
开发语言·c#
serve the people6 分钟前
python环境搭建 (七) pytest、pytest-asyncio、pytest-cov 试生态的核心组合
开发语言·python·pytest
秋深枫叶红7 分钟前
嵌入式C语言阶段复习——函数
c语言·数据结构·算法
java1234_小锋8 分钟前
分享一套不错的基于Python的Django宠物信息管理系统
开发语言·python·宠物
一切尽在,你来10 分钟前
C++ 零基础教程 - 第4讲-实现简单计算器
开发语言·c++
We་ct11 分钟前
LeetCode 49. 字母异位词分组:经典哈希解法解析+易错点规避
前端·算法·leetcode·typescript·哈希算法
梵刹古音11 分钟前
【C语言】 数组函数与排序算法
c语言·算法·排序算法
女王大人万岁17 分钟前
Go语言JSON标准库(encoding/json):功能解析与实战指南
服务器·开发语言·后端·golang·json