- 博客(22)
- 收藏
- 关注
转载 C之二级指针
1 一级指针每8个bit,也就是1个字节,对应一个地址,也就是地址的最小单位是字节。一级指针指向的内容一定是一个“地址”,而不是普通变量。int a = 10;int *p1;p1 = &a;上面的代码,我们没有在定义*p1的时候直接初始化赋值,而是在 下一行进行赋值,这说明了一个容易忽略的细节,那就是:一级指针本身p1本身也是一个变量,它跟 a 是 一样的,只不过指向的内容不同而已,a指向的是一个具体的值,而p1则是指向a的内存地址。我们对p1的赋值和各种其他操作(不带*),都是伴
2020-11-18 10:36:26 406
原创 C之指针函数和函数指针
1 指针函数和函数指针指针函数----它是一个“函数”,返回值是一个 指针,也可以理解成是一个 内存地址。函数指针----它是一个“指针”,指向一个函数,这种函数指针在编程中用的比较多,因为指针是可以改变赋值指向的,相当于可以实现多映射,玩法儿就灵活了。辨别指针函数和函数指针,最简单的方式就是看函数名前面的指针*有没有被括号()包含,如果没有被包含,它就是一个指针函数,包含了,他就是一个函数指针。2 指针函数函数名前面的*没有被包含,函数返回类型是某一类型的指针,如下图所示:int *f(x,y
2020-11-17 09:30:46 174
原创 C语言之volatile、static、const、extern
C语言之volatile、static、const、extern1.volatile1.1 volatile基本含义volatile是一个类型修饰符(type specifier),是被设计用来修饰被不同线程访问和修改的变量;volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接到内存中读值。volatile防止代码被编译器优化,例如:a=1;a=2;a=3;编译器会进行优化,优化为只有a=3(即忽略前三条语句,只产生一条机器代码);如果键入volat
2020-11-16 21:13:46 1289 1
原创 剑指Offer--链表-从尾到头打印链表C
1.链表链表是一种动态数据结构。常见的面试题:单向链表、从尾到头打印链表、删除链表的节点、链表中倒数第K个节点、反转链表、合并两个排序的链表、两个链表的第一个公共节点等
2020-11-16 11:32:11 102
原创 剑指offer---基础知识:数组
1.sizeof关键字1.1 定义一个空的类型,里面没有任何成员变量和成员函数,对该类型求sizeof,得到的结果是多少?答案:1解析:空类型的实例中不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。Visual Studio中每个空类型的实例占用1字节的空间。1.2 如果在该类型中添加一个构造函数和析构函数,再对该类型求sizeof得到的结果又是多少?答案:1解析:调用构造函数和
2020-10-22 09:46:47 127
原创 va_start和va_end
1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(…);void foo(parm_list,…);2.函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈。首先是参数的内存存放格式:参数存放在内存的堆栈段中,在执行函数的时候,从最后一个开始入栈。因此栈底高地址,栈顶低地址,举个例子如下:void func(int x, float y, char z);那么,调用函数的时候,实参 char z 先进栈,然后是 float y,最
2020-09-04 19:36:09 94 1
原创 剑指offer---面试流程
1.面试遇到难题解决复杂问题的三种办法:1.画图能使抽象问题形象化2.举例使抽象问题具体化3.分解使复杂问题简单化在编写程序之前,要多想,优化时间效率和内存空间。
2020-08-28 12:51:21 81
原创 C陷阱与缺陷---语法陷阱和ASCII
1.运算符优先级运算符结合性() [] -> .自左向右! ~ ++ – (type) * & sizeof自右向左* / %自左向右+ -自左向右<< >>自左向右< <= > >=自左向右== !=自左向右&自左向右或自左向右&&自左向右或自左向右?:自右向左assignments自右向左,自
2020-08-20 11:31:35 177
原创 C和指针---ADT:链表、堆栈、队列和树
1.内存分配ADT如何获取内存来存储值?三种方案:静态数组、动态分配的数组和动态分配的链式结构。静态数组要求结构的长度固定,而且长度必须在编译时确定,方案简单,最不容易出错动态数组,可在运行中决定数组长度,链式结构提供最大程度的灵活性,每个元素在需要时才单独进行分配,除了不能超过机器的可用内存之外,这种方式对元素的数量几乎没有什么限制,但链式结构的链接字段需要消耗一定的内存。2.堆栈堆栈(stack)最鲜明的特点是其后进先出的方式2.1 堆栈接口基本的堆栈操作通常被称为push和pop。pu
2020-08-17 11:45:40 169
原创 C和指针---标准函数库
1.整型函数1.1 算术int abs(int j);long int labs(long int j);long long int llabs(long long int j);abs:获取整数(int类型)的绝值。(若参数的结果不能用一个整型表示,这个行为是未定义的)labs:获取长整数(long类型)的绝值。llabs:获取长长整数(long long类型)的绝值。div_t div(int numer, int denom) 把 numer(分子)除以 denom(分母)该函数返回
2020-08-13 08:27:17 190
原创 C和指针---输入/输出函数
1.二进制I/O1.1 fread/fwrite把数据写到文件效率最高的方法是用二进制形式写入。size_t fread(voidbuffer,size_t size,size_t count,FILEstream);头文件:#include<stdio.h>功能:是用于读取二进制数据成功:是实际读取的元素(并非字节)数目失败:返回0size_t fwrite(voidbuffer,size_ size,size_t count,FILEstream)功能:是用于写入二进制数据
2020-08-12 08:41:40 137
原创 C和指针---预处理器
1.#define1.1 宏宏:允许把参数替换到文本中。所有对数值进行求值的宏定义都应该用这种方式加上括号的方式,避免在使用宏时,由于参数中的操作符或邻近的操作符之间不可预料的相互作用。1.2 宏与函数经常用到的比较大小的,可以定义为宏,不用函数来完成。两个原因:用于调用和从函数返回的代码很可能比实际执行这个小型计算的工作代码更大;函数的参数必须声明为一个特定的类型,而宏是与类型无关的。宏与函数的不同之处:代码长度:宏每次使用时,宏代码都被插入到程序中,除非非常小的宏之外,程序的长度将大幅增长
2020-08-11 22:09:49 150
原创 C和指针---使用结构和指针
1.链表链表(linked list)就一些包含数据的独立数据结构(通常称为节点)的集合。链表中的每个节点通过链或指针连接在一起,程序通过指针访问链表中的节点,通常节点是动态分配的。2.单链表在单链表中,每个节点包含一个指向链表下一个节点的指针,链表最后一个节点的指针字段的值为NULL,提示链表后面不再有其他节点。为了记住链表的起始位置,可以使用一个根指针(root pointer),根指针指向链表的第1个节点。![在这里插入图片描述](https://img-blog.csdnimg.cn/20
2020-08-07 09:05:24 208
原创 C和指针---动态内存分配
1.malloc calloc reallocvoid malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。内存块的大小,以字节为单位。void calloc(unsigned int num,unsigned int size);功能:在内存的动态存储区中分配num个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。malloc与calloc的区别:后者在返回指向内存的指针之前把它初始化为0,calloc的参数包括所需元素
2020-08-07 07:56:44 108
原创 C和指针---结构和联合
1.结构聚合数据类型能够同时存储超过一个的单独数据。C提供了两种类型的聚合数据类型:数组和结构1.1 结构的自引用typedef struct {int a;SELF_REF *b;int c;} SELF_REF;这个声明里b是一个指针而不是结构2.联合联合的所有成员引用的是内存中的相同位置,当你想在不同的时刻把不同的东西存储于同一个位置,需要使用联合。union3.结构名和数组名区别数组名是有首个元素的地址,而定义结构体变量后,系统为其分配内存...
2020-08-06 11:22:22 98
原创 C和指针---字符串、字符和字节
1.不受限制的字符串函数1.1 复制字符串:原型声明:char strcpy(char dest, const char *src);头文件:#include <string.h> 和 #include <stdio.h>功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。1.2 连接字符串原型声明: char strcat(char dest, c
2020-08-06 08:49:17 128
原创 C和指针---数组
1.下标引用int array[10];int ap = array + 2;说明:ap[0]:C的下标引用和间接访问表达式是一样的, 对等的表达式是(ap + (0)),即array[2]ap+6:对等的表达式是array+8或&array[8]*(ap + 6):= array[8] = ap[6]ap[-1]:ap指向第3个元素,使用偏移量-1使我们得到它的前一个元素即array[1]2.指针的效率当根据某个固定数目的增量在一个数组中移动时,使用指针变量将比使用下标产生效率更
2020-08-05 22:22:15 192
原创 C和指针---指针
1.指针变量的内容int a = 112;float c = 3.14;int *d = &a;float *e = &c;表达式的值是:a的值是112,c的值是3.14,d的值是a的地址,e的值是c的地址,*d=112,*e=3.142.指针的指针int a = 12;int *b = &a;int **c = &b;*操作符具有从右向左的结合性,*c相当于(*c)表达式的值是:表达式相当的表达式a12b&a
2020-08-03 10:12:13 105
原创 C和指针---操作符和表达式
1.位操作符&与操作:如果两个位都是1,结果为1,否则为0;|或操作:如果两个位都是0, 结果为0,否则为1;∧异或:如果两个位不同,结果为1,如果两个位相同,结果为02.逻辑操作符逻辑操作符&&和||:用于对表达式求值,测试它们的值是真还是假。逻辑操作符具有短路性质,如果表达式的值根据左操作数便可决定,它就不再对右操作数进行求值,而位操作符两边的操作数都需要进行求值。逻辑操作符用于测试零值和非零值,而位操作符用于比较它们的操作数中对应的位3.条件和逗号操作符条件操
2020-08-02 18:02:35 110
原创 C和指针---语句
语句if语句、while语句、for语句、do语句、switch语句、goto语句switch语句:expression必须是整型值当你需要循环体至少执行一次时,使用do语句
2020-07-30 11:41:48 81
原创 C和指针---数据
C和指针—数据数据类型基本数据类型------整型、浮点型、指针和聚合类型(如数组和结构等)1.1.1 整型与浮点整型字面值:字面值(literal),例如:123等命名常量(声明为const的变量): 当它被初始化后,值不能改变枚举(enumerated)类型:它的值为符号常量而不是字面值类型浮点数:float(单精度)、double(双精度)、long double1.1.2 指针指针:把计算机内存比作一条长街上的一间间房子,每间房子都用唯一的号码进行标识。每个位置包含一个值。指针就是
2020-07-30 11:22:57 99
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人