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