分类 - C语言

2020-12-04 03:17:20    48    0    0

要再函数中改变外部指针的指向,必须将该指针的指针传入,如果只传入该指针,在函数中对指针指向修改并不会影响在外部该指针的值,和传入参数是局部变量道理相同。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "adt_def.h"
  4. Node *createStack()
  5. {
  6. Node *head = NULL;
  7. return head;
  8. }
  9. void printStack(Node * const head)
  10. {
  11. Node *stack = head;
  12. while (stack != NULL) {
  13. printf("elem = %d\n", stack->data);
  14. stack = stack->next;
  15. }
  16. }
  17. void pushStack(Node **head, ElemType e)
  18. {
  19. Node *newNode = (Node *)malloc(sizeof(Node));
  20. newNode->data = e;
  21. newNode->next = *head;
  22. *head = newNode;
  23. }
  24. int main(void)
  25. {
  26. Node *stack = createStack();
  27. pushStack(&stack, 4);
  28. pushStack(&stack, 99);
  29. pushStack(&stack, 22);
  30. printStack(stack);
  31. return 0;
  32. }
2020-06-03 15:34:08    73    0    0
  1. char strings[4][6] = {"hello", "Hello", "apple", "array"};
  2. printf("sizeof strings: %d, sizeof strings[0]: %d\n", sizeof(strings), sizeof(strings[0])); // 4 * 6 = 24, 6
  3. int arr[] = {1, 3, 6, 2, 3, 15, 4};
  4. printf("sizeof arr: %d\n", sizeof(arr)); // 7 * 4 = 28
2020-04-21 10:03:09    78    0    0
2020-04-21 09:48:11    71    0    0
2020-04-02 15:32:28    45    0    0
2020-03-26 00:45:51    53    0    0

作用


    • inline关键字用于修饰函数定义而非函数声明,即:
  1. inline void foo() //正确
  2. {
  3. ...
  4. }
  5. inline void foo(); //不正确
  6. void foo()
  7. {
  8. ...
  9. }

开启优化

  • 适用inline时,gcc必须使用-std=c99-O2参数才能使内联函数生效。
  1. $ gcc -std=c99 -S -O2 inlinetest.c
  • 开启inline支持前:
    title
  • 开启inline支持后:
    title
  • 可以看到开启inline支持后foo不再作为一个global标号。
  • 另外写一个externfoo.c:
  1. #include <stdio.h>
  2. int foo()
  3. {
  4. printf("external foo function\n");
  5. }
  • 如果不使用c99标准,就会报错foo有多个定义:
  1. $ gcc inlinetest.c externfoo.c
  2. /tmp/ccjb5QWS.o: In function `foo':
  3. externfoo.c:(.text+0x0): multiple definition of `foo'
  4. /tmp/cclrNVro.o:inlinetest.c:(.text+0x0): first defined here
  5. collect2: error: ld returned 1 exit status
  6. $ gcc -std=c99 inlinetest.c externfoo.c
  • 不能引入另一个文件中的inline函数,例如下面的情况编译会报错:
  1. $ cat foo.c
  2. #include <stdio.h>
  3. inline void foo();
  4. inline void foo()
  5. {
  6. printf("inline foo function in foo.c\n");
  7. }
  8. $ cat callfoo.c
  9. int main()
  10. {
  11. foo();
  12. }
  13. $ gcc -std=c99 callfoo.c foo.c
  14. /tmp/ccxnFA3n.o: In function `main':
  15. callfoo.c:(.text
2019-10-27 15:47:56    89    0    0

动态内存分配

malloc

malloc从内存池中提取一块合适的内存,并向该程序返回一个指向这块内存的指针。这块内存此时并没有以任何方式进行初始化。

  1. void *malloc( size_t size );

malloc的参数是需要分配的字节数,分配的是一块连续的内存。
对malloc返回的指针进行检查,确保它是非NULL。

free

  1. void free( void *pointer );

free的参数是之前从malloc、calloc或realloc返回的值,也可以是NULL(但没有任何效果)。

calloc

  1. void *calloc( size_t num_elements, size_t element_size );

malloc

2019-10-27 15:47:56    38    0    0
2019-10-27 15:47:56    52    0    0

Chapter 1: C语言起源与概述

起源

C语言最初是由丹尼斯.里奇在贝尔实验室为开发UNIX操作系统而设计的。C语言是以B语言为基础的。

设计目标

提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

跨平台特性

以一个标准规格写出的C语言程序可在许多电脑平台上编译,甚至包含一些嵌入式处理器以及超级电脑等作业平台。

C语言标准

ANSI C是由美国国家标准协会(ANSI)及国际标准化组织(ISO)推出的关于C语言的标准,用于避免各开发厂商用的C语言语法产生差异。
title
title

C语言能做什么

C语言常用于操作系统开发、嵌入式开发、数据库管理系统、语言编译器等。

优点

  • 高度可移植性:不改动或只做很小改动的情况下就可以把C语言的程序运行在不同平台。相对于汇编语言和机器代码,C语言以更抽象的的方式描述行为,不受限于特定CPU或指令集(不同CPU系列使用的指令集和编码格式不同)。
  • C语言很小:可以嵌入几乎所有现代微型处理器中,从冰箱到闹钟。
  • 学习其他语言的基础:几乎所有编程语言都由C实现,或者有和C语言相似的语法和逻辑规则,学会C语言可以很快地学会其他语言。

缺点

  • 运行时间:没有运行时间检查机制。
  • 面向过程:不支持面向对象编程,这也是创造C++的原因。
  • 不安全:指针是C语言的一大特色,可以说是C语言优于其他语言的一个重要原因,但也就是因为它有指针,可以进行靠近硬件的操作,所以带来很多不安全的因素。

C语言编译器

不同计算机使用不同的机器语言方案,C编译器负责把C代码翻译成特定的机器语言。此外,C编译器还将源代码与C库的代码合并成最终的程序(更准确地说是链接器,但大多数系统中编译器运行链接器)。编译器还会检查C语言程序是否有效,如果C编译器发现错误就不生成可执行文件并报错。
编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。一般C编译器把源代码转换为机器语言代码,并把结果放在目标代码文件中,虽然目标代码中包含机器语言代码,但是并不能直接运行该文件,因为目标文件中储存的是编译器翻译的源代码,并不是完整的程序。目

2019-10-27 15:47:56    101    0    0