C++学习札记20140313

指针和数组

在一些情况下数组的操作实际上是指针的操作,这一结论有很多隐含的意思。其中一层意思是当使用数组作为一个auto变量的初始值时,推断得到的类型是指针,而非数组

int iA[] = {0, 1, 2, 3, 4, 5};

auto iA2(iA);//iA2是一个整形指针,指向iA的第一个元素,等于auto iA2(&iA[0]), 显然是一个int*指针

iA2 = 4;//错误iA2是一个指针,不能用int值给指针赋值

必须指出当使用declytype关键字时上述转换不会发生,decltype(iA)返回的类型是由6个int整数构成的数组:

decltype(iA) iA3 = {0, 1, 2, 3, 4, 5};//iA3是一个含有6个整数的数组

int *p = NULL;

iA3 = p;//错误 不能用整形指针给数组赋值

iA3[3] = 9;//可以把整数赋值给iA3的一个元素

指针也是迭代器

vector和string的迭代器支持的运算,数组的指针全部支持。
通过数组名字或数组中首元素的地址都能得到指向首元素的指针,不过要获取尾后指针就要用到数组的另外一个特殊性质,我们可是设法获取数组尾元素之后的那个并不存在的元素地址
int *ip = &iA[6];//指向数组尾元素的下一个位置的指针
这里显然使用下表运算符索引了一个不存在的元素,不存在的这个元素唯一的用处就是提供它的地址用于初始化指针ip,就像尾后迭代器一样,尾后指针不指向任何元素,不能对尾后指针解引用或者递增操作
for(int *ib = iA; b != ip; ++b)
cout << *ib << ' ';//输出数组的元素
标准库函数begin和end两个函数能够得到首指针和尾后指针 
调用形式
int ia = {1,2,3};
int *beg = begin(ia);//指向首元素指针
int *last = end(ia);//指向尾元素下一个位置的指针
特别注意:尾后指针不能执行解引用和递增操作

指针运算

const int sz = 5;
int arr[sz] = {1, 3, 5, 8, 13};
int *ip = arr; //等价于 *ip = &arr[0]
int *ip2 = ip +4; // *ip2 = &arr[4];
int *ip3 = ip+sz; // 不能解引用
int last = *(arr +4);//等价于last = a[4]
int clast = *arr +4;//等价于clast = arr[0]+4
int i = arr[2];//arr转换成指向数组首元素的指针,arr[2]得到(arr+2)所指的元素
int *p = arr;
i = *(p+2);//等价于i = arr[2] 
内置的下表运算符不是无符号类型,它可以处理负数,这与vector和string不同
#include <iostream>
#include <string>
#include <vector>
#include <cctype>

using namespace std;

int main()
{
	int arr[5] = {1, 2, 3, 4, 5};
	int *p = arr;
	int *p2 = arr+4;
	int *p3 = arr+5;	//使用警告 不能解引用
	int *p4 = p+4;
	int *p5 = p+5;	//不能解引用
	int *p6 = p+10;	//编译器不能发现此类错误,越界
	cout << "p = " << p <<endl;
	cout << "arr = " << arr <<endl;
	cout << "&arr[0] = " << &arr[0] <<endl;
	cout << endl;
	cout << "*p = " << *p << endl;
	cout << "arr[0] = " << arr[0] <<endl;
	cout << endl;
	cout << "p2 = " << p2 <<endl;
	cout << "&arr[4] = " << &arr[4] <<endl;
	cout << endl;
	cout << "*p2 = " << *p2 << endl;
	cout << "arr[4] = " << arr[4] <<endl;

	return 0;
}

//判断两个数组是否相等
#include <iostream>
#include <string>
#include <vector>
#include <cctype>

using namespace std;

int main()
{
	const int arrSize = 5;
	int arr1[arrSize], arr2[arrSize];
	int i = 0;
	//用两个for循环来控制输入的数组
	for (i = 0; i != arrSize; ++i)
	{
		cin >> arr1[i];
	}
	for (i = 0; i != arrSize; ++i)
	{
		cin >> arr2[i];
	}
	//判断两个数组是否相等
	for (i = 0; i != arrSize; ++i)
	{
		if (arr1[i] != arr2[i])
		{
			cout << "Not Equal!" << endl;
			return 0;
		}
	}
	cout << "Yes Equal" <<endl;
	return 0;
}
//判断两个输入的vector是否相等,使用迭代器访问vector中的元素20140313
#include <iostream>
#include <string>
#include <vector>
#include <cctype>

using namespace std;

int main()
{
	const int FLAG = -1;
	vector<int> iVec1, iVec2;
	int ival;
	//vector是不定长度的容器,所以要设置一个结束标志,暂设为 -1
	cin >> ival;
	while (ival != FLAG)
	{
		iVec1.push_back(ival);
		cin >> ival;
	}
	for (vector<int>::size_type i = 0; i != iVec1.size(); ++i)
	{
		cout << iVec1[i] << ' ';
	}
	cout << endl;
	cin >> ival;
	while (ival != FLAG)
	{
		iVec2.push_back(ival);
		cin >> ival;
	}
	for (vector<int>::size_type i = 0; i != iVec2.size(); ++i)
	{
		cout << iVec2[i] << ' ';
	}
	cout << endl;
	if (iVec1.size() != iVec2.size())
	{
		cout << "vector length is not equal" << endl;
		return 0;
	}
	else if (iVec1.size() == iVec2.size())
	{
		for (vector<int>::iterator iteriVec1Beg = iVec1.begin(), iteriVec2Beg = iVec2.begin();
				iteriVec1Beg != iVec1.end();
				++iteriVec1Beg, ++iteriVec2Beg)
		{
			if (*iteriVec1Beg != *iteriVec2Beg)
			{
				cout << "Not Equal! element is not equal" << endl;
				return 0;
			}
		}
		cout << "Equal!" << endl;
		return 0;
	}
}
#include <iostream>
#include <string>

using namespace std;

const int strSize = 80;
int main()
{
	char *str1, *str2;
	str1 = new char[strSize];
	str2 = new char[strSize];
	if (str1 == NULL || str2 == NULL)
	{
		cout << "No Enugh Memory" << endl;
		return -1;
	}
	cin >> str1;	//这里的输入字符串str1是以什么为结束标志的,str1为什么可以自动加
	cin >> str2;
	int ret;
	ret = strcmp(str1, str2);
	if (ret > 0)
	{
		cout << str1 << " is bigger" << endl;	//str1为什么可以输出全部字符串,它的指针也没有自加啊,他又不是string类型的
	}
	else if (ret < 0)
	{
		cout << str2 << " is bigger" << endl;
	}
	else
	{
		cout << "Equal" << endl;
	} 
	delete[] str1;
	delete[] str2;
	return 0;
}
//3.42将一个含有整数元素的vector对象拷贝给一个整型数组
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;

const int strSize = 80;
int main()
{
	const int ArrSize = 5;
	int iArray[ArrSize];
	int iArr[] = {1, 2, 3, 4, 5};
	vector<int> iVec(begin(iArr), end(iArr));	//iVec被初始化成iArr的元素值
	int index = 0;
	for (vector<int>::iterator it = iVec.begin(); it != iVec.end(); ++it)	//用迭代器对vector访问
	{
		iArray[index++] = *it;
	}
	for (int i = 0; i < ArrSize; i++)
	{
		cout << iArray[i] << ' ';
	}
	cout << endl;
	return 0;
}
//用下标和指针输出二维数组的元素
//用类型别名来代替循环控制变量的类型
//用auto关键字
//用范围for语句 C++11新标准
#include <iostream>
#include <string.h>
#include <vector>

using namespace std;

const int strSize = 80;
int main()
{
	const int rowCnt = 3;
	const int colCnt = 4;
	int iArray[3][4] = {
		{9, 13, 15, 16},
		{18, 21, 22, 23},
		{25, 27, 29, 32}
	};
	//用下标运算输出二维数组元素
	for (int i = 0; i < rowCnt; ++i)
	{
		for (int j = 0; j < colCnt; ++j)
		{
			cout << iArray[i][j] << '	';
		}
		cout << endl;
	}
	cout << endl;
	//用指针来输出二维数组的元素
	for (int (*p)[4] = iArray; p != iArray + 3; ++p)
	{
		for (int *q = *p; q != *p +4; ++q)
		{
			cout << *q << '	';
		}
		cout << endl;
	}
	cout << endl;
	//用类型别名来代替循环控制变量的类型,VS2010不支持C++11新标准
	// using int_array = int [4];//新标准和下一句的typedef表达的是一个含义
	typedef int int_array[4];
	for (int_array *p = iArray; p != iArray + 3; ++p)
	{
		for (int *q = *p; q != *p + 4; ++q)
		{
			cout << *q << '	';
		}
		cout << endl;
	}
	cout << endl;
	//使用auto关键字
	for (auto p = iArray; p != iArray + 3; ++p)
	{
		for (auto q = *p; q != *p + 4; ++q)
		{
			cout << *q << '	';
		}
		cout << endl;
	}
	cout << endl;
	//使用decltype关键字
	return 0;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值