指针和数组
在一些情况下数组的操作实际上是指针的操作,这一结论有很多隐含的意思。其中一层意思是当使用数组作为一个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;
}