c语言指针

C++ Primer 有感(异常处理)

孤街浪徒 提交于 2019-12-29 05:22:52
1.异常是通过抛出对象而引发的。 该对象的类型决定应该激活哪个处理代码 。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。 2.执行throw的时候, 不会执行跟在 throw 后面的语句,而是将控制从 throw 转移到匹配的 catch ,该 catch 可以是同一函数中局部的 catch ,也可以在直接或间接调用发生异常的函数的另一个函数中。 控制从一个地方传到另一地方,这有两个重要含义: (1)沿着调用链的函数提早退出。 (2)一般而言,在处理异常的时候, 抛出异常的块中的局部存储不存在了。 因为在处理异常的时候会释放局部存储,所以被抛出的对象就不能再局部存储,而是用 throw 表达式初始化一个称为异常对象的特殊对象。 异常对象由编译器管理,而且保证驻留在可能被激活的任意catch都可以访问的空间。这个对象由throw创建,并被初始化为被抛出的表达式的副本。异常对象将传给对应的catch,并且在完全处理了异常之后撤销。(异常对象通过复制被抛出表达式的结果创建,该结果必须是可以复制的类型。) 3.当抛出一个表达式的时候, 被抛出对象的静态编译时类型决定异常对象的类型 。 4.用抛出表达式抛出静态类型时,比较麻烦的一种情况是,在抛出中对指针解引用。对指针解引用的结果是一个对象,其类型与指针的类型匹配。如果指针指向继承层次中的一种类型

C++异常处理

匆匆过客 提交于 2019-12-29 05:20:51
在C 语言中是没有异常处理机制的,异常处理是C++中的一个对程序运行出错或逻辑出错的一个处理机制,因为C++处理的问题比C语言处理的问题更为复杂,所以不能像C那样,总是假定程序能正常运行,不会发生错误。在C中要想处理程序运行中出现的错误,也只能够用if语句去逐个检查和判断。不幸当发生问题时,程序直接崩溃,没有提供出错信息,让人摸不着头脑。C++中的异常处理使我们能够将问题的检测和问题的解决分离,这样程序的问题检测部分可以不必了解如何处理问题。异常处理中,需要由问题检测部分招聘一个对象给处理代码,通过这个对象的类型和内容,两个部分能够就出现了什么错误进行通信,并向处理外部提供出错信息给用户或在程序中进行错误处理。 一、异常的抛出 1 、异常是通过抛出(throw )对象而引发的,例如,throw runtime_error("Date Error");。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。不存在数组或函数类型的异常,如果抛出一个数组,被抛出的对象转换为指向数组首元素的指针,如果抛出一个函数,函数被转换为指向该函数的指针。 2 、执行throw 的时候,不会执行跟在throw后面的语句,而是将控制从throw转移到匹配的catch,抛出的对象不是局部存储,而是用throw表达式初始化一个称为异常对象的特殊对象。抛出的异常通过栈展开,沿嵌套调用链继续向上

A Tour to LLVM IR

百般思念 提交于 2019-12-28 17:12:28
https://zhuanlan.zhihu.com/p/66793637 https://zhuanlan.zhihu.com/p/66909226 内容概要 什么是LLVM IR?如何得到IR? LLVM编译的流程,IR文件之间的链接简介 C++ name mangling的用途,“extern C"作用的极简介绍 IR文件的布局 IR中函数定义的结构,什么是BB,什么是CFG IR是一个强类型语言,如何用工具检查IR的合法性 如何理解 Language reference 常见的terminator instruction介绍 如何利用工具得到函数的CFG 什么是SSA?SSA的好处和问题,以及如何解决这个问题 参考文献 what is tail reursion make clang compile to ll -cc1的含义 clang和clang++的区别 what is a linkage unit? LLVM LanguageRef extern "C"的作用 what is name mangling what is static single assignment? what is reaching definition? 1. 什么是LLVM IR? LLVM IR 是 LLVM Intermediate Representation,它是一种 low

C++输入输出流

ぃ、小莉子 提交于 2019-12-27 07:21:14
输入输出流 1. 用控制符输出格式,例: 1 #include <iostream> 2 #include <iomanip>//利用控制符输出必须包含iomanip头文件 3 using namespace std; 4 int main() 5 {int a; 6 cout<<"input a:"; 7 cin>>a; 8 cout<<"dec:"<<dec<<a<<endl; //以十进制输出 9 cout<<"hex:"<<hex<<a<<endl; //十六进制 10 cout<<"oct:"<<setbase(8)<<a<<endl; //八进制 11 char *pt="China"; 12 cout<<setw(10)<<pt<<endl; //宽度为10,China前补上5个空格 13 cout<<setfill('*')<<setw(10)<<pt<<endl; //China前补上5个* 14 double pi=22.0/7.0; 15 cout<<setiosflags(ios::scientific)<<setprecision(8);//科学记数法,8位小数 16 cout<<"pi="<<pi<<endl; //输出pi 17 cout<<"pi="<<setprecision(4)<<pi<<endl; //改为4位小数 18 cout<<"pi=

深入理解C语言内存管理

北慕城南 提交于 2019-12-27 02:10:21
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。 问题不能拖,我这就来学习一下吧,争取一次搞定。 在任何程序设计环境及语言中,内存管理都十分重要。 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 int var1 = 1; 4 5 int main(void) { 6 int var2 = 2; 7 printf("hello, world!\n"); 8 exit(0); 9 } 经过gcc hello.c进行编译之后得到了名为a.out的可执行文件 [tuhooo@localhost leet_code]$ ls -al a.out -rwxrwxr-x. 1 tuhooo tuhooo 8592 Jul 22 20:40 a.out ls命令是查看文件的元数据信息 [tuhooo@localhost leet_code]$ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs),

指针

旧巷老猫 提交于 2019-12-26 18:20:53
前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以我想通过一篇文章来尽可能的讲解指针,以对得起这个文章的标题吧。 为什么需要指针? 指针解决了一些编程中基本的问题。 第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果, 但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有4字节或者8字节或者其他可能)。 第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。 第三,有些操作必须使用指针。如操作申请的堆内存。还有: C语言中的一切函数调用中,值传递都是“按值传递(pass by value)”的,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。 指针是什么? 我们指知道:C语言中的数组是指 一类 类型,数组具体区分为 int 类型数组,double类型数组,char数组 等等。同样指针 这个概念也泛指 一类 数据类型,int指针类型,double指针类型,char指针类型等等。

动态内存分配(new)和释放(delete)

北城余情 提交于 2019-12-26 11:01:30
在之前我们所写过的程序中,所必需的内存空间的大小都是在程序执行之前就已经确定了。但如果我们需要内存大小为一个变量,其数值只有在程序运行时 (runtime)才能确定,例如有些情况下我们需要根据用户输入来决定必需的内存空间,那么该怎么办呢? 答案是 动态内存分配 (dynamic memory),为此C++ 集成了操作符 new 和 delete 。 1. new 和 new [] 操作符 动态内存分配用操作符 new 。new 后面跟一个数据类型,如果要求的元素多于一个,需要加上 [], 元素数量放在 [] 中。它返回一个指向内存块开始位置的指针。语法是: pointer = new type pointer = new type [number_of_elements] 第一个表达式为数据类型为 ‘type’ 的 一个 元素分配内存地址。第二个表达式为数据类型为 ‘type’ 的 一组 元素分配一块内存,其中 number_of_elements 是整数型,表示元素的个数。例如: int* foo; foo = new int[5]; 在这个例子里,操作系统分配了可存储5个整型int元素的内存空间,返回指向这块空间开始位置的指针并将它赋给foo。因此,现在foo 指向一块可存储5个整型元素的合法的内存空间,如下图所示。 这里,foo 是一个指针,foo指向的第一个元素可以通过语句

void,extern,sizeof

左心房为你撑大大i 提交于 2019-12-25 18:33:37
高手潜规则:禁用 goto 程序质量与 goto 出现次数成反比 void 指针的意义 1.C 语言规定只有相同类型的指针才可以相互赋值 2.void* 指针作为坐值用于“接收”任意类型的指针 3.void* 指针作为右值赋给其它指针时需要强制转换类型。 int *pI = (int*)malloc(sizeof(int)); extern 的意义 1. 用于声明外部定义的变量和函数 2. 用于 “告诉”编译器用 C 方式编译 C++ 编译器和一些变种 C 编译器默认会按自己的方式编译函数和变量,所以有事需要 extern 关键字。 extrn “C” { int f(int a,int b) { return a+b; } } sizeof 是编译器内置指示符,不是函数。 用法: 用了统一, sizeof(int) ,不推荐用空格。 来源: https://www.cnblogs.com/stm32f4/p/6264765.html

指针二三事

痴心易碎 提交于 2019-12-25 13:43:21
C 语言中最棘手问题的当属指针了,不过这也是 C 的精华所在。 指针也是一种变量,区别在于他的值是一个内存地址。 32 位机器上,指针变量占用四个字节。往往你觉得你把指针弄的很透彻了,但你还是会做错题目,或许因为粗心,或许自己混淆了,总之指针问题真的很绕。最近笔者在看「程序员求职成功之路」,书中伊始讲的就是 C 语言指针,看完之后获益匪浅,特在此总结一下。 1. 先看一道经典的指针题目: #include <stdio.h> int main() { int a[5][10]; printf("%d,%d,%d\n",a,a+1,&a+1); return 0; }    输出结果为如下,试分析其原因 原因分析: a 和 &a 都是数组 a[5][10] 的首地址。但是他们的类型却不相同, a 是 int a [10] 的类型,而 &a 是 a [5][10] 的类型。指针运算中加减 1 代表的加减了指针类型的长度。故: a+1=2293360+4*10=2293400 &a +1= 2293360 +4*10*5=2293560 更抽象的说,例如数组 int a [M1][M2][.....][M n ] a+1= 首地址 +M2*M3* ......*Mn*sizeof(int) &a+1= 首地址 +M1*M2* M3*......* Mn *sizeof(int) 2.

指针二三事

瘦欲@ 提交于 2019-12-25 13:43:07
C 语言中最棘手问题的当属指针了,不过这也是 C 的精华所在。 指针是一种 数据类型 ,区别在于指针类型的值是一个内存地址。 32 位机器上,指针变量占用四个字节。往往你觉得你把指针弄的很透彻了,但你还是会做错题目,或许因为粗心,或许自己混淆了,总之指针问题真的很绕。最近笔者在看「程序员求职成功之路」,书中伊始讲的就是 C 语言指针,看完之后获益匪浅,特在此总结一下。 1. 先看一道经典的指针题目: #include <stdio.h> int main() { int a[5][10]; printf("%u,%u,%u\n",a,a+1,&a+1); return 0; }    输出结果为如下,试分析其原因 原因分析: a 和 &a 都是数组 a[5][10] 的首地址。但是他们的类型却不相同, a 是 int a [10] 的类型,而 &a 是 a [5][10] 的类型。指针运算中加减 1 代表的加减了指针类型的长度。故: a+1=2293360+4*10=2293400 &a +1= 2293360 +4*10*5=2293560 更抽象的说,例如数组 int a [M1][M2][.....][M n ] a+1= 首地址 +M2*M3* ......*Mn*sizeof(int) &a+1= 首地址 +M1*M2* M3*......* Mn *sizeof(int