C++学习札记20140313

来源:互联网 发布:云计算有哪些特征 编辑:程序博客网 时间:2024/05/17 20:08

指针和数组

在一些情况下数组的操作实际上是指针的操作,这一结论有很多隐含的意思。其中一层意思是当使用数组作为一个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是不定长度的容器,所以要设置一个结束标志,暂设为 -1cin >> 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