`
xml
  • 浏览: 8218 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++学习笔记--数据类型

    博客分类:
  • C++
阅读更多
每天花点时间,重新拾起C++,记录一些学习笔记,内容根据自己理解逐步更新。

1.指针

我们最熟悉的,一个字节由8位构成,一个字由32位构成,这是针对32位操作系统,其实字的大小是依赖于机器的,C++基本数据类型,int/short/long/float/double/long double长度都是以字为单位,如short为半个字,int为一个字,double是两个字,具体它们能代表多少位数据,能存储多大范围的值就需要根据操作系统环境而定。

文字常量是不可寻址的,变量可以。根据一个例子学习指针和地址的存储空间变化。

#include "iostream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	/* ival为整型变量 */
	/* pi指向ival地址 */
	/* ppi指向pi地址,即指针的指针 */
	/* *ppi为pi指针所指向的值 */
	int ival = 1024;
	int *pi = &ival;
	int **ppi = π

	cout << "The value of ival\n"
		<< "direct value: " << ival << "\n"  //1024
		<< "indirect value: " << *pi << "\n" //1024
		<< "double indirect value: " << **ppi << "\n" //1024
		<< "value of *ppi: " << **ppi << "\n" //1024
		<< endl;
	/* pi地址加2个单位,对整形变量而言,地址值增加2×4字节=8 */
	pi = pi + 2;
	cout << pi;

	return 0;
}


2.字符串

C风格的字符串和标准C++ string类型,前者是作为标准C++一个部分的标准C库,后者是标准C++提供的string类,主要描述C风格的字符串。

字符串为空的定义:
char *pc1 = 0;
char *pc2 = "";


C风格字符串的字符指针总是指向一个相关联的字符数组,通过自增可以前进到终止空字符之后,这个地方容易出错。
#include "iostream"
using namespace std;
const char *st = "The expense of spirit\n";
int _tmain(int argc, _TCHAR* argv[])
{
	int len = 0;
	while ( *st++ )
		++len;
        /* st指针前进到字符串终止空字符之后 */
        /* len长度为字符串长度加1 */
	st = st - len;
        /* 输出内容为"he expense of spirit" */
	cout << len << ": " << st;
	return 0;
}


可以单独增加一个指针计算st长度
const char *p = st;


由于字符指针的底层特性,使得用它表示字符串容易出错,因此C++标准库提供了字符串类抽象的一个公共实现,要使用string类型,必须包含头文件
#include "string"


3.const关键字

“试图将一个非const对象的指针指向一个常量对象”的动作都将引起编译错误,const对象的地址只能赋值给指向const对象的指针,但是指向const对象的指针可以被赋以一个非const对象的地址。

注意这三者区别:
/* 指向double类型的,定义成const对象的指针 */
const double *pc = 0;
const double minWage = 9.60;
pc = &minWage;
/* 指向int类型的const指针 */
int errNumb = 0;
int *const curErr = &errNumb;
/* 指向double类型的,定义成const对象的const指针 */
const double pi = 3.14159;
const double *const pi_ptr = &pi;


这段代码:
using namespace std;
const int ival = 1024;
const int *const &pi_ref = &ival;
int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}


如果这样定义就会出错:
const int *&pi_ref = &ival;


定义int*为T,上面的代码等价于:
const T &pi_ref = &ival;


编译器会这样来处理这段赋值计算:
T temp;
temp = &ival;        
const T &pi_ref = temp;


这里temp是"int *"类型,编译器不能强制把"const int *"转变为"int *"类型,原程序没有问题,是因为编译器这样处理了,定义"const int *"为T:
T temp;
temp = &ival;        
T const &pi_ref = temp;


这样就解决了之前类型不匹配的赋值问题。

4.数组

非const的变量不能被用来指定数组的维数,这是初学C语言时会犯的错误之一。C++不能在编译时刻或运行时刻对数组下标进行范围检查,因此即使程序能够通过编译并执行,但仍可能存在错误。

ia[ 1, 2 ]在C++中是合法的,但"1,2"是一个逗号表达式,因此它等价于ia[2]。

定义数组
int ia[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };


ia、&ia[0]是等价的,ia+1、&ia[1]是等价的,可以通过指针实现数组的遍历:

#include "iostream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	int ia[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
	int *pbegin = ia;
	int *pend = ia + 9;
	while ( pbegin != pend ) {
		cout << *pbegin << ' ';
		++ pbegin;
	}
	return 0;
}


5.vector容器

使用vector需要添加头文件vector,vector有两种不同形式:数组习惯和STL习惯。

数组习惯
vector<int> ivec(10);//与int a[10]类似

STL习惯
vector<string> text;

6.typedef

为内置的或用户定义的数据类型引入助记符号,例如:
typedef vector<int> vec_int;
vec_int vec1(10);//与vector<int> vec1(10);一样


typedef可以用来增强“复杂模板声明的定义”的可读性,增强“指向函数的指针”以及“指向类的成员函数的指针”的可读性。

/* cstr类型非"const char *" */
/* const修饰cstr类型,cstr是一个指针 */
/* cstr是一个指向字符的const指针 */
typedef char *cstring;
extern const cstring cstr;


用typedef可以方便地定义大量pair类型的对象:
typedef pair<string, string> Authors;
Authors joyce("james", "joyce");
Authors musil("robert", "musil");
if (joyce.first == "james" && joyce.second == "joyce")
    /* 满足if条件,处理相关任务 */


7.volatile

volatile修饰符的用法和const类似,主要目的是提示编译器,该对象的值可能在编译器未检测到的情况下被改变,因此编译器不能武断的对引用这些对象的代码作优化处理。

参考书籍:《C++ Primer》第三版
分享到:
评论

相关推荐

    C++学习笔记--函数

    **C++学习笔记--函数** 在C++编程中,函数是一种可重用的代码块,它执行特定的任务并可能接收参数、返回值或两者都有。本笔记将深入探讨C++中的函数,包括它们的定义、调用、参数传递以及如何在实际编程中有效地...

    c++学习笔记精华版

    ### C++ 学习笔记精华版 #### 一、C++ 语言概述 **1、历史背景** - **C++ 的江湖地位** - Java、C、C++、Python、C# 是当前主流的编程语言之一,而 C++ 在这些语言中以其高效性和灵活性著称。 - **C++ 之父 ...

    C++学习笔记-后台服务程序开发模式.doc

    服务的安装涉及到`installService`函数,它会将服务的元数据添加到系统服务数据库中。相反,`removeService`函数用于删除服务的安装记录,从而卸载服务。 服务的类型有很多种,例如: - **SERVICE_FILE_SYSTEM_...

    C++ 学习笔记 整理

    这份"C++学习笔记"涵盖了C++的基础到高级概念,旨在帮助初学者和有一定经验的程序员深入理解并掌握C++。 在C++的学习过程中,以下几个关键知识点是不可或缺的: 1. **基础语法**:C++起源于C语言,因此它保留了...

    C++笔记--你一定用的上

    ### C++笔记 -- 整型数据与字符类型详解 #### 整型数据 整型数据在C++中占据着非常重要的地位,它们用于表示没有小数部分的数值。C++支持多种类型的整型数据,包括有符号整型和无符号整型。 ##### 1. **有符号...

    c++学习笔记.pdf

    标题中的"C++学习笔记.pdf"表明文档是一份关于C++语言的学习记录。C++是一种广泛使用的编程语言,由Bjarne Stroustrup在1980年代初开发,它是一种静态类型、编译式、通用编程语言。C++支持多范式编程,包括过程化、...

    C++学习笔记.doc

    【C++ 学习笔记】深入理解编程与C++基础 C++是一种强大的、面向对象的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统以及许多高性能应用。学习C++不仅仅是掌握语法,更重要的是理解编程的核心概念,以便更好...

    【C++学习笔记】一份详细的学习笔记,让你轻松掌握C++编程!

    【C++学习笔记】这份详尽的资源是为那些希望深入了解C++编程语言的人们精心准备的。C++是一种强大的、通用的编程语言,它的设计理念是面向对象,同时支持过程化编程,使得它在系统软件、应用软件、游戏开发、设备...

    我的笔记-qt-c++-c#-后面持续更新.7z

    这个压缩包显然包含了作者在这些主题上的学习笔记,可能是教程、代码示例、问题解决方案或者个人心得。 【描述】"只要是我的一些笔记,关于qt,c#,C++的,用来做个备份,防止本地不小心删掉了" 说明了这些笔记的主要...

    C++学习笔记.pdf

    - **数据类型之间的转换**:当从较小的数据类型向较大的数据类型赋值时,通常是安全的;反之可能会导致数据丢失。 - **运算符**:C++支持多种运算符,包括算术运算符、比较运算符、逻辑运算符等。 - **布尔运算**...

    c++学习笔记(个人学习时做的笔记)

    【C++学习笔记概述】 C++是一门强大的编程语言,其在C语言的基础上进行了扩展,引入了许多现代化的特性。这份笔记主要涵盖了C++的基础知识,包括C++11和C++17的新特性,旨在帮助初学者理解C++的核心概念。 ### C++...

    谭浩强C++学习笔记(1-6章)

    《谭浩强C++学习笔记(1-6章)》主要涵盖了C++语言的基础知识,包括数据类型、运算符和表达式。以下是这些章节的主要内容: 1. **数据类型**: - `char` 类型有两种,有符号和无符号。无符号 `char` 范围是 0 到 ...

    C++学习笔记.docx

    C++学习笔记 本文档提供了C++语言的基础知识,包括输入输出、变量、数据类型、运算符、内存管理、指针、流程控制语句等。 输入输出 C++语言提供了多种输入输出方式,包括使用cin和cout对象。cin对象用于从标准...

    达内C++培训笔记--适合于初学者,简单好用

    - **类** 是一个用户定义的数据类型,它封装了数据(成员变量)和方法(成员函数)。 - **对象** 是类的一个实例。 - 文件中的 `Bank` 类实现了银行账户的基本功能,如创建账户、存款、取款等。 #### 3. 编译单元和...

    c++ -- stl 学习笔记

    这篇学习笔记将深入探讨STL的核心概念、主要组件以及其在实际编程中的应用。 首先,STL的核心概念是容器、迭代器、算法和函数对象。容器是STL提供的一系列数据结构,如vector(动态数组)、list(双向链表)、set...

    C++整理笔记word版——01 C++学习笔记

    以上内容涵盖了C++编程的基础知识,包括基本的语法元素、数据类型、运算符和控制结构。学习这些概念是成为C++程序员的第一步。在实际编程中,还需要理解类、对象、继承、多态等面向对象编程的概念,以及函数、模板、...

Global site tag (gtag.js) - Google Analytics