码迷,mamicode.com
首页 > 编程语言 > 详细

指针和数组

时间:2019-05-11 18:18:07      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:code   constexpr   假设   运算   整数   变量   引用   过程   转换   

对数组的元素使用取地址符就能得到指向该元素的指针:

    string nums[] = {"one","two","three"};//数组的元素是string对象
    string* p = &nums[0];//p指向nums的第一个元素

编译器自动讲数组名字替换为一个指向数组首元素的指针:

    string* p2 = nums;//等价于p2 = &nums[0]

当数组作为一个auto变量的初始值时,推断得到的类型是指针而非数组:

    int ia[] = {0,1,2,3,4,5,6,7,8,9};//ia是一个含有10个整数的数组
    auto ia2(ia);//ia2是一个整型指针,不能用int值给指针赋值
    ia2 = 42;//错误:ia2是一个指针,不能用int值给指针赋值

使用ia作为初始值执行初始化的过程:

    auto ia2(&ia[0]);//ia2的类型是int*

decltype(ia)返回的类型是由10个整数构成的数组:

    //ia3是一个含有10个整数的数组
    decltype(ia) ia3 = {0,1,2,3,4,5,6,7,8,9};
    ia3 = p;//错误:不能用整型指针给数组赋值
    ia3[4] = i;//正确:把i的值赋给ia3的一个元素

指针也是迭代器

允许使用递增运算符将指向数组元素的指针向前移动到下一个位置上:

    int arr[] = {0,1,2,3,4,5,6,7,8,9};
    int* p = arr;//p指向arr的第一个元素
    ++p;//p指向arr[1]

获取尾元素之后的那个不存在的元素的地址:

    int* e = &arr[10];//指向arr尾元素的下一位置的指针

尾后指针不指向任何元素,不能对尾后指针执行引用或递增的操作。

输出arr的全部元素:

    for (int *b = arr; b != e; ++b)
        cout << *b << endl;

标准库函数begin和end

将数组作为begin和end函数的参数:

    int ia[] = {0,1,2,3,4,5,6,7,8,9};//ia是一个含有10个整数的数组
    int *beg = begin(ia);//指向ia的首元素的指针
    int *last = end(ia);//指向arr尾元素的下一个位置的指针

begin函数返回指向ia首元素的指针,end函数返回指向ia尾元素下一位置的指针,这两个函数定义在iterator头文件中。

假设一个整型数组,找到arr中的第一个负数:

    //pbeg指向arr的首元素,pend指向arr尾元素的下一位置
    int* pbeg = begin(arr), * pend = end(arr);
    //寻找第一个负值元素,如果已经检查完全部元素则结束循环
    while (pbeg != pend && *pbeg >= 0)
        ++pbeg;

指针运算

给一个指针加上(减去)某整数值,结果仍是指针。新指针指向的元素与原来的指针相比前进了(后退了)该整数值个位置:

    constexpr size_t sz = 5;
    int arr[sz] = {1,2,3,4,5};
    int *ip = arr;//等价于int *ip=&arr[0]
    int* ip2 = ip + 4;//ip2指向arr的尾元素arr[4]

给指针加上一个整数,得到的新指针仍需指向同一数组的其他元素,或者指向同一数组的尾元素的下一位置:

    //正确:arr转换成指向它首元素的指针;p指向arr尾元素的下一位置
    int* p = arr + sz;//使用警告:不要解引用
    int* p2 = arr + 10;//错误:arr只有5个元素,p2的值未定义

和迭代器一样,两个指针相减的结果是它们之间的距离,参与运算的两个指针比必须指向同一个数组当中的元素:

auto n = end(arr) - begin(arr);//n的值是5,也就是arr中元素的数量

两个指针相减的结果的类型是ptrdiff_t的标准库类型,定义在cstddef头文件中的机器相关的类型,差值是一种带符号类型。

只要两个指针指向同一个数组的元素,或者指向该数组的尾元素的下一位置,就能利用关系运算符对其进行比较,遍历数组中的元素的方式:

    int* b = arr, * e = arr + sz;
    while (b<e)
    {
        //使用*b
        ++b;
    }

两个指针指向不相关的对象,则不能比较它们:

    int i = 0, sz = 42;
    int* p = &i, *e = &sz;
    //未定义的:p和e无关,因此比较毫无意义
    while(p<e)
  • p是空指针,允许给p加上或减去一个值为0的整型常量表达式
  • 两个空指针相减的结果为0

指针和数组

标签:code   constexpr   假设   运算   整数   变量   引用   过程   转换   

原文地址:https://www.cnblogs.com/suomeimei/p/10849375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!