• 指针数组和数组指针


    【C++】指针数组和数组指针

    首先的首先,稍微抱怨一下阿里今天的严重失误。说好的晚六点笔试,说好的务必提前半小时到场。六点十五的时候告诉闷在一个大教室里躁动的我们“今天七点半开考,大家先回去吧,七点半再过来”,满脸黑线…等到七点半,嗯,没消息…等到八点,嗯,继续没消息…等到八点半,嗯,还是没消息…约八点四十通知,今天不考了,大家回去吧。。。点点点有木有,三个多小时啊~嗯,淡定,大家都不容易。不过今晚北京的天着实不错,也总算还是有点美好的事物的。((⊙o⊙)…呃,现在应该说是昨天了…)

     

     

    然后的然后,今天科普吧。很简单的问题,关于指针的。

     

    用变量a给出下面的定义。

     

    (1)一个整型数(An integer)

     

    (2)一个指向整型数的指针(A pointer to an integer)

     

    (3)一个指向指针的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

     

    (4)一个有10个整形数的数组(An array of 10 integers)

     

    (5)一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)

     

    (6)一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

     

    (7)一个指向函数的指针,该函数有一个整形参数并返回一个整型数(A pointer to a function that takes an integer as an integer argument and returns an integer)

     

    (8)一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数(An array of 10 pointers to functions that take an integer argument and return an integer)

     

    答案:

     

    (1) int a; // An integer

     

    (2) int *a; // A pointer to an integer

     

    (3) int **a; // A pointer to a pointer to an integer

     

    (4) int a[10]; // An array of 10 integers

     

    (5) int *a[10]; // An array of 10 pointers to integers

     

    (6) int (*a)[10]; // A pointer to an array of 10 integers

     

    (7) int (*a)(int); // A pointer to a function that takes an integer as an integer argument and returns an integer

     

    (8) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

     

     

    是很简单吧。主要想说的是 5 和 6,可能之前不怎么用到,总是分不清楚,这次在《程序员面试宝典》上看到了,就正好做个总结。

     

    其实要记也不难,6 用一个括号把 * 和 a 括起来,就当 * 离 a 近,表示 a 是一个指针,指向什么呢,指向的是一个数组,数组包含 10 个整型数。

     

    5 没用括号,就当 a 离 [] 近,表示 a 是一个数组,数组里面存了什么呢,存的是指向整型数的指针。

     

    (题外:

     

    这让我想起了之前的一个笔试题,也科普一下好了:

     

    Please choose the right statement about const usage:

     

        A. const int a; //const integer 

     

        B. int const a; //const integer 

     

        C. int const *a; //a pointer which point to const integer 

     

        D. const int *a; //a const pointer which point to integer 

     

        E. int const *a; // a const pointer which point to integer 

     

    答案应该是:ABC

    const* 常量指针(按顺序翻译),即常量的指针,一个指向常量的指针;

    *const 指针常量(按顺序翻译),即指针的常量,指针本身是一个常量。

    和在 int 前后没关系,只看 const 和 * 的相对位置即可,所以 A 和 B 是一样的,C 和 D 是一样的。 

    另外,const 在声明的时候要同时初始化,之后不能修改,所以其实上面的选项作为一行代码编译都是不过的……

     

    下面回到正题)

     

     

    比如下面一段程序

     

    复制代码
     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     int v[2][10] = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}};
     7     int (*a)[10] = v;
     8     cout << **a << endl;
     9     cout << **(a+1) << endl;
    10     cout << *(*a+1) << endl;
    11     cout << *(a[0]+1) << endl;
    12     cout << *(a[1]) << endl;
    13     return 0;
    14 }
    复制代码

     

    输出是:1    11    2    2    11。

     

    本题定义一个指针指向一个 10 个 int 元素的数组。a+1 表明 a 指针向后移动 1*sizeof(数组大小);a+1 后共向后移动 40 个字节。 *a+1 仅针对这一行向后移动 4 个字节,如下图。

     

     

     

    本来是昨天要发的,结果昨天有事写了一半推迟到现在才写完……

     

    今天还遇到了一个这样的相关问题,以后再讲吧。

     

     

     

     

     

     
    标签: C++笔试题

  • 相关阅读:
    洛谷 P2888 [USACO07NOV]牛栏Cow Hurdles
    洛谷 P2935 [USACO09JAN]最好的地方Best Spot
    CODEVS 1172 Hankson 的趣味题
    洛谷 P2261 [CQOI2007]余数求和
    洛谷 P1463 [POI2002][HAOI2007]反素数
    洛谷 P3383 【模板】线性筛素数
    1.4.2 solr字段类型--(1.4.2.1)字段类型定义和字段类型属性
    HttpSolrServer-采用静态工厂方法,创建HttpSolrServer单实例
    将字符转换为unicode码
    solrj-WiKi
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3323387.html
Copyright © 2020-2023  润新知