c语言指针

Explicit 关键字和各种类型转换(转)

随声附和 提交于 2019-12-06 03:20:07
说实话,从来没有感觉到这个关键字有用,直到今天。 explicit的意思是明显的,和它相对应的一个词是implicit意思是隐藏的。 我参考了MSDN和《c++标准程序库》对这个关键字的描述,并参考了网络上对这个关键字的解释。现将它的使用方法和总结记录如下: 首先这个关键字只能用在类构造函数。 它的作用是不能进行隐式转换 。 class gxgExplicit //没有关键字explicit的类 { public: int _size; gxgExplicit (int size ) { _size = size; } }; 下面是调用 gxgExplicit gE1(24); //这样是没有问题的 gxgExplicit gE2 = 1; //这样也是没有问题的 gxgExplicit gE3; //这样是不行的,没有默认构造函数 gE1 = 2; //这样也是没有问题的 gE2 = 3; //这样也是没有问题的 gE2 = gE1; //这样也是没有问题的 但是假如gxgExplicit修改为Stack,我们的_size代表的是堆栈的大小,那么调用的第二句就显得不伦不类,而且容易让人疑惑。这并不是可以让代码阅读者明白和接受的形式,虽然它是合法的(编译器可以通过编译)。这是因为 编译器默认情况下有隐式转换的功能 ,你输入gE2 = 1就编译成同第一句相同的结果。所以

Go 语言入门(一)基础语法

怎甘沉沦 提交于 2019-12-06 00:21:19
写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于 A tour of Go 编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(一)基础语法 本地安装 Go 语言环境 关于如何安装 Go 语言的编程环境,我推荐大家看 这篇文章 编写 Hello, World 学习语言时,首先编写一个「Hello, World」已经成了程序员的习惯,这里我们也编写一个,顺便测试一下 Go语言环境是否搭建成功了: 首先创建一个名为 hello.go 的文件,编写代码如下: package main import "fmt" func main() { fmt.Printf("Hello, World\n") } 接着我们在命令行中使用 go 工具运行它: $ go run hello.go Hello, World 如果像上面一样看到了「Hello, World」信息,则表示我们已经迈出学习 Go 语言的第一步了。 关于更多 Go 语言的编程方法已经相应命令,我们可以看 这里 ,它为我们清楚地介绍了 Go 语言的环境变量等相关设置。 在都搭建完成之后,我们就可以进入 Go 语言的语法学习了。 包、变量和函数 学习 Go 语言语法之前,我们要知道他是在「C语言」的基础之上发展的,所以他们之间很多语法都是相似的。 包 声明包和导入包

2019 C/C++《阿里》面试题总结

∥☆過路亽.° 提交于 2019-12-05 23:33:38
一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 C++中struct和class除了默认访问权限外,别的功能几乎都相同。 二、关键字static、const、extern作用 static和const的作用在描述时主要从类内和类外两个方面去讲: static关键字的作用: (1)函数体内static变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; (2)在模块内的static全局变量和函数可以被模块内的函数访问,但不能被模块外其它函数访问; (3)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝; (4)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。 const关键字的作用: (1)阻止一个变量被改变 (2

PL真有意思(五):数据类型

喜你入骨 提交于 2019-12-05 20:13:15
前言 现在大多数程序设计语言中都有表达式和/或对象的类型概念。类型起着两种主要作用: 为许多操作提供了隐含的上下文信息,使程序员可以在许多情况下不必显示的描述这种上下文。比如int类型的两个对象相加就是整数相加、两个字符串类型的对象相加就是拼接字符串、在Java和C#中new object()隐含在背后的就是要分配内存返回对象的引用等等。 类型描述了其对象上一些合法的可以执行的操作集合。类型系统将不允许程序员去做一个字符和一个记录的加法。编译器可以使用这个合法的集合进行错误检查,好的类型系统能够在实践中捕获很多错误 类型系统 从编译方面的知识我们可以知道,计算机硬件可以按多种不同的方式去解释寄存器里的一组二进制位。处理器的不同功能单元可能把一组二进制位解释为指令、地址、字符、各种长度的整数或者浮点数等。当然,二进制位本身是无类型的,对存储器的哪些位置应该如何解释,大部分硬件也无任何保留信息。汇编语言由于仅仅是对一些二进制指令的“助记符号”翻译,它也是这种无类型情况。高级语言中则总是关联值与其类型,需要这种关联的一些原因和用途就如前面说到的上下文信息和错误检测。 一般来说,一个类型系统包含一种定义类型并将它们与特定的语言结构关联的机制;以及一些关于类型等价、类型相容、类型推理的规则。 必须具有类型的结构就是那些可以有值的,或者可以引用具有值得对象的结构

c语言:当指针成为参数后

血红的双手。 提交于 2019-12-05 19:29:35
指针就是一种指向内存地址的变量,利用它的一些特性我们可以完成很多工作 两个数字从小到大排序(引申的业务场景,对企业大佬的银行存款金额进行排序,这当然通过交换变量对应的数值来实现,否则盖茨大爷的钱可能全交换到我的账户下来,靠谱的做法是声明(或者说引入)指针变量,用来按照从小到大的顺序标的(指向)不同账户下的金额) #include<stdio.h> #include<stdlib.h> void main() { double *pa, *pb,*tmp; double a, b; printf("请输入两个数,排列其大小\n"); printf("输入金额1"); scanf_s("%lf",&a); printf("输入金额2"); scanf_s("%lf",&b); pa = &a; pb = &b; if (*pb < *pa) { tmp = pa; pa = pb; pb = tmp; } printf("从小到大顺序%f,%f",*pa,*pb); system("pause"); } 指针作为参数 #include<stdio.h> #include<stdlib.h> void arrayasparam(int a[10]) { printf("\n数组作为参数的大小%d", sizeof(a[10])); //输出的值为4,这可以算是以形式参数传值的一个特例:a

static_cast和dynamic_cast详解

一笑奈何 提交于 2019-12-05 19:13:41
注:从图中可以看出,派生类不仅有自己的方法和属性,同时它还包括从父类继承来的方法和属性。当我们从派生类向基类转换时,不管用传统的c语言还是c++转换方式都可以百分百转换成功。但是可怕是向下转换类型,也就是我们从基类向派生类转换,当我们采用传统的C语言和c++转换时,就会出现意想不到的情况,因为转换后派生类自己的方法和属性丢失了,一旦我们去调用派生类的方法和属性那就糟糕了,这就是对类继承关系和内存分配理解不清晰导致的。好在c++增加了static_cast和dynamic_cast运用于继承关系类间的强制转化 一、static_cast和dynamic_cast使用方式 static_cast< new_type >(expression) dynamic_cast< new_type >(expression) 备注:new_type为目标数据类型,expression为原始数据类型变量或者表达式。 二、static_cast详解: static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型,用来强迫隐式转换如non-const对象转为const对象,编译时检查,用于非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。

C语言 sizeof()用法介绍

爱⌒轻易说出口 提交于 2019-12-05 19:08:20
本文 转自https://www.cnblogs.com/huolong-blog/p/7587711.html 1. 定义 sizeof是一个操作符(operator)。 其作用是返回一个对象或类型所占的内存字节数。 2. 语法 sizeof有三种语法形式: 1) sizeof (object); //sizeof (对象) 2) sizeof object; //sizeof 对象 3) sizeof (type_name); //sizeof (类型) 对象可以是各种类型的变量,以及表达式(一般sizeof不会对表达式进行计算)。 sizeof对对象求内存大小,最终都是转换为对对象的数据类型进行求值。 sizeof (表达式); //值为表达式的最终结果的数据类型的大小 举例: int i; sizeof(int); //值为4 sizeof(i); //值为4,等价于sizeof(int) sizeof i; //值为4 sizeof(2); //值为4,等价于sizeof(int),因为2的类型为int sizeof(2 + 3.14); //值为8,等价于sizeof(double),因为此表达式的结果的类型为double char ary[sizeof(int) * 10]; //OK,编译无误 1. 基本数据类型的sizeof 这里的基本数据类型是指short

C++之利用typedef定义函数指针

[亡魂溺海] 提交于 2019-12-05 18:53:10
进入正文:   代码简化 , 促进跨平台开发的目的.  typedef 行为有点像 #define 宏,用其实际类型替代同义字。  不同点:typedef 在 编译时被解释 ,因此让编译器来应付 超越预处理器能力的文本替换 。 用法一: typedef int (*MYFUN) (int, int) ; 这种用法一般用在给 函数定义别名 的时候 上面的例子定义 MYFUN 是一个 函数指针 , 函数类型是带两个int 参数, 返回一个int 在 分析 这种形式的定义的时候可以用下面的方法: 先去掉typedef 和别名 , 剩下的就是原变量的类型. 去掉typedef和MYFUN以后就剩: int (*)(int, int) 用法二: typedef给变量类型定义一个 别名 . typedef struct{ int a; int b; } MY_TYPE ; 这里把一个未命名结构直接取了一个叫MY_TYPE的别名, 这样如果你想定义结构的实例的时候就可以这样: MY_TYPE tmp; 第二种用法:typedef 原变量类型 别名 简单的函数指针的用法 //形式1:返回类型(*函数名)(参数表) char(*pFun)(int); // typedef char(* pFun )(int) //跟上一行功能等同 /*typedef的功能是 定义新的类型 。第一句就是

C语言笔记--传递结构指针以及值传递,址传递

。_饼干妹妹 提交于 2019-12-05 18:00:01
#include <stdio.h> #include <windows.h> #include <mmsystem.h> #include <string.h> typedef struct _accoutn { char *name;//定义用户名 char *bankName;//定义银行名称 double limit;//定义银行卡额度 double Nowmoney;//定义现在银行卡金额 }Account; double Getload(const Account *a){ return(a->limit - a->Nowmoney);//定义欠款金额的算法 } int main() { Account p1; /*printf("请输入您的账户名:", *p1.name);*/ p1.name = "胡66"; p1.bankName = "招商银行"; p1.limit = 30000; p1.Nowmoney = 20000;//初始化信息,方法1。 /*Account p2; 这种定义变量,再赋值会报错,具体原因我还不清楚,看来自己定义的数据类型还是和系统自定义的数据类型有些不同! p2={ "小王","农业银行",50000,10000 }*/ Account p2 = { "小王","农业银行",50000,10000 };//初始化信息方法2 printf

C语言学习——初见指针

坚强是说给别人听的谎言 提交于 2019-12-05 15:44:14
在很久以前就听说指针这个东西,并且传言非常难以理解,未见其型,先问其名。但是,好像也没什么特殊的地方。 指针   指针是存放变量地址的变量。   由此我们可以知道了,指针存放的是变量地址且只能应用于内存中对象,指针本身也是一个变量。但是指针不仅仅可以存储变量地址,还可以是其他例如函数指针。 C语言程序运行时,内存主要分为这几个部分 只读存储区———存储程序本身的机器码和常量 静态存储区————全局变量和静态变量 动态存储区————堆和栈 好像和要说的指针关系不是很大。 指针声明   指针使用 [类型关键字] [变量名] 这样的方式进行定义。eg:int *a;定义了一个指针,指针名叫a,可以存储任意int型变量的地址。类型关键字是指针所指内存存储的数据类型。   现在来认识两个一元操作符& *,&是取地址运算符,作用是返回变量的地址。*是简介寻址运算符,返回操作数指定地址的值。在我用的c语言程序设计教材里面并没有详细介绍这两个操作符。   认识了这两个操作符,现在我们可以来进行一些操作了,如下代码;      int a,c; //定义变量a,c int *b; //定义指针b a = 1; //现在a=1 b = &a; //b指向a c=*b; //c现在等于1 *b = 5; //a现在等于5 b = & c; //b现在指向c *b = 0; // c现在等于0