c语言基础
文章平均质量分 86
wwwlyj123321
这个作者很懒,什么都没留下…
展开
-
c语言之——指针数组与数组指针
一、指针数组和数组指针的定义1. 指针数组:是指一个数组里面装着指针,也即指针数组是一个数组;定义形式:int *a[10];如图所示:2. 数组指针:是指一个指向数组的指针,它其实还是一个指针,只不过是指向数组而已;定义形式:int (*p)[10]; 其中,由于[]的优先级高于*,所以必须添加(*p).区分方法:主要看后面的两个字是什么(前面是修饰作用),因此指针数组是数组,而数组指针是指针。二、指针数组和数组指针的使用ref:https://...原创 2021-04-07 11:09:04 · 13761 阅读 · 8 评论 -
c语言之——指针与二维数组
一、数组的行优先和列优先对于二维数组,有行优先顺序和列优先顺序两种不同的存储方式。由于计算机内存是一维的,多维数组的元素应排成线性序列后存人存储器。数组一般不做插入和删除操作,即结构中元素个数和元素间关系不变化。一般采用顺序存储方法表示数组。这两种方式在数学上的直观描述如下,给定如下矩阵:根据行优先的原则,其排序方式为根据列优先的原则,其排序方式为行优先或者列优先没有好坏,但其直接涉及到对内存中数据的最佳存储访问方式。因为在内存使用上,程序访问的内存地址之间连续性越好,程序原创 2021-03-24 20:24:56 · 4450 阅读 · 0 评论 -
C语言__attribute__的使用
ref:https://www.jianshu.com/p/e2dfccc32c80https://blog.csdn.net/weaiken/article/details/88085360https://blog.csdn.net/qlexcel/article/details/92656797https://www.cnblogs.com/embedded-linux/p/5801999.html原创 2020-09-09 20:42:32 · 6336 阅读 · 0 评论 -
c语言 __attribute__(at(绝对地址))的使用
__attribute__(at(绝对地址))的作用就是绝对定位。一般我们的变量都存在于内部SRAM中,在使用该语句能够将变量定义到对应地址的flash或者ram中,具体定义方式如下:const u16 gFlashDefValue[512] __attribute__((at(0x0800F000))) = {0x1111,0x1111,0x1111,0x0111,0x0111,0x0111};u8 USART2_RX_BUF[USART2_REC_LEN] __attribute__ ((原创 2020-09-09 20:40:22 · 4568 阅读 · 0 评论 -
C语言分配n字节对齐内存地址
需求:分配一段长度为BUFFER_SIZE个字节的内存,首地址要求n字节对齐分析:这个问题的关键是要求首地址按照n字节对齐。为了方便分析,我们以8字节对齐为例也就是当初始首地址给定为(0,8]之间,我们要将首地址调整到8字节处;当初始首地址在(8,16]之间,我们要将首地址调整到16字节处.....依此类推。总而言之,就是右对齐,与内存地址的增长方向相同。方案:为了确定首地址,封装了一个宏,如下:#define ADDR_ALIGN_BASE 8#def.原创 2020-08-11 14:46:04 · 1608 阅读 · 0 评论 -
__builtin_expect函数解析
1.引言在很多源码如Linux内核、Glib等,我们都能看到likely()和unlikely()这两个宏,通常定义如下:#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)可以看出这2个宏都是使用函数__builtin_expect()实现的,__builtin_expect()函数是GCC的一个内建函数(build-in function)...原创 2020-08-10 10:39:05 · 4958 阅读 · 1 评论 -
do{...}while(0)语句在宏定义的妙用
在linux内核中常常会看到do{} while(0)这样的语句,do{} while(0)内的语句只能执行一次,那么加不加do{} while(0)有什么区别呢?或者说加了do{} while(0)语句有什么作用呢?1.帮助定义复杂的宏以避免错误举例来说,假设你需要定义这样一个宏:#define DOSOMETHING() foo1(); foo2();这个宏的本意是,当调用DOSOMETHING()时,函数foo1()和foo2()都会被调用。但是如果你在调用的时候这么写:if(转载 2020-08-08 15:39:01 · 705 阅读 · 0 评论 -
C语言之——void和NULL
一、void(1)void用于函数声明没有返回值的函数,其类型为 voidvoid perror( const char * );参数列表中的关键字 void 表示该函数没有参数FILE *tmpfile( void );(2)指向void的指针void类型的正确的含义是:不知道类型,不确定类型,还没确定类型。一个 void* 类型的指针代表了对象的地址,但...原创 2019-08-28 20:01:27 · 1048 阅读 · 0 评论 -
C语言之——关键字
一、相关概念主要解释存储类关键字(auto static extern register)和类型限定、修饰关键字(const volatile restrict inline)等。在介绍之前,阐述几个相关概念:1、存储类(1)存储类就是就是描述C语言变量在何种地方存储,即栈、堆、数据段、bss段、.text段等。2、作用域(1)作用域是描述这个变量起作用的代码范围。(...原创 2019-08-28 10:31:19 · 529 阅读 · 0 评论 -
C语言之——公用体(联合体)
一、共用体概述共用体是一种自定义数据类型,它的定义格式为:union 共用体名{ 成员列表};结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响; 共用体的所有成员共享同一段内存,同一时间只能储存其中一个数据成员,共用体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足两个条件:1)大小足够容纳最宽的成员;2)大小能被其包含...原创 2019-08-27 14:52:02 · 1229 阅读 · 0 评论 -
C语言之——结构体(二)
一、结构体的对齐访问总体上遵循两个原则:(1)、整体空间是占用空间最大的成员(的类型)所占字节数的整数倍;(2)、数据对齐原则---内存按结构体成员的先后顺序排列,当排到该成员时,其前面已摆放的空间大小必须是该成员类型大小的整数倍,如果不够则补齐,依次向后类推。(变量声明的顺序也可能影响内存的分配方式)我们举个栗子:某台机器是32位,即这个机器...原创 2019-08-25 22:01:06 · 496 阅读 · 0 评论 -
C语言之——链表(二)
一、单链表的局限性(1) 单链表各个节点之间只由一个指针单向链接,这样实现有一些局限性。局限性主要体现在单链表只能经由指针单向移动(一旦指针移动过某个节点就无法再回来,如果要再次操作这个节点除非从头指针开始再次遍历一次),因此单链表的单向移动性导致我们在操作单链表时,当前节点只能向后移动不能向前移动,因此不自由,不利于解决更复杂的算法。(2) 解决思路:双向链表的节点 = 有效数据 +...原创 2019-09-09 17:32:13 · 431 阅读 · 0 评论 -
c语言之——指针(一)
一、指针是什么?指针的实质就是个变量,指针完整的名字应该叫指针变量,简称为指针。指针变量是用来存放内存地址的。二、如何使用指针?1.定义指针变量int *p;//p是个变量名字, int * 表示该p变量只能存储int类型变量的地址2.关联指针变量int i = 10;p = &i;//关联指针变量将整形变量i的地址赋值给指针变量p,我们称作p指向i;...原创 2019-08-22 17:06:55 · 248 阅读 · 0 评论 -
C语言之——sizeof()和strlen()函数
一、sizeof()sizeof 既是一个关键字,还是一个运算符。而不是一个函数。sizeof的作用周期是编译阶段。sizeof的作用是用来返回()里面对象占用的内存字节数。其计算对象类型可以为数据类型、变量、函数、数组、指针等ref:https://www.cnblogs.com/kangjianwei101/p/5219984.html二、strlen()函数strle...原创 2019-08-23 11:53:40 · 766 阅读 · 0 评论 -
c语言之——结构体(一)
一、什么是结构体结构体(struct)是由一系列具有相同或不同类型的数据构成的数据集合,是一种特殊的数据类型。区别与数组的是,数组内部是相同类型的数据。二、如何使用结构体#include<stdio.h> //定义一种数据类型struct Student{ int sid; char name[200]; int age;}; //分号不能省 int...原创 2019-08-23 15:28:02 · 327 阅读 · 0 评论 -
c语言之——const关键字
一、简介(1)const关键字,在C语言中用来修饰变量,表示这个变量不可更改。我们可能首先想到的是经过它修饰的变量便是常量了。其实我们这种想法是错误的,其实const修饰的变量是只读的,其本质还是变量。它只是告诉编译器该变量不能出现在赋值符号的左边。那么,const修饰的变量真的不能修改吗?我么看如下代码#include <stdio.h>int main(v...原创 2019-08-23 16:40:33 · 391 阅读 · 0 评论 -
c语言之——指针(二)
一、函数指针1.什么是函数指针(1)函数指针的实质还是指针变量,与数组指针、普通指针之间并没有本质区别。(2)如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址函数指针的定义方式为:函数返回值类型 (* 指针变量名) (函数参数列表);但是这里需要注意的是:“(*指针变量名...原创 2019-08-23 20:00:27 · 414 阅读 · 0 评论 -
C语言之——字符串
一、C语言没有原生字符串类型(1)很多高级语言像java、C#等就有字符串类型,有个String来表示字符串,用法和int这些很像,可以String s1 = "linux";来定义字符串类型的变量。(2)C语言没有String类型,C语言中的字符串是通过字符指针来间接实现的。二、C语言使用指针来管理字符串(1)C语言中定义字符串方法:char *p = "linux";此时p就叫...原创 2019-08-25 20:46:52 · 261 阅读 · 0 评论 -
C语言之——链表(一)
一、什么是链表?要想搞懂链表,要从数组的两个缺陷谈起。数组有两个缺陷:初始化时要规定长度,且一旦确定后期不能更改;数组的元素的数据类型必须一致。为了克服第二个缺陷,我们发明了结构体;为了克服第一种缺陷,我们发明了链表。我们可以这样理解:链表就是一个元素个数可以实时变大/变小的数组。链表就是用锁链连接起来的表。这里的表指的是一个一个的节点,节点中有一些内存可以用来存储数据,叫做数据域,一些内...原创 2019-09-07 18:32:48 · 257 阅读 · 0 评论