天天看点

c语言eof_C语言持续深耕

1、指针和数组变量的区别

#include 
           

输出:

output:

    15
    8
    0x7fff5ab94af5
    0x7fff5ab94af5
    0x7fff5ab94af5
    0x7fff5ab94ae8
           
  • printf("%pn", s); 与 printf("%pn", t); 相同可以看出 数组变量可以被当做指针使用 ,并指向数组在存储器中的 起始地址
  • 对于sizeof运算,当参数为数组变量时,会自动计算对应的数组长度而非指针长度(其实就是这个数据类型所占的字节大小)。
  • 对于数组变量取地址仍然为数组的起始地址:&s == s ==&s[0] 值相同但含义不同
  • 数组变量不能指向其他地方(数组名是个常量),但创建指针变量的时候计算机会为它分配存储空间。实际上计算机只会为数组分配存储空间, 但不会为数组变量分配任何存储空间 ,编译器会在数组变量出现的地方将它替换成数组的起始地址。

2、C语言中指针+1运算

好文:详解:C语言中的指针和p, p+1, *(p+1), *P+1, p[0], &p[0] 的含义

注意:*p++ //先解引用,然后p的地址自增(与P指向的对象无关)

注意:p=NULL 和p=0 或 p='0' 等价

3、二维数组

二维数组可以形象的看作为用行指针、列指针来操作

行指针前+* = 列指针

列指针前+& = 行指针

p[n] == *(p+n)

p[n][m] == *( *(p+n)+ m )

4、C语言函数不定参数实现方式

好文:C语言函数不定参数实现方式

5、const关键字

#include
           

6、字节对齐

//字节对齐 原则;
           

好文:#pragma pack()用法详解

7、大小端问题 Little-Endian Big-Endian

//大小端 + 联合体
           

好文:C语言之大小端详解_C/C++_qq_39412582的博客-CSDN博客

8、文件操作

文件操作

r 可读权限 文件必须存在 若不存在打开失败报错

r+ 可读可写权限 文件必须存在 若文件不存在打开失败报错

w 可写权限 不允许文件读出 若文件不存在 创建文件

w+ 可读可写文件 若文件不存在 创建文件

a 以附加方式打开可写的文件 若文件存在 则会在文件末尾进行数据写入 若文件不存在 创建文件

a+ 以附加方式打开可读可写的文件 若文件存在 则会在文件末尾进行数据写入 若文件不存在 创建文件

//文件操作 注意在同一个文件中不要同时进行读写操作(文件在读写时候文件流会移动)
           

好文:C语言文件读写操作总结 - home普通的人 - 博客园

9、段错误快速定位

1、 编译时gcc 1.c -g ,后边加上-g

2、 运行时./a.out,产生段错误时会自动生成core.xxxx的文件

(若没有产生这个文件,则在命令行输入ulimit -c umlimited,重新编译运行)

3、 用gdb调试 gdb a.out core.xxxx

4、 输入where查看详细信息,既可以定位段错误的位置

10、++i、i++

++i 先运算,再显示值

i++ 先显示,再运算

11、程序的终止及atexit函数详解

好文:程序的终止及atexit函数详解_C/C++_honeyJ-CSDN博客

12、三目运算

好文:三目运算符详解 - 鸿燕藏锋 - 博客园

对上文中第7点不甚了解,看不出来区别

13、指针

好文:C语言指针详解 - lulipro - 博客园

指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。

为什么需要指针?

第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。

第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。

第三,有些操作必须使用指针。如操作申请的堆内存。

第四,C语言中的一切函数调用中,实参传递给形参的机理都是“按值传递(pass by value)”的,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。

//1) 一个有10个指针的数组,该指针是指向一个整型数的;
           

14、类型限定符

好文:C语言类型限定符

15、函数指针

#include 
           

16、数组指针array pointer 指针数组 pointer array

int 
           

指针数组(也就是元素为指针类型的数组)常常作为二维数组的一种便捷替代方式。一般情况下,这种数组中的指针会指向动态分配的内存区域。

//例如,如果需要处理字符串,可以将它们存储在一个二维数组中,
           

17、 动态内存分配

两个内存分配函数 malloc()和 calloc()的参数不一样:

void*malloc(size_t size);
           

函数 malloc()分配连续的内存区域,其大小不小于 size。当程序通过 malloc()获得内存区域时,内存中的内容尚未决定。

void*calloc(size_t count,size_t size);
           

函数 calloc()分配一块内存区域,其大小至少是 count_size。换句话说,上述语句分配的空间应足够容纳一个具有 count 个元素的数组,每个元素占用 size 个字节。而且,calloc()会把内存中每个字节都初始化为 0。

18、应用

好文:C语言中引用的用法_C/C++_小米mm修仙路-CSDN博客

指针和引用的区别

相同点:

1)都是地址的概念,指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。

区别:

1)指针是一个实体,而引用仅是个别名;

2)引用使用时无需解引用(*),指针需要解引用;

3)引用只能在定义时被初始化一次,之后不可变;指针可变;

5)引用不能为空,指针可以为空;

6)“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;

7)指针和引用的自增(++)运算意义不一样;

8)从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

19、 C语言编译

四个步骤

一、预处理阶段

展开头文件,宏替换,条件编译,去掉注释

二、编译阶段

检查语法错误,生成汇编代码

三、汇编阶段

把汇编代码转换成二进制机器码

四、链接阶段

将所有机器码链接在一起,生成可执行程序

20、 判断float类型数据与某个值是否相等

float类型数据的比较我们不能使用"=="、"!="等确定性的判别,必选要转换为">="、"<="等判别式

例如:判别float a是否为0

#include
           

21、链表

好文:【链表】链表常见笔试题和面试题(C语言)_C/C++_HongKnight的博客-CSDN博客

好文:数组和链表的区别浅析_网络_我的博客-CSDN博客

好文:判断一个链表是不是循环链表 - xshang - 博客园

22、为什么在定义结构体时成员变量不能赋初值?

TODO

22、声明和定义的区别?

TODO

23、回调函数深入理解

好文:回调函数(callback)是什么?