直接使用c, 有个好处, 自己可以完全控制内存啊,一切脑海中记住内存及指针, 就很容易知道操作是怎样.
1. 分配一段内存, 这段内存使用什么样的指针操作, 那么对应就是多少字节的操作, 也就是说, 看你怎么去解释
这块内存了.
例如, 若分配给一个10个字节的类型, 如果用一个int类型的指针指向这块内存, 那么一次操作, 就是int的字节的大小, 如果一个struct指向这块内存, 那么一次操作就是针对这个struct的内存的大小, 如果是一个数组指向这块内存, 那么就是连续的这个数组的元素类型的字节了.
2. 怎么改变内存中指针的指向, 进行指针的加减就行了, 但是指针加减, 这个和指针的类型有关系的.
#include <stdio.h> #include <stdlib.h> typedef struct { int i; char c; } tag; int main(void) { tag *t = (tag *)malloc(20); tag *t2 = t+1; printf("%d\n", sizeof(tag)); printf("%p\n", t); printf("%p\n",t2); return EXIT_SUCCESS; }
上述代码的打印结果:
8
001A3D10
001A3D18
3. struct存在对齐问题, 所以上述示例的的struct的实际大小不是5, 而是8
4. 怎么实现变长数组? 示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int i; char c[0]; } tag; int main(void) { tag *t = (tag *)malloc(13); printf("%d\n", sizeof(tag)); t->i=4; memcpy(t->c,"hijimmee", 8); t->c[8]='\0'; printf("%s\n",t->c); free(t); return EXIT_SUCCESS; }
更具体的例子:
#include <stdlib.h> #include <stdio.h> typedef unsigned long cell; /* INSTANCE */ struct instanceStruct { // 这里的数组仅仅是占位, data[]数组不仅仅只有一个元素, 可以使用更大的index值来存取 // data[1]之后的元素值 union { cell *cellp; cell cell; } data[1]; }; struct instance { int num; int arr[2]; }; int main(void) { int size = sizeof(cell) * 3; printf("%d\n", size); printf("%lu\n", sizeof(instanceStruct)); instanceStruct *ins = (instanceStruct *) malloc(size); cell *c = (cell *)malloc(sizeof(cell)); ins->data[0].cell = 5; ins->data[1].cell = 15; ins->data[2].cell = 155; *c = 157; printf("%lu,%lu,%lu, %lu\n", ins->data[0].cell, ins->data[1].cell, ins->data[2].cell); printf("%d\n", sizeof(instance)); instance *s = (instance *) malloc(sizeof(instance) * 2); s->num = 1; s->arr[0] = 2; s->arr[1] = 3; instance *first = s; s++; s->num = 4; s->arr[1] = 5; s->arr[2] = 6; printf("%d, %d, %d\n", first->num, first->arr[0], first->arr[1]); printf("%d, %d, %d\n", s->num, s->arr[0], s->arr[1]); // 这里可以看到,实际上不管是否数组是否越界了,永远根据指针类型进行访问 printf("overflow access: %d\n", first->arr[2]); }
我64位的机器,输出结果如下:
24 8 5,15,155, 12 12 1, 2, 3 4, 13, 5 overflow access: 4
相关推荐
3. **指针**:指针是C语言的一大特色,它能存储内存地址,允许直接操作内存,提供了高效的数据操作方式。理解指针需要掌握指针的声明、初始化、解引用以及指针运算。 4. **数组与字符串**:数组是一组相同类型的...
### Java学习总结:C程序员的感悟 #### 第一章:Java入门(C与Java的差异) ##### 基本数据类型: Java的数据类型与C语言相比,在命名上有一定区别,例如整型在C中为`int`,而在Java中也为`int`,但Java的数据...
数据类型不仅决定了变量所占用的内存大小,还决定了变量的操作方式。 ##### 1. 基本数据类型 - **整型 (int)** - 用于存储整数值。 - **字符型 (char)** - 用于存储单个字符。 - **浮点型 (float/double)** - `...
- 指针是C语言的灵魂,它提供了直接访问内存地址的能力,使得动态内存管理和高效的数据操作成为可能。 - 指针与数组、结构体的结合使用,能够实现更灵活的数据结构,但也是学习中的一大难点。 6. **学习策略**: ...
因此,我们需要学习 C 语言的注意事项,例如指针和数组的区别、数组名和函数名的使用、结构体中的内存对齐、指针数组和数组指针的区别等。 学习 C 语言需要我们耐心、细心、实践和总结。只有通过大量的上机实践、多...
第1章 计算机,游戏,我 1 1.1 计算机 2 1.2 计算机游戏 3 1.3 计算机与我 7 1.3.1 启蒙 7 1.3.2 编程 9 第2章 算法,程序的灵魂 13 2.1 程序=算法+数据结构 14 2.1.1 算法 15 2.1.2 数据结构 17 2.2 搜索算法 23 ...
对于成绩的管理,可能需要使用链表或数组来存储大量的学生数据,这涉及到动态内存分配和数据结构的操作。 接着,系统需要有用户交互界面,通常以命令行菜单的形式呈现。这需要掌握控制台输入输出操作,如`printf`和...
正确管理内存对于编写高效、稳定的C程序至关重要。书中可能还提到了数组和字符串的操作,这些是C语言笔试和机试中经常考察的知识点。此外,数字运算符的使用也是编程中不可或缺的一部分,作者可能在书中对各种运算符...
在“C语言课程设计报告_我的心得体会”这个主题中,我们可以深入探讨C语言的基本概念、课程设计的关键要素以及个人在学习过程中的体验和感悟。C语言是一种基础且强大的编程语言,广泛应用于系统开发、嵌入式系统、...
如果数据存在,即发生缓存命中,那么就可以直接从内存中快速获取,避免了较慢的磁盘I/O操作。如果数据不在缓存中,系统会从块设备读取数据,并将其存入高速缓冲区,以备后续使用。对于写操作,高速缓冲区同样扮演...
通过实验掌握1-2种操作系统的界面,了解命令和调用的工作流程,深入理解操作系统的内部运作机制。目标是使学生能够熟练使用操作系统环境,掌握各种命令和功能,有效利用计算机资源。 #### 示例 以Windows和Linux/...
最后,可能还包括了C语言的标准化历程,如C89、C99、C11等标准的差异,以及如何遵循标准编写跨平台的C代码。这有助于读者编写出更规范、更具移植性的程序。 通过《C语言深度剖析》这本书,读者不仅可以全面掌握...
标题中的“2022年c语言的学习心得”表明了本文是关于学习C语言的个人体验和感悟,而“考试”标签则暗示了这可能是针对考试准备或技能考核的学习总结。主要内容提到了学习C语言的过程,包括遇到的问题、解决方法以及...
第1章 计算机,游戏,我 1 1.1 计算机 2 1.2 计算机游戏 3 1.3 计算机与我 7 1.3.1 启蒙 7 1.3.2 编程 9 第2章 算法,程序的灵魂 13 2.1 程序=算法+数据结构 14 2.1.1 算法 15 2.1.2 数据结构 17 2.2 搜索算法 23 ...
"Linux C语言学习感悟" 在 Linux 和 C 语言学习的过程中,我逐渐体验到了蜕变的重要性。从一开始的无知到现在的自信,都是一步步的成长。经历了指针、数组、链表、队列、树、IO 和网络编程等知识点的学习和实践,才...
读核感悟 文件操作 AIO操作的执行 66 1 在提交时执行AIO 66 2 在工作队列中执行AIO 66 3 负责AIO执行的核心函数aio run iocb 67 4 AIO操作的完成 67 读核感悟 文件读写 内核态是否支持非direct I O方式的AIO ...