指针

嵌入式开发之C基础学习笔记06--数组和指针(非常重要,难点)

非 Y 不嫁゛ 提交于 2020-03-15 21:50:14
C语言进阶学习 数组 1)数组的使用 2)字符串(String):数组(尤其是一维数组)最常用的地方——————>C语言中字符串就是一维数组 数组: 定义:具有相同类型的数据的有序集合,并用唯一的名字来标识。 1)数组必须直接声明,编译器在编译阶段为其分配内存空间 2)C89数组必须是定长的,数组的大小在编译时是固定的;C99允许使用变长数组,数组的大小在运行时确定 void f(int longeur,int wide) { int matrix[longeur][wide];/*定义一个矩阵*/ /*数组的长度由两个参数决定*/ } 3)数组的所有元素占连续的内存空间,在内存中是线性(顺序)存放的,保存数组所需要的内存空间直接与基本类型和数组长度有关。 数组占用的内存空间 = sizeof(基类型)*数组长度 4)C不检查数组是否越界,程序可以在两边越界。程序员应自己加入越界检查。数组可以越界使用,但是初始化时不允许! 5)向函数传递数组: 定义数组形参的方法有三种:指针,定长数组,无尺寸数组 void func1(int *a){...} void func2(int a[10]){...} void func3(int a[]){...} 在函数的形参的声明中,数组尺寸无所谓,因为C语言没有边界检查 实际上,第二种方法在编译后,编译器产生的代码就是让函数接受指针

指针知识(八):函数指针

霸气de小男生 提交于 2020-03-15 11:42:14
c++允许对指向函数的指针进行操作。它的一个重要使用是把一个函数作为参数传给另一个函数。 声明一个函数指针像声明一个函数原型一样,不过函数名 前面 插个符号 * , 然后用()扩起来。 #include <iostream> #include <string> using namespace std int addition (int a, int b) {return (a + b) ;} int subtraction (int a, int b) {return (a - b) ;} int operation(int x, int y, int (*func) (int ,int)) {   int g;   g = (*func)(x, y);   return g; } int main() {   int m, n;    int (*mins)(int, int) = subtraction;   m = operation(7, 5, addition);   n = operation(20, m, mins);   cout<<n<<'\n';   return 0; } 输出:8 上面的例子中,mins是指向函数的指针,有两个 int 类型的参数,它被直接初始化指向 subtraction : int (*mins)(int, int) =

C++ 关于用指针修改const的值

二次信任 提交于 2020-03-15 10:49:55
在C++中,const值是不能被修改的,但是我们经常试着用指针去修改const的值, 今天写了一个小程序,觉得很神奇~~ 如图所示,i是一个int型的常量,初始值为0,我们用int型的指针j指向i,然后修改j指向地址的值,使之为5; 然后我们可以看这个程序的结果: 可以看到(*j)的值,改变了,并且j所指向的地址和i的地址是同一个地址,但是i的值竟然还是没有变化,是0, 明明是同一个地址,为什么会有不同的值? 最有趣的是,cout<<*(((&i)+2)-2)<<endl;的值依旧没有改变,取到i的地址,将其变化后指向原来的地址,结果还是没有变化,那么存放j所指向地址的内容5又放在哪里了呢? 网上说C++对于const是用一种类似与宏的原理来处理的,编译器只要看到i,就会将其付为初始值,先暂且这么理解吧! 还是理解得不是很透彻。 后来LZ在人人上发了条状态,竟然有人说我运行的结果不对,后来才发现这个问题是和编译器相关的, 在VS下,cout<<*(((&i)+2)-2)<<endl;的结果是5,与GNU C++的编译器结果不同,看来这是编译器优化的结果,编译器的作用还是挺大的! 来源: oschina 链接: https://my.oschina.net/u/171154/blog/58243

第九课 智能指针

爷,独闯天下 提交于 2020-03-15 10:19:40
  智能指针在开发中无处不在,智能指针就是用C++模板技术实现的一个类。 智能指针历史:为了解决内存泄漏 使用智能指针: 智能指针的设计方案: 通过类模板描述指针的行为   能够定义不同类型的指针对象 重载指针特征操作符(->和*)   利用对象模拟原生指针的行为 对象在生命周期结束的时候会调用析构函数,然后在析构函数中主动的释放堆空间 C++原生语言里面不存在智能指针,我们需要自己创建智能指针。 下面我们开始正式的编写可复用库的程序,开发环境为Qt creator,首先给出智能指针的程序如下: 1 #ifndef SMARTPOINTER_H 2 #define SMARTPOINTER_H 3 4 namespace DTLib 5 { 6 7 template <typename T> 8 class SmartPointer 9 { 10 protected: 11 T *m_pointer; 12 13 public: 14 SmartPointer(T *p = NULL) 15 { 16 m_pointer = p; 17 } 18 19 SmartPointer(const SmartPointer<T>& obj) 20 { 21 m_pointer = obj.m_pointer; 22 23 const_cast<SmartPointer<T>&>(obj)

[.net 面向对象编程基础] (7) 基础中的基础——流程控制语句

旧街凉风 提交于 2020-03-15 08:33:08
[.net 面向对象编程基础] (7) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些 , 本节参考了网上朋友所写的例子,为的是让更多小伙伴学习,提高,加薪,如有版权问题,请邮件我,我第一时间处理。 语句:是程序中的小指令,本节主要以流程控制语句为主要内容。 流程控制语句中最常用的三个是 选择语句(即条件语句)、循环语句和异常处理语句 流程控制语句分类: 类别       关键字                       选择语句       if 、 else 、 switch 、 case 循环语句       do 、 for 、 foreach 、 in 、 while 跳转语句       break 、 continue 、 default 、 goto 、 return 异常处理语句     throw 、 try-catch 、 try-finally 检查和未检查语句   checked 、 unchecked 非保护和固定语句   unsafe 、 fixed 锁定语句       lock 1. 条件语句 1.1 if - else if (expression){}else{}, 其中 expression 是一个布尔类型, true 则执行第一区块, false 则执行 else 部分

作业10总结

痞子三分冷 提交于 2020-03-14 15:43:42
一、知识点总结: 1、指针变量的定义: 1)一般形式为: 类型名: *指针变量名; ※在定义指针变量时,应注意以下几点: ①类型名指定指针变量所指向变量的类型,必须是有效的数据类型)。 ②定义多个指针变量时,每一个指针变量前面都必须加上*。 ③指针变量的类型不是指指针变量本身的类型,而是指它所指向的变量的数据类型。 ④无论何种类型的指针变量,他们都是用来存放地址的。 ⑤在定义指针变量时需要使用指针声明符*,但指针声明符并不是指针的组成部分。例如,定义int=*p; 说明p是指针变量,而不是*p。 2)指针的赋值: 指针变量被定义后,必须将指针变量和一个特定的变量进行关联后才可以使用。即,应先赋值再使用(赋的值为地址)。 假设有定义 int i,*p; /*下面的语句可以对指针变量p赋值*/ p=&i; p=0; p=NULL; p=(int*)1732; 2、几种指针表达式: *p:指针变量p所指向的变量。 如表达式*p=*p+1、++*p、(*p)++,都是将指针p所指向变量的值加1、 而表达式*p++等价于*(p++),先取*p的值作为表达式的值,再将指针p的值加一,运算后,p不在指向当前变量。 3、说明: (1)当p=&a后,*p与a相同。 (2)int *p;定义指针变量p *p=10;指针p所指向的变量,即a。 (3)&*p与&a相同,是地址 *&a与a相同,是变量 4

ofstream和ifstream详细用法

狂风中的少年 提交于 2020-03-14 15:42:12
ASCII和二进制文件的输入输出 First : 包含头文件#include <fstream> ASCII输入:   首先要创建一个in-stream对象:ifstream fin("input.txt");    逐词读取: fin>>num>>s;        读取过程中遇到空白符,>>操作符就会停止读取内容,知道遇到另一个>>操作符。    逐行读取: fin.getline(sentence, num);        第一个参数用来接受char数组;第二个参数是在遇到换行符之前,数组允许接受的最大元素数量。 ASCII输出:   首先声明一个ofstream-fout类对象( 打开 文件):ofstream fout("output.txt");    操作举例:     int num = 150;     char name[] = "John Doe";     fout << "Here is a number: " << num << "/n";     fout << "Now here is a string: " << name << "/n";    关闭文件 (自动保存文件),或者回写文件缓冲(保持文件打开的情况下保存文件):     fout << flush; fout.close(); 二进制输入输出:    声明: 不再使用插入(<<

使用JavaScript浅谈列表

佐手、 提交于 2020-03-14 15:30:43
什么是列表? 列表是一组有序的数据。每个列表中的数据项称为元素。在JavaScript中,列表中的元素可以是任意类型的数据。列表中可以保存多少元素没有确定,实际使用时元素的数量受到程序内存的限制。 现在我们来抽象一下列表的抽象数据类型定义 listSize(属性):列表中的元素个数 pos(属性):列表中的元素当前可访问的位置(位置指针) length(方法):返回列表中元素的个数 clear(方法):清空列表中的所有元素 toString(方法):返回列表的字符串形式 getElement(方法):返回列表当前可访问位置对应的元素 insert(方法):在现有元素后面插入新元素 append(方法):在列表的末尾添加新元素 remove(方法):从列表中移除元素 front(方法):将列表的当前位置移动到第一个元素 end(方法):将列表的当前位置移动到最后一个元素 prev(方法):将列表的当前位置前移一位 next(方法):将列表的当前位置后移一位 hasNext(方法):判断列表在当前位置是否还有一下个元素 hasPrev(方法):判断列表在当前位置是否还有上一个元素 currPos(方法):返回列表的当前位置 moveTo(方法):将列表的当前位置移动到指定位置 上面抽象了列表的数据类型,包括要使用到的属性和方法,下面使用代码来实现一个列表类: // 定义列表类

Chapter6双指针,BFS和图论

风流意气都作罢 提交于 2020-03-14 15:20:30
Chapter6 双指针,BFS和图论 双指针 1.日志统计 1238 经典的双指针模板题 所谓双指针其实就是针对多重循环的一种优化方式,缩小时间复杂度以确保不会TLE 循环的是一个时间段 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define x first #define y second using namespace std; typedef pair<int, int> PII; const int N = 1e5 + 10; int n, d, k; bool st[N]; int cnt[N]; PII rec[N]; int main() { cin >> n >> d >> k; for(int i = 0; i < n; i++ ) scanf("%d%d", &rec[i].x, &rec[i].y); sort(rec, rec + n); for(int i = 0, j = 0; i < n; i++ ) { int id = rec[i].y; cnt[id]++; while(rec[i].x - rec[j].x >= d) cnt[rec[j].y]--, j++;//优化循环 if(cnt[id] >= k) st[id] =

strtol函数

白昼怎懂夜的黑 提交于 2020-03-14 12:48:52
strtol是一个C语言函数,包含在头文件:#include <stdlib.h>,在c++中则是头文件<cstdlib> 作用就是将一个字符串转换为长整型long,其函数原型为: long int strtol (const char* str, char** endptr, int base); 参数 str是要转换的字符串 endptr是指向第一个不可转换的字符位置的指针 base为基数,表示转换成为几进制的数 返回值 返回转换后的长整型数;如果不能转换或者 str 为空字符串,那么返回 0(0L);如果转换得到的值超出 long int 所能表示的范围,函数将返回 LONG_MAX 或 LONG_MIN(在 limits.h 头文件中定义),并将 errno 的值设置为 ERANGE。 注意 base的值必须是2和36(含)之间或者是特殊值0。 当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,遇到 '0' 前置字符则会使用 8 进制转换。 如果base的值为2到36,则将字符串转换为base的值所对应的进制的整数。 若endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。 strtol()