c语言指针

C++进阶之三:类型安全和STL

喜你入骨 提交于 2019-12-23 08:41:34
不要动态地处理数组 这里主要有两个意思: 不用支持动态地基类的指针进行++、+n这种操作,因为它实际会按基类大小进行偏移计算,而非预期地按照子类的大小进行偏移计算; 2.尽量在接口中使用引用而非指针,原因就在于期望清楚地表面所讨论的是一个对象,而不是对象数组; 不要使用失效对象 经常容易忽略的失效对象包括: 语义失效对象:指向已删除对象的虚悬(dangling)指针 失效的迭代器:比如,在迭代器所指向的容器开始插入之后的vector<T>::iterator i 不要使用不安全的C语言的遗留函数: strcpy\sprintf 的缓冲区都没有检查范围;strncpy\snprintf 虽然检查缓冲区界限,但是到达缓冲区界限时却不添加null。因此都是不安全的 不要使用可变长参数(...) C++ 中可变长参数的缺点包括: 缺乏类型安全性。 省略号本质是告诉编译器:关闭所有的检查,从此由我接管,启动reinterpret_cast 调用者和被调用者存在紧密耦合; 类类型对象的行为没有定义; 参数的数量未知 不要使用联合重新解释表示方式 比如一个联合中有一个long 类型的成员和一个指针类型的成员,给指针赋值,然后通过long读取其地址,这样会有问题: 不同架构和编译器中sizeof(long)可能不等于sizeof (char *) 减少了代码的可读性; 不要用memcpy 复制对象

第11课 - 新型的类型转换

大城市里の小女人 提交于 2019-12-23 02:38:10
一、C方式的强制类型转换 C语言的强制类型转换的代码如图1所示: 图1 C语言方式强制类型转换存在的问题 过于粗暴;任意类型之间都可以进行转换,编译器很难判断其正确性。 难于定位;在源代码中无法快速定位所有使用强制类型转换的语句。 二、C++的新式类型转换 C++将强制类型转换分为4种不同的类型。如下图所示; 图2 4种强制类型转换的详细介绍如下: (1)static_cast强制类型转换:用于基本类型间的转换;不能用于基本类型指针间的转换;用于有继承关系类对象之间的转换和类指针之间的转换。 (2)cosnt_cast强制类型转换:用于去除变量的只读属性;强制转换的目标类型必须是指针或引用。 (3)reinterpret_cast强制类型转换:用于指针类型间的强制转换;用于整数和指针类型间的强制转换。 (4)dynamic_cast强制类型转换:用于有继承类型的类指针间的转换;用于有交叉关系的类指针间的转换;具有类型检查的功能;需要虚函数的支持。 三、小结 C方式的强制类型转换 过于粗暴; 潜在的问题不易被发现 不易在代码中定位 新式类型转换以C++关键字的方式出现 编译器能够帮助检查潜在的问题 非常方便的在代码中定位 支持动态类型识别(dynamic_cast) 来源: CSDN 作者: 划清界限 链接: https://blog.csdn.net

第四周周报

▼魔方 西西 提交于 2019-12-22 21:38:19
第四周周报 一,上周工作总结 接着学习了指针的相关知识点,但是都是一些基本知识,深入了解还不够, 指针代码不熟练,应该多敲,下周应该好好看视频,加深理解 复习了其他专业课知识, 没有复习前端的知识 二,本周学习收获 C语言学习到了指针,把课本知识全部看完了,但是没有实战,代码部分还需要好好加强 复习了高数,把课本的重要知识点过了一遍,打算下周再看看做过的作业,考过的卷子 工图复习了一小部分,简单图会画,但是比较复杂的就不太会 下面是这周总结的C语言指针部分自己需要好好理解的例题 《一》: 二分查找 例如此题:设已有一个10个元素的整形数组a,且按值从小到大有序排列,输入一个整数x,然后在数组中查找x,如果找到,输出对应下标,否则,输出“Not Found” 《二》: 关于指针自增自减讲解 《三》: pta有关字符串的问题 #include<stdio.h> int main(void) { char str[]= "abc\0def\0ghi", *p=str; printf("%s", p+5) ; return 0; }//str是一个字符串数组 //\0代表一个字符,要注意 //p指向了str的第一个字符,p+5则是指向了第6个字符:也就是'e' //然后printf("%s", p+5)就是从p+5指向的字符开始输出,一直到遇到'\0'为止,所以最后的输出是 :ef

数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

不打扰是莪最后的温柔 提交于 2019-12-22 05:32:25
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结构图文解析之:树的简介及二叉排序树C++模板实现. 数据结构图文解析之:AVL树详解及C++模板实现 数据结构图文解析之:二叉堆详解及C++模板实现 1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的 有限序列 。线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继。 数据结构中常见的线性结构有数组、单链表、双链表、循环链表等。线性表中的元素为某种 相同 的抽象数据类型。可以是C语言的内置类型或结构体,也可以是C++自定义类型。 2. 数组 数组在实际的物理内存上也是连续存储的,数组有上界和下界。C语言中定义一个数组: 数组下标是从0开始的,a[0]对应第一个元素。其中,a[0]称为数组a的下界,a[6]称为数组a的上届。超过这个范围的下标使用数组,将造成 数组越界错误 。 数组的特点是: 数据连续,支持快速随机访问。 数组分为固定数组与动态数组。其中固定数组的大小必须在编译时就能够确认,动态数组允许在运行时申请数组内存。复杂点的数组是多维数组

C语言博客作业05-指针

百般思念 提交于 2019-12-22 03:26:45
1.本章学习总结  1.1思维导图  1.2本章学习体会及代码量  1.2.1学习体会  1.2.2代码量 2.PTA总分  2.1截图PTA中函数题目集的排名得分  2.2我的总分 3.PTA实验作业  3.1PTA题目1 判断回文字符  3.1.1算法分析 bool palindrome 定义 数组长度 立count 头和尾用指针循环判断 如果头指针 的值等于尾指针的值则 count++ 计数 最后 判断count是否与数组长度相等 是则 返回 true  3.1.2代码截图  3.1.3PTA提交列表及说明 4.大作业 来源: https://www.cnblogs.com/zrjAIRON/p/10128660.html

C++多态性与虚函数

情到浓时终转凉″ 提交于 2019-12-22 00:51:33
  派生一个类的原因并非总是为了继承或是添加新的成员,有时是为了重新定义基类的成员,使得基类成员“获得新生”。面向对象的程序设计真正的力量不仅仅是继承,而且还在于允许派生类对象像基类对象一样处理,其核心机制就是多态和动态联编。 (一)多态性   多态是指同样的消息被不同的对象接收时导致不同的行为。所谓消息是指对类成员函数的调用,不同的行为是指的不同的实现,也就是调用了不同的函数。 1)多态的分类   广义上说,多态性是指一段程序能够处理多种类型对象的能力。在C++中,这种多态性可以通过重载多态(函数和运算符重载),强制重载(类型强制转换),类型参数化多态(模板) ,包含多态(继承与虚函数)四种方式来实现。类型参数化多态和包含多态称为一般多态性,是用来系统地刻画语义上相关的一组类型;重载多态和强制多态性称为特殊多态性,用来刻画语义上无关连的类型间关系。   C++中采用虚函数实现包含多态。虚函数为C++提供了更为灵活的多态机制,这种多态性在程序运行时才能够确定,因此虚函数是多态性的精华,至少含有一个虚函数的类称为多态类。包含多态在面向对象的程序设计中使用很频繁。 2)静态联编   联编又称为绑定,就是将模块或函数合并在一起生成可执行代码的处理过程,同时对每个模块或函数分配内存地址,对外部访问也提供正确的内存地址。   在编译阶段就将函数实现与函数调用绑定起来称为静态联编

C:字符数组和字符指针

依然范特西╮ 提交于 2019-12-21 14:20:33
   C语言中没有string类型,字符串都是通过char字符数组来存储的   char * str = "Hello" (字符指针)   char str[6] = "Hello" (字符数组)   char line[10] = "Hello"  编译器编译后数组长度为6,自动生成\0都是{'H','e','l','l','o','\0'}   当用char *str 初始化字符串数组之后,该数组为只读数组(实际上是const常量,不可修改),在代码段中,不可以对其修改,如s[0] = ‘s’,否者报错      char * str = "Hello" 等价于char * str;  str = "Hello"   当用char str[6]初始化字符串数组之后,该数组是可以修改的      只能使用 char str[6] = "Hello",不可以char str[6];  str[6] = "Hello"     如果要构造字符串,用数组      如果要处理字符串,用指针    char *表示的是字符串或者是单个字符   要写入字符串数组,要开辟新的空间(以后补充)          对于逃逸字符,可以使用//来输出 字符串的输入和输出   char string[8];   scanf("%s",&string);   printf("%s",string);  

C/C++中函数指针的含义

帅比萌擦擦* 提交于 2019-12-21 14:19:15
函数存放在内存的代码区域内,它们同样有地址,我们如何能获得函数的地址呢?    如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址。    定义一个指向函数的指针用如下的形式,以上面的test()为例: int (*fp)(int a);//这里就定义了一个指向函数的指针   函数指针不能绝对不能指向不同类型,或者是带不同形参的函数,在定义函数指针的时候我们很容易犯如下的错误。 int *fp(int a);//这里是错误的,因为按照结合性和优先级来看就是先和()结合,然后变成了一个返回整形指针的函数了,而不是函数指针,这一点尤其需要注意!   下面我们来看一个具体的例子: #include < iostream > #include < string > using namespace std; int test( int a); void main ( int argc , char * argv []) { cout <<test<<endl; //显示函数地址 int (*fp)( int a); fp=test; //将函数test的地址赋给函数学指针fp cout <<fp(5)<<"|"<<(*fp)(10)<<endl; //上面的输出fp(5),这是标准c++的写法,(*fp)(10

c语言中指针常见的错误

∥☆過路亽.° 提交于 2019-12-21 07:09:53
指针使用在c/c++中 指针在c/c++中非常强大 但是初学者使用经常带来一些错误 以下整理博主自己在开发过程中 存在的一些错误点 // 1. 存储数据时,越界 void test01 ( ) { // 1. 数组操作越界 char name [ ] = "googleyst" ; printf ( "%c" , name [ 100 ] ) ; // 2. 指针不断操作导致越界 char my_str [ ] = "hello world" ; char * p_str = ( char * ) malloc ( 64 ) ; for ( int i = 0 ; i <= strlen ( my_str ) ; ++ i ) { * p_str = my_str [ i ] ; p_str ++ ; } free ( p_str ) ; } // 2. 返回局部变量的地址 int * test02 ( ) { int a = 10 ; return & a ; } // 3. 多次释放指针指向的空间 void test03 ( ) { char * p = malloc ( sizeof ( char ) * 64 ) ; free ( p ) ; free ( p ) ; } // 4. 悬挂指针(野指针) void test04 ( ) { char * name =

C语言指针变量的长度

风格不统一 提交于 2019-12-21 03:03:41
#include <stdio.h> int main() { /********************************************* * * 指针的长度:不同机器可能不同,但是指针变量的长度都是一样的 * **********************************************/ int a = 10; int *pi = &a; printf("int类型指针的长度:%d\n",sizeof(pi)); double b = 10; double *pd = &b; printf("double类型指针的长度:%d\n",sizeof(pd)); float f = 10; float *pf = &f; printf("float类型指针的长度:%d\n",sizeof(pf)); char c = 10; char *pc = &c; printf("char类型指针的长度:%d\n",sizeof(pc)); return 0; } int类型指针的长度:4 double类型指针的长度:4 float类型指针的长度:4 char类型指针的长度:4 来源: https://www.cnblogs.com/heml/p/3530151.html