指针数组的内存到底是如何排列的?90%的程序员都答错了

第一章:指针数组的内存到底是如何排列的?

在C语言中,指针数组是一种常见的数据结构,其本质是一个数组,每个元素都是指向某种数据类型的指针。理解指针数组的内存布局对于掌握底层内存管理至关重要。

指针数组的基本定义与声明

指针数组的声明形式如下:

char *names[3]; // 声明一个包含3个元素的指针数组,每个元素指向 char 类型
该数组本身在栈上分配连续内存空间,用于存储3个指针(即地址),而这些指针可以分别指向堆或静态区中的字符串或其他数据。

内存布局解析

假设我们初始化如下:

names[0] = "Alice";
names[1] = "Bob";
names[2] = "Charlie";
此时内存分布如下:
  • 数组 names 在栈上占据连续的3个指针宽度(通常每项8字节,64位系统)
  • 每个指针指向不同的字符串常量,这些字符串存储在只读数据段(.rodata)
  • 各字符串的物理地址彼此独立,并不连续
可通过以下表格表示其逻辑结构:
数组索引存储内容(指针值)指向的目标
names[0]0x1000"Alice" 所在地址
names[1]0x1020"Bob" 所在地址
names[2]0x1040"Charlie" 所在地址
graph TD A[names[0]] --> B["Alice" (rodata)] C[names[1]] --> D["Bob" (rodata)] E[names[2]] --> F["Charlie" (rodata)] style A fill:#f9f,stroke:#333 style C fill:#f9f,stroke:#333 style E fill:#f9f,stroke:#333
这种分离式布局使得指针数组非常灵活,适用于处理变长字符串或动态对象集合。

第二章:深入理解指针数组的基本概念

2.1 指针与数组的本质区别与联系

在C语言中,指针和数组看似相似,实则本质不同。数组是连续内存空间的集合,而指针是存储地址的变量。
内存布局差异
数组在编译期分配固定大小的栈空间,无法更改长度;指针则指向动态或静态分配的内存,可重新赋值。
代码示例对比

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // 指针指向数组首元素
上述代码中,arr 是数组名,表示首地址,不可修改;ptr 是变量,可指向其他地址。虽然 arr 和 ptr 都能通过 *(arr + i) 或 ptr[i] 访问元素,但 sizeof(arr) 返回整个数组字节(如20),而 sizeof(ptr) 仅返回指针大小(如8)。
  • 数组名不是左值,不能被赋值
  • 指针是变量,支持自增、赋值等操作
  • 函数参数中“数组”实际退化为指针

2.2 指针数组的声明方式与语法解析

指针数组是一种特殊的数组类型,其每个元素都是指向某一数据类型的指针。声明格式为:数据类型 *数组名[数组长度];。
基本声明语法
int *ptrArray[5]; // 声明一个包含5个int指针的数组
该语句定义了一个长度为5的指针数组,每个元素均可指向一个int变量。注意*与数组名结合较弱,因此是“数组的元素为指针”,而非“指向数组的指针”。
内存布局与初始化
  • 指针数组在栈上分配连续空间,存储的是地址值
  • 可静态初始化:
    char *strs[3] = {"hello", "world", "C"};
  • 每个元素必须单独赋值有效地址,否则为野指针
常见应用场景
常用于字符串数组、多级索引结构及函数指针表等场景,提升数据管理灵活性。

2.3 指针数组与数组指针的对比分析

在C语言中,指针数组和数组指针虽仅一字之差,但语义截然不同。理解二者差异对掌握复杂数据结构至关重要。
指针数组:存储指针的数组
指针数组本质上是一个数组,其每个元素都是指向某种类型的指针。例如:
int *ptrArray[5]; // 声明一个包含5个int指针的数组
该声明表示 ptrArray 是一个拥有5个元素的数组,每个元素均可指向一个整型变量。
数组指针:指向数组的指针
数组指针则是指向整个数组的单一指针,常用于多维数组传参:
int (*arrPtr)[10]; // 声明一个指向长度为10的整型数组的指针
此处 arrPtr 是一个指针,它指向一个包含10个整数的数组,优先级由括号保证。
特性指针数组数组指针
本质数组指针
声明形式type *name[N]type (*name)[N]
用途管理多个独立内存块操作连续数组或二维数组

2.4 内存中地址的存储模型初探

在程序运行时,内存地址的存储模型决定了数据如何被定位与访问。现代系统通常采用虚拟内存机制,将程序使用的逻辑地址映射到物理内存。
地址空间的基本结构
每个进程拥有独立的虚拟地址空间,分为代码段、数据段、堆和栈。操作系统通过页表完成虚拟地址到物理地址的转换。
指针与地址表示
以C语言为例,指针变量存储的是目标数据的内存地址:

int value = 42;
int *ptr = &value; // ptr保存value的地址
printf("Address: %p, Value: %d\n", (void*)ptr, *ptr);
上述代码中,&value 获取变量的地址,ptr 存储该地址,*ptr 实现解引用访问内容。
地址类型说明
逻辑地址由程序生成的段+偏移地址
虚拟地址经分段机制转换后的线性地址
物理地址实际内存硬件中的地址位置

2.5 通过实例验证指针数组的定义正确性

在C语言中,指针数组是一组指向相同数据类型的指针集合。为了验证其定义的正确性,可以通过实际代码进行测试。
定义与初始化
下面定义一个指向字符串的指针数组,并初始化:

#include <stdio.h>
int main() {
    char *fruits[] = {"apple", "banana", "cherry"};
    printf("第一种水果: %s\n", fruits[0]);
    printf("第二种水果: %s\n", fruits[1]);
    return 0;
}
上述代码中,fruits 是一个指针数组,每个元素都是 char* 类型,分别指向字符串常量的首地址。运行结果将正确输出对应字符串。
内存布局验证
  • 指针数组的每个元素存储的是地址;
  • 通过 &fruits[i] 可获取指针本身地址;
  • 通过 fruits[i] 获取指向字符串的地址。
该结构确保了数据访问的灵活性和高效性。

第三章:指针数组的内存布局原理

3.1 编译器如何为指针数组分配内存

在C/C++中,指针数组是一组连续存储的指针变量集合,编译器根据声明的大小在栈或静态存储区分配固定大小的内存块。
内存布局与声明语法
例如,声明 int *ptrArray[5]; 表示一个包含5个指向整型的指针数组。每个元素均可独立指向不同的内存地址。

int a = 10, b = 20;
int *arr[2] = {&a, &b}; // arr[0] 指向 a,arr[1] 指向 b
上述代码中,编译器为 arr 分配可容纳两个指针的空间(通常为16字节,64位系统下),并初始化其元素为变量 a 和 b 的地址。
内存分配过程分析
  • 编译阶段确定数组长度和类型大小
  • 生成符号表记录数组起始地址和偏移量
  • 运行时通过基址 + 索引 × 指针宽度计算元素位置

3.2 指针数组元素的地址连续性分析

在C语言中,指针数组本质上是一个数组,其每个元素都是指向某种数据类型的指针。尽管这些指针所指向的对象可能分布在内存的不同位置,但**指针数组自身的元素在内存中是连续存储的**。
内存布局特性
指针数组的连续性体现在数组结构本身:每个指针作为数组元素,占据固定大小(如64位系统为8字节),并按顺序排列。

#include <stdio.h>
int main() {
    int a = 1, b = 2, c = 3;
    int *ptrArr[] = {&a, &b, &c}; // 指针数组
    for (int i = 0; i < 3; i++) {
        printf("Element %d address: %p\n", i, (void*)&ptrArr[i]);
    }
    return 0;
}
上述代码输出显示 `&ptrArr[0]`、`&ptrArr[1]`、`&ptrArr[2]` 地址依次递增且间隔相等,证明其存储连续。
关键区别:数组元素 vs 元素所指对象
  • 指针数组元素地址连续 → 数组结构特性
  • 元素指向的目标地址无必然联系 → 取决于实际对象分配

3.3 指向不同数据区的指针在数组中的表现

在C语言中,指针可以指向栈区、堆区、全局区等不同内存区域,当这些指针作为元素存储在数组中时,其行为表现出显著差异。
指针数组的内存布局
指针数组本质上是存放地址的数组,每个元素可指向不同数据区:

int global_var = 10;                    // 全局区
int main() {
    int stack_var = 20;                 // 栈区
    int *heap_var = malloc(sizeof(int)); // 堆区
    *heap_var = 30;

    int *ptr_array[] = {&global_var, &stack_var, heap_var};

    for (int i = 0; i < 3; i++)
        printf("Value: %d\n", *ptr_array[i]);
}
上述代码中,ptr_array 的三个元素分别指向全局区、栈区和堆区。运行时能正确访问数据,但需注意栈区变量生命周期结束后的悬空指针问题。
各数据区指针特性对比
数据区生命周期指针有效性
全局区程序运行期间始终有效
栈区函数作用域内函数返回后失效
堆区手动释放前free后失效

第四章:动手实验验证内存排列真相

4.1 使用printf输出指针数组各元素地址

在C语言中,指针数组是一种存储多个指针变量的集合。通过 printf 函数可以输出这些指针所指向的地址信息,便于调试和内存分析。
基本语法格式
使用 %p 格式符可输出指针地址,通常需配合强制转换为 void* 类型:

#include <stdio.h>

int main() {
    int a = 10, b = 20, c = 30;
    int *ptrArr[] = {&a, &b, &c}; // 指针数组

    for (int i = 0; i < 3; i++) {
        printf("元素 %d 的地址: %p\n", i, (void*)ptrArr[i]);
    }
    return 0;
}
上述代码中,ptrArr 是一个存放三个整型变量地址的指针数组。printf 使用 %p 输出每个元素所指向的内存地址,(void*) 确保类型兼容。
输出示例说明
运行结果类似:
  • 元素 0 的地址: 0x7ffdb1234560
  • 元素 1 的地址: 0x7ffdb1234564
  • 元素 2 的地址: 0x7ffdb1234568
地址间偏移与 int 类型大小一致,体现连续内存分布规律。

4.2 利用gdb调试查看内存实际分布

在程序开发中,理解变量在内存中的实际布局对优化和调试至关重要。GDB 提供了强大的内存查看功能,帮助开发者深入底层分析。
基本内存查看命令
使用 `x` 命令可查看指定地址的内存内容:

(gdb) x/4xw &var
该命令表示:以十六进制格式(x),每次显示一个字(w),共显示 4 次。`&var` 是变量 var 的地址。输出结果展示变量在内存中的原始字节排列,有助于识别数据对齐与填充。
结构体内存布局分析
对于结构体,可通过 GDB 验证成员偏移与对齐策略:
成员偏移(字节)类型
id0int
flag4char
data8double
通过 `(gdb) p &struct.data - &struct` 可验证 double 类型从 8 字节处开始,符合内存对齐规则。

4.3 对比不同编译环境下的内存布局差异

在不同的编译环境下,程序的内存布局可能因对齐策略、ABI规范和目标架构而产生显著差异。
数据对齐与结构体填充
编译器通常根据目标平台的字节对齐要求插入填充字节。例如,在64位GCC环境下:

struct Example {
    char a;     // 1 byte
    // 7 bytes padding
    long b;     // 8 bytes
};
// Total: 16 bytes
而在某些嵌入式环境中使用 -fpack-struct 选项时,结构体将被紧凑排列,总大小降为9字节,牺牲访问性能换取空间节省。
常见平台对比
平台/编译器指针大小默认对齐典型布局特征
x86_64 GCC8 bytes8-byte aligned高地址栈增长,独立.rodada段
ARM Keil4 bytes4-byte aligned代码与常量合并到Flash区

4.4 动态分配指针数组时的内存变化观察

在C语言中,动态分配指针数组涉及两级内存分配:数组本身和其所指向的数据。通过 malloc 分配指针数组时,系统在堆区开辟连续空间用于存储指针。
内存分配示例

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 5;
    char **strArray = (char**)malloc(n * sizeof(char*)); // 分配5个指针
    for (int i = 0; i < n; i++) {
        strArray[i] = (char*)malloc(10 * sizeof(char)); // 每个指针指向10字节
    }
    return 0;
}
上述代码首先分配一个包含5个 char* 的数组,每个元素再分别指向一块10字节的内存块,形成不连续的二维结构。
内存布局分析
  • 指针数组位于堆中连续地址空间
  • 每个指针指向独立分配的内存块,物理上可能分散
  • 需逐层释放:先释放每个字符串,再释放指针数组

第五章:90%程序员误解的根源与纠正

对闭包作用域的普遍误读
许多开发者认为 JavaScript 中的闭包会“捕获变量的值”,但实际上闭包捕获的是变量的引用。这在循环中尤为明显:

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// 输出:3, 3, 3
使用 let 替代 var 可解决此问题,因为块级作用域为每次迭代创建新绑定。
异步编程中的常见陷阱
开发者常误以为 async/await 会自动处理所有错误。然而未捕获的 Promise 拒绝仍可能导致应用崩溃。
  • 始终在 await 调用外包裹 try/catch
  • 全局监听 unhandledrejection 事件
  • 避免在 Promise.all 中混入不确定状态的 Promise
类型转换的隐式行为误区
JavaScript 的松散比较(==)常引发逻辑偏差。以下表格展示常见比较结果:
表达式结果
[] == falsetrue
'0' == falsetrue
null == undefinedtrue
建议统一使用严格相等(===)以避免类型 coercion 带来的副作用。
性能优化的反模式
过度使用防抖(debounce)和节流(throttle)反而可能延迟关键响应。例如在滚动事件中设置过长的等待时间,会导致用户体验卡顿。
理想方案:根据用户交互频率动态调整阈值,结合 requestAnimationFrame 进行渲染协调。
指针与数组的内存分配 博客搬家:https://blog.youkuaiyun.com/zheyufuck/article/details/53079058 在实践中经常遇到这样的情况:①二维数组、②指向指针的指针、③指针数组、④数组指针 的使用,经常容易混淆,这里从内存分配的情况进行对比 ①二维数组 char a[2][3]; 二维数组的内存分配情况 ②指向指针的指针 char **p1; 指针的指针在内存分配时... 阅读详情

相关推荐

【管理科学】第三十五篇 企业经营中的管理科学01 权力、风险、运营、物流、人力资源、库存、合同、品牌、业绩、项目

编号类型领域子领域/内容问题问题的数学分析(电磁/信息论/数学物理/数学化学/界面科学/表面科学 + 几何/拓扑/代数/集合论/图论/数论/函数评估/数值估计/概率/统计/向量/张量/矩阵/矢量 + 其他)算法逐步推理思考的数学表达式及实现步骤及时序流程 参数列表及参数的数值范围及数值分析及常量/常数1管理科学问题运营管理生产计划如何分配有限资源生产多种产品以最大化利润?线性代数、凸优化、单纯形法;向量与矩阵目标函数 max c^T x,约束 Ax ≤ b, x ≥ 0。步骤:①标准化引入松弛变量;②构建初

weixin_49199313的博客 247

老汤回味——C语言指针,数组及动态内存分配

了解过C语言的人,都会知道C语言有一种独特的变量,那就是指针。指针是一把双刃剑,它为我们提供了操作内存的手段,但同时不恰当的使用,会为我们带来很多麻烦。如何理解指针呢?如果把一个个内存单元看做一个个房间,指针就好像一个个指示牌(内存地址),通过指示牌,我们也可以找到房间(内存单元),查看房间里面的东西。比如现在有一个整型变量a,我们可以理解为一个门牌号为a的房间,我需要拿到这个房间的指示牌,只需要...

我的天空 我的梦 9643

【Python】SUMO + Python 联合仿真平台

强化学习的核心思想是让智能体 (Agent) 通过与环境 (Environment) 的交互来学习如何做出最优决策,以最大化累积奖励 (Cumulative Reward)。在交通场景中,智能体可以是交通信号控制器、自动驾驶车辆或交通管理中心,环境则是 SUMO 模拟的交通路网,奖励则与交通效率、安全、环保等目标相关。交通系统本质上是动态的、随机的、高度复杂的系统,传统的基于规则或模型的优化方法在面对不断变化的需求和突发事件时,往往显得力不从心。强化学习的优势在于:在交通领域,强化学习已经被广泛应用于:为了

宅男很神经 1989

掌握这1个图,彻底搞懂C语言指针数组的内存排布逻辑

掌握一张图彻底理解C语言中指针数组的内存布局,清晰展示数组与指针关系、内存分配方式及访问机制,适用于多维字符串处理和动态数据管理,逻辑直观易懂,值得收藏。

StepNexus的博客 879

Python逻辑回归——以车险定价为例(附代码)

保费定价也成为费率厘定,是保险公司运营的环节之一。其过程是根据保单(被保险人)的损失经验和其他相关信息建立模型,并且对未来的保险成本(赔款、代理人佣金、一般管理费用、理赔费用以及支持该业务所需的资本金成本)进行预测的过程。保险公司实际使用的费率还会受到市场供求关系和公司自身发展战略的影响。汽车保险也称机动车辆保险,失意机动车辆本身及其第三者责任等为保险标的的一种运输工具险,在非寿险井算领域中占有重要地位。

m0_62929945的博客 1984

kettle连接达梦资源库数据库插件

kettle自定义插件plugin database plugin 达梦插件 dm插件

weixin_42122126的博客 2170

指针数组、数组指针、memset填充问题

函数原型 memset(dist , val,size); char test[]

zhong_sheng_的专栏 7390

STM32F103VET6实战:用W25Q64外部Flash实现Bootloader远程升级(含完整代码解析)

本文详细介绍了基于STM32F103VET6与W25Q64外部Flash的Bootloader远程升级实现方案,包含硬件选型、存储分区策略、双校验机制及完整代码解析。通过SPI接口实现固件存储与升级,适用于物联网设备开发,提升OTA功能可靠性。

weixin_42620340的博客 358

数组指针 指针数组 使用malloc分配空间

介绍 了数组指针和指针数组 用malloc分配空间时的一些方法

BUG_MeDe的博客 2210

Palantir的Ontology:从静态知识图谱到动态业务引擎的跃迁

本文探讨了Palantir的Ontology技术如何将静态知识图谱升级为动态业务引擎。通过引入函数和行动作为核心元素,Ontology实现了业务逻辑的自动化响应与执行,显著提升物流、能源等领域的运营效率。文章详细解析了其混合存储引擎、状态监听网络等关键技术设计,并对比展示了传统架构与Ontology架构的业务价值差异。

weixin_42570296的博客 200

CANoe如何实现TLS协议

TLS,Transport Layer Security,传输层安全协议。是在传输层和应用层之间,为了保证应用层数据能够安全可靠地通过传输层传输且不会泄露的安全防护。

jasonj333 1161

从C语言标准揭秘C指针:第 3 章:指针与数组:连续内存的高效遍历

C 标准(§6.5.6)指出:“如果指针操作的结果指向数组对象之外的内存,即使未解引用,行为也是未定义的”—— 指针越界后,无论是否访问内存,都可能导致程序崩溃、读取垃圾数据或篡改其他变量的内存。我们用代码展示风险并提供避坑方法:// 正确获取元素个数(0-4)// 错误1:越界访问数组元素(下标超出0-4)// printf("越界访问arr[5]:%d\n", arr[5]);// 结果未知(垃圾值或崩溃)// printf("越界访问*(p+10):%d\n", *(p + 10));

xingke的专栏 633

电磁场仿真软件:Sonnet_(3).Sonnet用户界面与操作

Sonnet支持用户通过二次开发自定义工具,例如:编写Python脚本,实现自定义功能。将脚本保存为工具插件。在Sonnet中加载并使用自定义工具。# 示例:自定义工具 import sonnet def custom_tool(design , object , parameter , value) : """自定义工具示例,设置对象的指定参数。

kkchenjj的博客 1523

游戏大厂C/C++校招笔试核心考点与备考策略

C/C++作为游戏引擎开发的核心语言,其底层机制——内存布局、虚函数多态、STL容器行为——是校招笔试的高频考点。游戏公司不仅考察语法,更注重候选人对内存对齐、RAII、迭代器失效等工程细节的理解。笔试算法题通常设有严格时间限制(如C/C++ 1000ms),要求开发者掌握最优解法和高效的本地环境配置,例如使用VS Code搭配MinGW-w64搭建调试工具链。从C转C++的开发者尤其需要突破面向过程思维,建立RAII、数据驱动等现代C++工程理念。本文结合搜狐畅游真题,系统梳理笔试核心模块、代码阅读与改错

weixin_30256901的博客 383

Allegro如何画Photoplot_Outline操作指导

在用Allegro进行PCB设计的时候,最后进行光绘输出前,Photoplot_Outline是必备一个图形,所有在Photoplot_Outline中的图形将被输出,Photoplot_Outline以外的图形都将不被输出。如何绘制Photoplot_Outline,具体操作如下。如何画Photoplot_Outline操作指导。

weixin_54787054的博客 2634

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

京东Android校招笔试复盘:核心考点与备考指南

在Android开发岗位的校招中,笔试环节往往考察的是开发者对底层原理与基础知识的掌握程度。从Java集合框架到并发编程,从Handler消息机制到Activity启动模式,这些核心技术点贯穿于日常开发与面试考核之中。理解HashMap的底层实现、线程池的运行流程、Binder的通信原理,不仅能应对大厂笔试,更能提升实际工程中的问题排查能力。本文基于京东2019校招Android笔试题,系统梳理了Java基础、Android核心机制、数据结构与算法、网络协议等高频考点,并针对备考优先级、常见陷阱和技术面追问

weixin_30509393的博客 397

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C语言入门学习——数组指针、函数指针、内存动态分配(2025.1.21)

长度为10的整型数组指针,在64位操作系统中,指针中的地址占8字节,故共计80字节。一个指向整型数组中第10个元素的指针p,占8字节。这些函数也被称为下面打印数组函数的。目标内容被回收销毁后,指针p、q变为。,故最后还需将指针p、q归零为。释放归还空间,否则会产生。的指针,保存的是函数的。

2301_79895541的博客 312

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

指针数组的内存分配和释放

编码情景是要动态分配个数不确定的非内嵌类型对象,把获取的对象指针都存在一个数组里面,留待其他地方使用. 定义指针 CBase** m_pMotion; 个人偏向于用new/delete关键字,当然也可以用malloc/free函数组合来进行内存的分配和释放 分配内存, nHWNo是外部传递的参数 m_pMotion = new CBase*[nHWNo]; for (int n...

2183

C语言学习笔记(指针 地址 动态内存分配)

C语言基础:地址、取地址符和指针

m0_62510826的博客 2119

指针内存分配

1、一维指针内存分配。//作数组使用时 int *p = NULL; //保存int类型数据 int n = 7; //数组长度 p = (int *)malloc(sizeof(int)*n); int i; for(i=0; i<n; i++) p[i] = 0; free(p); //释放2、指针数组内存分配int n = 6; int *p[n]; //保存int指针类型数据的数组

ZD的博客 4361

c语言指针数组分配内存,指针数组&数组指针的分配内存及函数参数 C语言版

最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了。所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了《C缺陷和陷阱》也没有我想要的东西。要么就是C和C++混为一谈,new int[5]这种语法C肯定是错误的,所以找个机会总结一下,然后希望以后不要再栽在基础上。定义指针数组:int p[10] 数组指针 int(*p)[5...

weixin_28856787的博客 1988

【C++】对指针形参及指针数组分配内存空间

在使用指针作为函数形参的时候,和数组首地址作为函数形参的用法一致。但指针和数组有一个重要区别是指针指向的地址可能为空,而数组的首地址一定会指向一段地址空间的。因此在使用指针作为函数形参,并在函数内申请内存空间时,传入的应该为指针的地址。而在释放该地址空间时,直接传该指针即可。 另外还要区分指针数组和数组指针的区别。运算优先级为 () > [] > * #include <...

xll_bit的博客 2842

指针数组&数组指针的分配内存及函数参数 C语言版

最近写代码总是被基础知识卡住,十分耽误时间,今天又卡住了。所以下定决心一定要弄清楚这个问题,然后不好的是网上的资料总是解决的并不清楚,总是在纠结什么是指针数组什么是数组指针,看了《C缺陷和陷阱》也没有我想要的东西。要么就是C和C++混为一谈,new int[5]这种语法C肯定是错误的,所以找个机会总结一下,然后希望以后不要再栽在基础上。定义指针数组:int p[10] 数组指针 int(*p)[5]

WSRspirit的专栏 1万+

为指针的指针分配内存

前言:本人在学习数据结构的过程中,遇到了散列这种数据结构,在使用分离链表发构建散列的过程中,需要用到为指针的指针动态分配内存空间,所以本人写了一个C语言的Demo程序来先测试这一行为 问题如图 #include "stdafx.h" //输出数组测试 void PrinT(i...

Yz529的博客 765

指针数组堆上分配内存(动态分配内存)

#define _CRT_SECURE_NO_WARNINGS #include #include #include char **allocateSpace(int len) { if (len <= 0) { return NULL; } char **temp = (char **)malloc(sizeof(char *)*len); if (temp == NULL)

qq_32742637的博客 1965
上一篇: 掌握这3种模式,轻松实现C语言多线程条件变量安全唤醒
下一篇: C语言联合体内存对齐真相曝光:3种场景下的最佳实践方案
ProceChat
博客等级 码龄1年 155粉丝 1997原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值