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

相关推荐
Lips6112 小时前
2026.1.13力扣刷题笔记
笔记·算法·leetcode
客卿1232 小时前
1/14-C语言重排数组
c语言·开发语言·算法
不穿格子的程序员2 小时前
从零开始刷算法——二叉树篇:验证二叉搜索树 + 二叉树中第k小的元素
java·开发语言·算法
老鼠只爱大米2 小时前
LeetCode算法题详解 76:最小覆盖子串
算法·leetcode·双指针·滑动窗口·最小覆盖子串·minwindow
HABuo2 小时前
【linux进程控制(一)】进程创建&退出-->fork&退出码详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
郝学胜-神的一滴2 小时前
Python方法类型详解:类方法、静态方法与实例方法
开发语言·python·程序人生
Tandy12356_2 小时前
手写TCP/IP协议栈——TCP数据接收
c语言·网络·网络协议·tcp/ip·计算机网络
码农胖虎-java2 小时前
【java并发编程】从源码角度彻底理解 ForkJoinPool.commonPool
java·开发语言·python
CQ_YM2 小时前
SQLite3 数据库与网页html
c语言·数据库·sqlite·html