C++复习15.指针知识

4.指针知识
     在Tencent 笔试和面试中都考到了 C/C++中的指针知识,因为自己很不喜欢使用指针,所以才开始学习 Java的,但是现在看来还是躲不掉的,所以这里总结一下指针的知识。
     指针涉及到了数组的问题,一个很容易混淆的知识就是“指针数组”和“数组指针”。
     指针数组,顾名思义,他本身就是一个数组,什么的数组呢?存放的是指针的数组。相对的数据指针,落脚点在指针上,它是一个指向数组的指针。举个例子说明一下:
    int * p[2]; 声明了一个数组,数组的类型是 int类型的指针,也就是说这个数组里面存放的是 int型的指针。表示为 int* p[]是一个更好地理解方式。
     相对应的 int (*p)[2];则是数组的指针,定义了一个指针,指向一个数组。
     因为[] 运算的优先级要高于 *,所以我们需在声明数组指针的时候,使用 ().
     数组指针,也成为行指针, int (*p) [n], p是一个指针,指向一个整形的一维数组,而且这个一维数组的长度是 n,其中 n就是 p的步长,也就是说当 p执行 p+1的时候, p要跨越 n个整形数据的长度。那么,这种数组指针,每一个指针指向的是一个数组,当执行 +1操作之后,指向的是另一个数组,所以一般在多数组中使用。
    int a[3][4]; int (*p)[4]; 声明一个数组指针,指向含有 4个数据的数组;
    p=a; 将二位数组的首地址赋给 p,也就是 &a[0];
     执行完p++;则 p指向的是 a[1] ,所以数组指针也称指向一维数组的指针,亦称行指针。
    个 int 类型的数组,我们看一下他的大小。
    cout<< 位机上是 4Byte
    cout<<  如果是改成 int (*pb)[5];则 sizeof(*pb) =20 = 4*5,他是该数组的大小。
    int arr[3][4]; 其中sizeof(arr) = 48 , 是整个数组的大小。
    cout << "arr size: " << sizeof(arr) << endl; //48
    cout << "arr[0] size :" << sizeof (arr[0] )<< endl; //16
    cout << "arr is " << arr << endl; // 是数组的首地址
    cout << "*arr is " << *arr << endl;// 也是数组的首地址,两者相等
    cout << 
    cout << 
    cout << 
     对于一维数组:
    int arra[5] = {1,2,3,4,5};
    for(int i=0;i<5; i++){
        cout << *(arra+i) << " " ;
        
    } 输出真个数组,我们不可以对 arr进行修改,但是可以利用加减法取数据
     对于二维数组:
    cout << "使用 arr 运算输出整个数组"  << endl;
    for(int i=0;i<3;i++){
         for( int j=0;j<4;j++){
            cout << *(*(arr+i)+j)<< " "; arr + i是改变的行, ( *arr + j) 是列
        }
        cout << endl;
    }
    pb= arr ; 在这里arr是数组的首地址,也就是将二位数组的首地址赋给 p,也就是 arr[0] 或者&arr[0][0]
    cout << "   pb is " <<  pb << endl; // 数组的首地址
    cout << " *pb is " << *pb << endl; // 也是数组的首地址
    cout << "**pb is " << **pb<<endl; //是数组第一个元素
    cout << "size of pb " << sizeof (pb) << endl;// 4  指针的大小
    cout << 个整数的数组,数组的大小是 16, 所以对 pb++ 相当与指向下一行
    cout << "size of **pb " << sizeof (**pb) << endl; //数组中的值
 
       cout << "使用 pb指针输出数据" << endl;
    for(int i=0;i<3;i++){
         for( int j=0;j<4;j++){
            cout << *(*pb+j) << " ";
        }
        cout << endl;
        pb++; // 每加一次,指向的是下一行,指针 pb不可以随便操作,他指向的是是个 int [4] 的指针数组,
    }
 

C/C++ 复习知识 2013.09.13

C/C++ 复习知识 2013.09.13

前言:
    今天是参加西山居笔试,都是C/C++的东西,感觉笔试题还是很坑的,但是反映了自己的基础很差,所以先整理一下自己不会的C++知识.同时今天把实习的工作暂先辞去了,因为要准备找工作,所以未来的话,还是不去了,但是那边的实习交接还真是个麻烦的事情,希望Tibo那边尽量早点找到人来接受这一块的。
     在没节操一下:从公司回来的时候,老爸给我打电话,说“什么时候带个媳妇儿回来啊?人家谁谁带家一个媳妇儿回来”。是啊,也不知道为什么自己一直单身啊?之前三年的时间里,或许是因为心里一直装着一个人,也是因为自己明白自己想要的是什么,大学期间没有时间,但是今年过了21周岁的时候,心里渐渐地腾出了地方,自己也渐渐变得更加理性了。另外爱情是可遇而不可求的,所以只要我自己把状态调整好,做好准备,自然会遇到那个唯一的她,期待爱情中。话说今天还真是遇见好多漂亮的妹子,公交车上遇见一个特清纯的,宣讲会的时候也遇到好几个,算了,不YY了。复习C++了。
 
1.C C++ char []  
     char a[6] = "sd\0fg";
      cout << "strlen(a):" << strlen(a) << endl; 
      cout << "sizeof(a):" << sizeof (a) << endl;
     strlen 是一个函数,是在运行期间决定的,他遇到第一个\0结束计算其大小,返回的是字节数.
     我们使用字符指针的时候,声明一个字符串,默认会在后面加上一个\0, 使用sizeof的时候,会计算进去。
     char a[6] = "asdf"; strlen(a) = 4; 但是 strlen(a) = 6, sizeof 是计算内存的大小,这个是在编译期间决定的,初始化的时候a声明的是6个字节的大小。
  对于上面那种字符串char a[] = "as\0df"; sizeof (a) = 6, 后面还是会加上一个\0. 但是使用strlen计算长度的时候,就会遇到第一个\0为止,所以返回的是2。
  C C++  char * a ;
        char * b = "yangteng";
cout << "sizeof(b) :" << sizeof(b) << endl; //4
cout << "strlen(b) :" << strlen(b) << endl; // 8
cout << "sizeof(*b) : " << sizeof(*b) << endl; // 1 就是一个字符 
     这里的a 是一个指针,指向的是一个字符,类型是一个字符指针,所以sizeof(b) = 4 表示的是指针的大小;
 
 
 
char *str[]={"11111","22222","33333","44444","66"};
     char **    p=  str +  1;
     str[0]=(*  p++)  +2;
     str[1]=*(p+1);
     str[2]=p[1]+3;
     str[3]=p[0]+3;
     cout<<str[0]<<endl;
     cout<<str[1]<<endl;
     cout<<str[2]<<endl;
     cout<<str[3]<<endl;

C++复习15.指针知识的更多相关文章

  1. C语言复习:指针知识

    指针知识体系搭建 指针强化 指针是一种数据类型 指针也是一种变量,占有内存空间,用来保存内存地址 测试指针变量占有内存空间大小:sizeof(指针名); 2)*p操作内存 在指针声明时,*号表示所声明 ...

  2. C语言复习: 二级指针和多级指针

    二级指针内存模型建立 void main2() {     int i = 0;       //指针数组     char * p1[] = { "123", "456 ...

  3. c++面试题中经常被面试官面试的小问题总结(二)(本篇偏向指针知识)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10713204.html 1.利用指针交换两个字符串方法?(这题是我当年读大一的时候看到的,好怀 ...

  4. Java复习1.基本知识

    Java语言概述 20131003 开头语: 开发领域,重要的编程语言基本都是C/C++,然后就是Java, C/C++就不用说了,另外掌握Java对你是有很大的帮助的,而且也会扩宽你的择业范围.同时 ...

  5. [JS复习] JS 基础知识

    项目结尾,空闲时间,又把<JS 基础知识> 这本书过了一遍,温故知新后,很多知其然不知其所以然的内容 豁然开朗. [1. 用于范围的标签] display  :inline or bloc ...

  6. C/C++指针知识整理(一)

    1.指针(变量)的类型 把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型.这是指针本身所具有的类型. (1)int*ptr; //指针的类型是 int* (2) char*ptr;//指针 ...

  7. C++复习5.指针数组字符串

    C/C++ 指针.数组和字符串 本次学习指针.数组.字符串.引用的内存映像. 1.指针 指针的本质:可以执行的程序是由指令.数据和地址组成的.当CPU访问内存单元的时候,不论是读取还是写入,首先要把内 ...

  8. 指针知识梳理6-const与指针

    const 定义的变量为仅仅读变量.在语法层面上通过这个变量去改动内存是不同意的. 可是对于下面代码.就有非常多人绕了: const int  *p1;  //p1能变.*p1不能变 int cons ...

  9. IOS 杂笔-15(知识小点 readonly)

    readonly是我们并不陌生的属性. 但是他也有值得我们注意的地. 属性如其名-只读-也就是说我们只能读取-不能进行写操作 当我们尝试进行写操作时会如下 但是这并不意味着我们不可以改变其内部的属性 ...

随机推荐

  1. 受限的用户shell环境

    有些特殊情况下需要实现将系统内普通用户限定在指定目录下,并且只能使用系统管理员设定的命令.lshell就是实现这样功能的一个神器. lshell提供了一个针对每个用户可配置的限制性shell,lshe ...

  2. 论文笔记:OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks

    2014 ICLR 纽约大学 LeCun团队 Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, Yann ...

  3. java泛型的实现原理

    java泛型的实现原理是类型擦除.Java的泛型是伪泛型.在编译期间,所有的泛型信息都会被擦除掉.   Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节码中是不包含泛型中的类型 ...

  4. 在VS2015中用C++编写可被其它语言调用的动态库DLL

    转自:http://blog.csdn.net/songyi160/article/details/50754705 VS2015用C++创建动态库DLL步骤如下: (1)启动VS2015>文件 ...

  5. The mind

    Youtube励志红人Mateusz M,最近刚推出了网友期待已久最新励志短片<The mind>,短短一周播放量已近50万.来自波兰的他,年仅23岁,用自己擅长的蒙太奇,已创作十几个影响 ...

  6. mysql-community-server安装完后不知道root密码

    修改方法: service mysqld stop mysqld_safe --skip-grant-tables & mysql -u root use mysql; update user ...

  7. 《Java程序设计》实验1实验报告

    20145318 <Java程序设计>实验1实验报告 实验题目 通过对500个数据进行操作,实现快速排序.选择排序.直接插入排序算法时间复杂度的比较:并在排序数据中快速查找某一数据,给出查 ...

  8. Http中Get和Post的区别(转载)

    在B/S应用程序中,前台与后台的数据交互,都是通过HTML中Form表单完成的.Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可 ...

  9. MR案例:单表关联查询

    "单表关联"这个实例要求从给出的数据中寻找所关心的数据,它是对原始数据所包含信息的挖掘. 需求:实例中给出 child-parent(孩子—父母)表,要求输出 grandchild ...

  10. 解读:Hadoop序列化类

    序列化(serialization)是指将结构化的对象转化字节流,以便在进程间通信或写入硬盘永久存储. 反序列化(deserialization)是指将字节流转回到结构化对象的过程. 需要注意的是,能 ...