数组和指针 - 1【C++ Primer 学习笔记 - 第四章】

原创 2012年09月10日 23:09:47

与vector 类似,数组也是容器

数组的缺陷:

1、长度固定

2、没有size 操作,故,无法获取容器大小

3、没有push_back 操作,无法向其添加元素

4、无法更改数组长度,只能创建新的更大的数组,然后,将原数组复制到新数组。


数组维数,必须是大于1 的常量表达式。

也就是说,必须是在编译时,就知道的值。如:const unsigned buf_size = 512;

凡是在运行时才知道的值,都不能定义数组的维数。

const unsigned buf_size = 512, max_files = 20;
int staff_size = 27;

char input_buffer[buf_size];            // 正确, buf_size 是 const
string fileTable[max_files + 1];        // 正确, max_files+1 是常量表达式

const unsigned sz = get_size(); // 错误,get_size() 在运行时才知道,结果值
double salaries[staff_size]; // 错误,staff_size 非const
int test_scores[get_size()]; // 错误,同 get_size()
int vals[sz]; // 错误,同 get_size()


显示初始化数组:

// 显示初始化
const unsigned array_size = 5;
int iarr[array_size] = {0, 1, 2, 3, 4};

// 省略维数
int iarr2[] = {0, 1, 2, 3};

// 相当于:{1, 2, 3, 0, 0}
int iarr3[array_size] = {1, 2, 3};

// 相当于:{"aa", "bb", "cc", "", ""}
string sarr[array_size] = {"aa", "bb", "cc"};


特殊字符:

char ca1[] = {'C', '+', '+'};	// size: 3
char ca2[] = {'C', '+', '+', '\0'}; // size:4
char ca3[] = "C++";	// size:4,末尾自动添加 null


数组不可直接复制或者赋值

char ca1[] = {'C', '+', '+'};
char ca2[] = ca1;// 错误

vector 的下标类型: vector::size_type
数组
的下标类型    : size_t
数组下标超出正确范围,即,发生数组越界。将会产生严重错误。类似的安全问题,称为:缓冲区溢出

const unsigned array_size = 5;
int iarr1[] = {1, 2, 3, 4, 5};
int iarr2[array_size];

for(size_t i=0; i!=array_size; ++i)
	iarr2[i] = iarr1[i];

指针,&符号是:取地址操作符(address-of)

string s("This is a string");
string *sp = &s;
注:指针多数用于低级操作,容易产生错误,尽量少用。
而通过 vector 、迭代器等方式取代一般的数组、指针的使用。 使用 string 类型,取代 C 风格字符串。


指针定义、初始化

vector<int> *pvec;	
int *ip1, *ip2;		
string* sp1, sp2;	// sp1 是指针,而 sp2 只是 string

指针保存 0 值 或者 NULL ,表明不指向任何对象。(NULL 实际上等价于 0)
特殊的指针:void *     ,可以保存任何类型对象的地址

int ival = 1024;
int *pi = 0;
int *pi2 = &ival;
void *pi3 = pi2;
pi = pi2;


数组的算术操作。 *pi2、*pi3 结果相同,但, int *pi3 = iarr + 4 表述更直观。
指针作减法操作,结果是 ptrdiff_t 类型的数据。
使用下标访问数组时,实际上,是使用下标访问了指针

int iarr[] = {1, 2, 3, 4, 5};
int *pi = iarr;
int *pi2 = &iarr[4];
int *pi3 = iarr + 4;
ptrdiff_t n = pi3 - pi;
int i = *(iarr + 3); //  iarr[3], 4

int *pi4 = pi3 - 4;  //  &iarr[0]
int x = pi3[-4];     //  iarr[0]  equals to  pi3[-4]


// 指向数组的超出末端的地址,可以计算,不能解引用
int *ipend = iarr + 5;


指针是数组的迭代器

const size_t array_size = 3;
int iarr[array_size] = {1, 2, 3};
for (int *pbegin = iarr, *pend = iarr + array_size; pbegin != pend; ++pbegin)
	*pbegin = 100;

vector<int> ivec(10, 0);
for (vector<int>::iterator iter = ivec.begin(); iter!=ivec.end(); ++iter)
	*iter = 1;





指针和引用的区别

#include <iostream>
#include <string>
#include <bitset>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::bitset;

int main()
{
	int ival = 1024, ival2 = 2048;
	int *pi = &ival, *pi2 = &ival2;
	pi = pi2;
	*pi = 5000;
	cout << "pi:" << pi << ", pi2:" << pi2 << endl;
	cout << "*pi :" << *pi << ", *pi2 :" << *pi2 << endl;

	int &ri = ival, &ri2 = ival2;
	cout << *(&ri) <<endl;
	ri = ri2;
	cout << "ri:" << ri << ", ri2:" << ri2 << endl;
	cout << "&ri:" << &ri << ", &ri2:" << &ri2 << endl;	
	

	system("pause");
	return 0;
}


结果如下:




指向指针的指针

#include <iostream>
#include <string>
#include <bitset>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::bitset;

int main()
{
	int x = 10;
	int *pi = &x;
	int **ppi = &pi;

	cout << "x:" << x << endl;
	cout << "*pi:" << *pi << endl;
	cout << "**ppi:" << **ppi << endl;
	system("pause");
	return 0;
}

结果如下



数组和指针 - 2【C++ Primer 学习笔记 - 第四章】

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ primer 第四章--数组和指针

4.1 数组 (1)现代C++程序应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度是才在类实现的内部使用数组和指针。 (2)与vector类型相比,数组的显...
  • wo17fang
  • wo17fang
  • 2016年04月12日 11:20
  • 191

《c++ primer》第四章--数组和指针

数组是c++中类似于标准库vector类型的内置数据结构,与vector相似,数组也是一种存储单一类型对象的容器,其中每个对象没有单独的名字,而是通过它在数组中的位置对它进行访问。 与vector类型...
  • me1171115772
  • me1171115772
  • 2015年04月27日 19:45
  • 213

C/C++拾遗(一):关于数组的指针和数组元素首地址的一道经典题

代码如下:#include int main(void) { int a[5] = {1, 2, 3, 4, 5}; int *ptr = (int *)(&a+1); int *p1 =...
  • yanzi1225627
  • yanzi1225627
  • 2014年10月27日 23:00
  • 4455

c++ primer读书笔记-第四章 数组和指针

c++ primer读书笔记-第四章 数组和指针数组数组的定义和初始化数组的维数必须用值大于等于 1 的常量表达式定义int staff_size = 27; // nonconst double ...
  • u010560443
  • u010560443
  • 2015年06月29日 18:53
  • 394

《c++ primer》学习笔记 第四章 数组与指针

《c++ primer》第四章* 数组与指针  数组 数组是存储同类型数据的集合。数组的维数必须是在编译期可以确定的常量,如整型字面值常量、枚举常量或者是常量表达式中已经初始化的const...
  • leijferrari
  • leijferrari
  • 2014年05月10日 00:21
  • 469

C++ Primer 【第四版】第四章 数组和指针

第四章  数组和指针 习题4.1 假设get_size 是一个没有参数并返回int 值的函数,下列哪些定义是非法的? 为什么? unsignedbuf_size = 102...
  • jiangxinnju
  • jiangxinnju
  • 2014年08月10日 13:47
  • 798

C++基本知识(二)——vector与迭代器和数组与指针

C++基础知识(二)                           ——vector类型与迭代器和数组类型与指针 vector类型与数组类型比较 vector类型长度是动态...
  • imxiangzi
  • imxiangzi
  • 2015年11月14日 16:23
  • 1382

c/c++(疑4) 指针数组和数组指针之间关系

指针数组和数组指针概述(数组指针(指向数组的指针)与指针数组(存放指针的数组)) 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。 数...
  • u010236550
  • u010236550
  • 2015年05月08日 11:49
  • 2031

《C Primer Plus 》第六版 习题 第四章

【4.8.1】/**编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来**/#include int main() { char last_name[20]; ...
  • mr_pro
  • mr_pro
  • 2017年07月30日 15:27
  • 1449

C/C++二维数组名和二级指针

二维数组名不能赋值给二级指针,否则运行中可能会出现错误。
  • wu_nan_nan
  • wu_nan_nan
  • 2016年06月23日 11:53
  • 5777
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数组和指针 - 1【C++ Primer 学习笔记 - 第四章】
举报原因:
原因补充:

(最多只允许输入30个字)