二维数组传参

基本形式

二维数组在栈上分配,各行地址空间连续

定义的时候,拥有两种形式

第一种是指明行数和列数

1
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

阅读全文 »

指针

若现在指针不知道指向,可以使用NULL,例如int *b = NULL; char *a = NULL;,但是使用的时候若指针指向的是数组、字符串和结构体等,需要提前声明大小。若是int *,则不需要,直接将一个int类型的指针赋值给它即可。

c++中的*&对于初学者来说,确实有点让人搞懵。因为在变量的定义和调用时,*&都会表现出不一样的含义。

* 总结

定义一个指针的三种写法都对:1. int * p; 2. int* p; 3. int *p; 习惯不同而已
定义一个函数指针的三种写法都对:1. int *p(); 2. int * p(); 3. int* p();

阅读全文 »

.和->的区别

结构体

首先介绍一下C++中的结构。对于一个结构:

1
2
3
4
struct MyStruct
{
  int member_a;
};

如果有个变量MyStruct s,那么使用其中的成员元素时可以用:

1
s.member_a = 1;

如果采用指针方法访问,比如MyStruct * ps,那么同样的访问就必须使用如下形式:

1
(*ps).member_a = 1;

阅读全文 »

使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。

您可能需要存储各种数据类型(比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等)的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么。

基本的内置类型

C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型:

类型关键字
布尔型bool
字符型char
整型int
浮点型float
双浮点型double
无类型void
宽字符型wchar_t
阅读全文 »

二进制文件读写

所谓二进制文件和文本文件对于字母而言没有什么不同,都是存储该字母的ASCII码值。能引起不同的是数字和一些排版用符号的格式。

  • 数字在二进制文件中会存储该数字的值,而文本文件中则首先将该数字视为字符量,并按照ASCII码表转换为新的数字再存储;
  • 排版符号的一个例子是换行符,二进制文件只是一个换行符,文本文件中则是换行符加上回车符;

所以简单的区分方法是文本文件对每个字符都要做ASCII转换,而二进制文件只会对字母做必要的ASCII转换,对数字则是直接存储的。

下来我们来讨论如何真正的实现二进制文件的建立:
并不是我们所认为的在打开文件时设定ios::binary就可以,还要注意输出的函数:

阅读全文 »

强制类型转换、使用函数转换与memcpy

如果一个int型的变量值为5,则若使用强制类型转换或者使用memcpy,则相当于直接copy内存中的值,若打印,则会打印5对应的ASCII值;而若使用函数转换,则函数会操作内存转为ASCII值的5,若打印,则直接为5

memcpy在一定程度上相当于强制类型转换,但是可以制定拷贝的字节大小,因此可能不会出现丢失数据,如大于256的时候,int强制转char,复制低8位给char,其余舍弃

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


// 不足4个字节的前面补零
void int2char(int number, char* result, int length_send)
{
char str[20];
sprintf(str,"%4d",number); // 格式化输出int到str字符串

int i;
for(i=0;i<length_send;++i)
if(str[i]==' ')
str[i]=' ';
strcpy(result,str); // result 此时只有2个char的大小,但是仍然可以copy4个字节给他
}


// memcpy在一定程度上相当于强制类型转换,但是可以制定拷贝的字节大小,因此可能不会出现丢失数据,如大于256的时候,int强制转char。
int main(int argc, char const *argv[])
{
int num = 97;
printf("num:%d\n", num);
printf("\n");


/**********************************
强制类型转换与读取
**********************************/
char c = (char)num;
printf("c:%c\n", c);
printf("read_c:%d\n", (int)c);
printf("\n");


/**********************************
函数类型转换与读取
**********************************/
//char *d; //报错,需要声明大小
char *d = (char*)malloc(sizeof(char)*2);
//char d[24]; // 也行

int2char(num, d, 4); // 使用函数转换,不足4位的前面补零,事实证明此函数废的
printf("d_string:%s\t%d\n", d, (int)strlen(d));
int read_d = atoi(d); // 这个d前面补零与补零都可以
printf("read_d:%d\n", read_d);
printf("\n");

char *dd = (char*)malloc(sizeof(char)*2);
sprintf(dd, "%4d", num); //也行
printf("compare dd and d:if equal,then 0:%d\n", strcmp(dd,d));
int read_dd = atoi(dd); // 这个d前面补零与补零都可以解析
printf("read_dd:d%d\n", read_dd);
printf("\n");


/**********************************
memcpy类型转换与读取
**********************************/
char *e = (char*)malloc(sizeof(char)*4);
//char e[4];
memcpy(e,&num,sizeof(num)); //相当于强制类型转换
printf("e:%s\n", e);
int f;
memcpy(&f,e,sizeof(e)); //强制类型转换过来
printf("read_e:%d\n", f);

return 0;
}

运行结果为

阅读全文 »

C++11中引入了一个用于多线程操作的thread类

简单多线程示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <thread>
#include <Windows.h>

using namespace std;

void thread01()
{
for (int i = 0; i < 5; i++)
{
cout << "Thread 01 is working !" << endl;
Sleep(100);
}
}
void thread02()
{
for (int i = 0; i < 5; i++)
{
cout << "Thread 02 is working !" << endl;
Sleep(200);
}
}

int main()
{
thread task01(thread01);
thread task02(thread02);
task01.join();
task02.join();

for (int i = 0; i < 5; i++)
{
cout << "Main thread is working !" << endl;
Sleep(200);
}
system("pause");
}

输出:

阅读全文 »

CSV文件读写

CSV(Comma-Separated Values)即逗号分隔值,可以用Excel打开查看。由于是纯文本,任何编辑器也都可打开。与Excel文件不同,CSV文件中:

  • 值没有类型,所有值都是字符串
  • 不能指定字体颜色等样式
  • 不能指定单元格的宽高,不能合并单元格
  • 没有多个工作表
  • 不能嵌入图像图表

在CSV文件中,以,作为分隔符,分隔两个单元格。像这样a,,c表示单元格a和单元格c之间有个空白的单元格。依此类推。

不是每个逗号都表示单元格之间的分界。所以即使CSV是纯文本文件,也坚持使用专门的模块进行处理。Python内置了csv模块。先看看一个简单的例子。

阅读全文 »