热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C基础笔记一

内存分区1、数据类型基本概念类型是对数据的抽象;类型相同的数据具有相同的表示形式、存储格式以及相关操作;数据类型可以理解为创建变量的模具:固定大小内存的别名;1.1、数据类型

 

内存分区

1、数据类型基本概念

类型是对数据的抽象; 类型相同的数据具有相同的表示形式、存储格式以及相关操作; 数据类型可以理解为创建变量的模具: 固定大小内存的别名;

1.1、数据类型的别名

typedef unsigned int u64;typedef struct _PERSON{ char name[32]; int age;}Person;void example(){  u64 val; //相当于 unsigned int val;  Person person; //相当于 struct PERSON_person;}

1.2、void类型

void是”无类型”,void* 无类型指针,无类型指针可以指向任何类型的数据。

//1. void修饰函数参数和函数返回void example1(void){  printf("charles");}//2. void* 可以指向任何类型的数据,被称为万能指针void example2(){ int x = 10; void* p = NULL; p = &x;  printf("x:%d\n",*(int*)p);}//3. void* 常用于数据类型的封装void example3(){  void * memcpy(void * _Dst, const void * _Src, size_t _Size);}

1.3、void类型

sizeof为某一特定数据或者某一个类型的数据在内存中分配空间时分配的大小(字节为单位)。sizeof返回的占用空间大小是为这个变量开辟的大小,而不只是它用到的空间。

对数组名用sizeof返回的是整个数组的大小,而对指针变量进行操作的时候返回的则是指针变量本身所占得空间。而且当数组名作为函数参数时,在函数内部,形参也就是个指针,所以不再返回数组的大小。

//1. sizeofvoid example1(){ int a = 10; printf("len:%d\n", sizeof(a)); printf("len:%d\n", sizeof(int)); printf("len:%d\n", sizeof a);}//2. sizeof 数组void Array(int arr[]){  printf("Array arr size:%d\n",sizeof(arr));}//数组名在某些情况下等价于指针 int arr[] = { 10, 20, 30, 40, 50 }; int* pArr = arr; printf("arr[2]:%d\n",pArr[2]);  printf("array size: %d\n", sizeof(pArr));

2、内存分区

1 预处理:宏定义展开、头文件展开、条件编译,这里并不会检查语法

2 编译:检查语法,将预处理后文件编译生成汇编文件

3 汇编:将汇编文件生成目标文件(二进制文件)

 4 链接:将目标文件链接为可执行程序

内存分区:代码区(text)、数据区(data)和未初始化数据区(bss)、堆区和栈区。

  代码区。存放 CPU 执行的机器指令。通常代码区是可共享的,其目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。

 全局初始化数据区/静态数据区(data段)。该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量)和常量数据(如字符串常量)。

  未初始化数据区(bss区)。该区存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为 0 或者NULL。

栈区(stack)。栈是一种先进后出的内存结构,由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放。

堆区(heap)。堆是一个大容器,用于动态内存分配。堆在内存中位于BSS区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

 2.1、栈区和堆区

栈区主要存放函数的参数以及局部变量。在函数完成执行,系统自行释放栈区内存。栈保存一个函数调用所需要维护的信息,这通常被称为堆栈帧;一个函数调用过程所需要的信息一般包括以下几个方面:函数参数、函数返回地址、临时变量等。

void example1(){ int a = 10;  int b = 20; printf("a = %d\n", &a);  printf("b = %d\n", &b); //a的地址大于b的地址,故而生长方向向下}

堆区由程序员手动申请,手动释放,若不手动释放,程序结束后由系统回收,生命周期是整个程序运行期间。使用malloc或者new进行堆的申请。

char* func(){ char* str = malloc(100); strcpy(str, "charles!"); printf("%s\n",str); return str;}void example1(){ char* p = NULL; p = func(); printf("%s\n",p);}

2.2、全局、静态区

全局静态区内的变量在编译阶段已经分配好内存空间并初始化。这块内存在程序运行期间一直存在,它主要存储全局变量、静态变量和常量。

1、静态存储区内的变量若不显示初始化,则编译器会自动以默认的方式进行初始化。

2、全局静态存储区内的常量分为常变量和字符串常量。静态存储区内的常变量是全局变量,与局部常变量不同,区别在于局部常变量存放于栈,实际可间接通过指针或者引用进行修改,而全局常变量存放于静态常量区则不可以间接修改;字符串常量存储在全局/静态存储区的常量区。

位运算

3、位运算基础

3.1、按位取反

一元运算符~将每个1变为0,将每个0变为1。

unsigned char a = 2; //00000010unsigned char b = ~a; //11111101printf("ret = %d\n", a); //ret = 2printf("ret = %d\n", b); //ret = 253

3.2、按位与

对于每个位,只有两个操作数的对应位都是1时结果才为1,否则为0。

(10010011)  & (00111101) //(00010001)

3.3、按位或

对于每个位,如果其中任意操作数中对应的位为1,那么结果位就为1。

(10010011)| (00111101)//(10111111)

3.4、按位异或

二进制运算符^对两个操作数逐位进行比较。两数相同为0,相反为1。

(10010011)^ (00111101)//10101110)

两数之间的交换可以用异或实现。如

int a = 10; int b = 30;a ^ b = temp;a ^ temp = b;b ^ temp = a

3.5、左移

左移运算符<<将其左侧操作数的值的每位向左移动&#xff0c;移动的位数由其右侧操作数指定。左移一位相当于原值*2

(10001010) <<2//(00101000)2 <<1 &#61; 4;4 <<1 &#61; 8;8 << 2 &#61; 32

3.6、右移

右移运算符>>将其左侧的操作数的值每位向右移动&#xff0c;移动的位数由其右侧的操作数指定。左移一位相当于原值/2

(10001010) >> 2//(00100010)    

number  <

number乘以2的n次幂

number  >> n

如果number非负&#xff0c;则用number除以2的n次幂

 


推荐阅读
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
恋是一种潮流
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有