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

相关推荐
lly2024062 小时前
C 标准库 - `<stdio.h>`
开发语言
沫璃染墨2 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
jwn9992 小时前
Laravel6.x核心特性全解析
开发语言·php·laravel
迷藏4943 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
skywalker_113 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
功德+n3 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
明日清晨3 小时前
python扫码登录dy
开发语言·python
我是唐青枫3 小时前
C#.NET gRPC 深入解析:Proto 定义、流式调用与服务间通信取舍
开发语言·c#·.net
JJay.3 小时前
Kotlin 高阶函数学习指南
android·开发语言·kotlin